[英]Gradle: MavenPublish for Apache XMLBeans generated jar
我有一個 Gradle 項目,它生成一個 XMLBeans 庫(Apache XMLBeans)。
這將通過在 gradle 腳本中調用 ant.xmlbean 來完成。
task createHmiProtocol {
doLast {
ant.taskdef(name: 'xmlbean', classname: 'org.apache.xmlbeans.impl.tool.XMLBean',
classpath: configurations.xmlbeans.asPath)
ant.xmlbean(
javasource: "1.5",
failonerror: "true",
fork: "yes",
optimize : "true",
memoryMaximumSize: "512M",
memoryInitialSize: "64M",
destfile: "$dist"+"/"+"$fileName"+".jar",
classpath: configurations.xmlbeans.asPath){
fileset(dir: src) {
include(name: '*.xsdconfig')
include(name: 'hmiprotocol.xsd')
}
}
}
}
此任務生成名為 hmiprotocol.jar 的 JAR 並放置在“dist”目錄中。
在構建 JAR 之后,我想將它發布到我們的 maven 存儲庫。
publishing {
publications {
mavenJava(MavenPublication) {
groupId groupIdDef
artifactId prjName
if (versionPropsFile.canRead()) {
def Properties versionProps = new Properties()
versionProps.load(new FileInputStream(versionPropsFile))
version = versionProps['VERSION_NAME']
}
from components.java
}
}
repositories {
maven {
credentials {
username 'abc'
password 'pwd'
}
url releaseRepo
}
}
}
當我執行此腳本時,將構建 hmiprotocol.jar,然后執行發布任務。 但是部署在我們的 maven 存儲庫中的 JAR 是空的。
在 doLast{} 中執行“出版物”任務不起作用。
我認為 mavenJava 塊中的“來自 components.java”是打擊點。 有沒有人建議我如何解決這個問題?
from components.java
部分主要用於src/main/java
中的項目。 您正在使用帶有doLast { }
的 Apache XMLBeans 動態生成項目,並將其放置在 Gradle 不知道的位置。
這可行,但不是最好的方法,因為 Gradle 無法“緩存” output,這將導致構建速度變慢。
進行生成的最佳方法是創建一個自定義任務類型,其中output是destfile
。 例如:
import org.gradle.api.DefaultTask;
import org.gradle.api.file.RegularFileProperty;
import org.gradle.api.model.ObjectFactory;
import org.gradle.api.tasks.OutputFile;
import org.gradle.api.tasks.TaskAction;
import javax.inject.Inject;
public class XmlBeansTask extends DefaultTask {
private final RegularFileProperty destFile;
@Inject
public XmlBeansTask(ObjectFactory objects) {
this.destFile = objects.fileProperty();
}
@OutputFile
public RegularFileProperty getDestFile() {
return destFile;
}
@TaskAction
public void generate() {
// Do work
}
}
然后只需將該任務注冊到您的項目並使用mavenJava
發布發布任務輸出:
val createHmiProtocol = tasks.register("createHmiProtocol", XmlBeansTask::class.java)
publishing {
publications {
named<MavenPublication>("mavenJava") {
artifact(createHmiProtocol)
}
}
}
以上內容未經測試,但希望能指導您。
我找到了解決這個問題的方法。
正如@Francisco Mateo 提到的,起初我創建了一個特定的任務來構建 XMLBeans JAR:
class XmlBeansTask extends DefaultTask {
@Input
private File destFile;
@Input
private String classpath;
@OutputFile
public File getDestFile() {
return destFile;
}
@TaskAction
public void generate() {
ant.taskdef(name: 'xmlbean', classname: 'org.apache.xmlbeans.impl.tool.XMLBean',
classpath: classpath)
ant.xmlbean(
javasource: "1.5",
failonerror: "true",
fork: "yes",
memoryMaximumSize: "512M",
memoryInitialSize: "64M",
destfile: destFile,
classpath: classpath){
fileset(dir: 'src') {
include(name: '*.xsdconfig')
include(name: 'hmiprotocol.xsd')
}
}
}
public void setDestFile(String destFile){
this.destFile = new File(destFile);
}
public void setClasspath(String classpath){
this.classpath = classpath;
}
}
然后我定義了任務參數:
dependencies {
xmlbeans 'org.apache.xmlbeans:xmlbeans:2.5.0'
xmlbeans 'org.apache.xmlbeans:xmlbeans-xmlpublic:2.5.0'
xmlbeans 'org.apache.xmlbeans:xmlbeans-xpath:2.3.0'
xmlbeans 'org.apache.xmlbeans:xmlbeans-qname:2.5.0'
implementation 'org.apache.xmlbeans:xmlbeans:2.5.0'
implementation 'org.apache.xmlbeans:xmlbeans-xmlpublic:2.5.0'
implementation 'org.apache.xmlbeans:xmlbeans-xpath:2.3.0'
implementation 'org.apache.xmlbeans:xmlbeans-qname:2.5.0'
implementation gradleApi()
}
task createHmiProtocol(type: XmlBeansTask){
dependsOn 'deleteDirectories'
destFile = 'hmiprotocol.jar'
classpath configurations.xmlbeans.asPath
}
在發布任務中,我定義了工件 ID:
publishing {
publications {
mavenJava(MavenPublication) {
groupId groupIdDef
artifactId prjName
artifact(createHmiProtocol.destFile)
}
}
repositories {
maven {
credentials {
username 'xyz'
password 'password'
}
url releaseRepo
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.