我有一个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{}不能工作。
我认为,components.java块中的"from mavenJava“是命中点。有人建议我如何解决这个问题吗?
发布于 2020-07-07 12:56:59
我找到了解决这个问题的办法。
正如@Francisco所提到的,首先我创建一个特定的任务来构建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
}
}
}发布于 2020-06-10 14:28:39
from components.java部分主要用于src/main/java中的项。您正在使用Apache XMLBeans使用doLast { }动态生成项,并将其放置在不知道的位置。
这是可行的,但并不是最好的方法,因为Gradle无法“缓存”输出,这将导致更慢的构建。
实现该生成的最佳方法是创建一个自定义任务类型,其输出为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)
}
}
}以上都是未经测试的,但希望能指导您。
https://stackoverflow.com/questions/62300132
复制相似问题