首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gradle: MavenPublish XMLBeans生成的jar

Gradle: MavenPublish XMLBeans生成的jar
EN

Stack Overflow用户
提问于 2020-06-10 09:25:41
回答 2查看 352关注 0票数 0

我有一个Gradle项目,它生成一个XMLBeans库(Apache XMLBeans)。

这将通过在gradle脚本中调用ant.xmlbean来完成。

代码语言:javascript
复制
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存储库。

代码语言:javascript
复制
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{}不能工作。

我认为,components.java块中的"from mavenJava“是命中点。有人建议我如何解决这个问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-07 12:56:59

我找到了解决这个问题的办法。

正如@Francisco所提到的,首先我创建一个特定的任务来构建XMLBeans JAR:

代码语言:javascript
复制
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;        
}
}

然后我定义了任务参数:

代码语言:javascript
复制
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:

代码语言:javascript
复制
publishing {
   publications {
       mavenJava(MavenPublication) {
            groupId groupIdDef
            artifactId prjName
            artifact(createHmiProtocol.destFile)
       }
   }
   repositories {
       maven {
            credentials {
                username 'xyz'
                password 'password'     
            }
            url releaseRepo
       }
   }
}
票数 0
EN

Stack Overflow用户

发布于 2020-06-10 14:28:39

from components.java部分主要用于src/main/java中的项。您正在使用Apache XMLBeans使用doLast { }动态生成项,并将其放置在不知道的位置。

这是可行的,但并不是最好的方法,因为Gradle无法“缓存”输出,这将导致更慢的构建。

实现该生成的最佳方法是创建一个自定义任务类型,其输出为destfile。例如:

代码语言:javascript
复制
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发布发布任务输出:

代码语言:javascript
复制
val createHmiProtocol = tasks.register("createHmiProtocol", XmlBeansTask::class.java)

publishing {
    publications {
        named<MavenPublication>("mavenJava") {
            artifact(createHmiProtocol)
        }
    }
}

以上都是未经测试的,但希望能指导您。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62300132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档