簡體   English   中英

Gradle:MavenPublish 為 Apache XMLBeans 生成 jar

[英]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,這將導致構建速度變慢。

進行生成的最佳方法是創建一個自定義任務類型,其中outputdestfile 例如:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM