我有一个多模的java项目,我想在子项目配置中创建jar(bin,source,javadoc)并且我无法获得变量。
这是根项目中的build.gradle文件:
subprojects {
/*...*/
jar {
manifest {
attributes(
"Implementation-Title": project.name,
"Implementation-Version": project.version,
"Implementation-Vendor": "XXX",
"Main-Class": project.mainClassName
)
}
include '**/**'
}
/*...*/
}
这是build.gradle文件的一个子项目:
version = '1.2.0-SNAPSHOT'
ext {
mainClassName = "..."
}
/*...*/
当我想运行构建脚本时,我得到以下异常:
无法获取未知属性' mainClassName'对于类型的对象 org.gradle.api.java.archives.internal.DefaultManifest。
在子流程配置中,我还有其他任务,我可以从每个子项目中轻松访问proejct.version以及project.name,并且运行良好,当我将"Main-Class": project.mainClassName
更改为"Main-Class": "i.hate.mylife.SoMuch"
时脚本运行得很好。
在子项目中,我也尝试以下
def mainClassName = "..."
project.ext{
mainClassName = "..."
}
在gradle中是否有任何方法可以从subproejct配置中的子项目中获取子项目的变量?
在子项目配置中,我还尝试以下操作:
project.ext.mainClassName
project.ext.get("mainClassName")
当他尝试运行它时,它们不起作用,它说:
无法获取属性' mainClassName'在额外的属性扩展上 不存在
答案 0 :(得分:2)
要覆盖子项目的build.gradle中的其他属性,必须将所需的任务(在本例中为jar task
)放在afterEvaluate
块中。
根项目build.gradle:
subprojects {
apply plugin: 'java'
apply plugin: 'application'
ext {
// the property that should be overridden in suproject's build.gradle
mainClassName = ''
}
afterEvaluate {
jar {
manifest {
attributes(
"Implementation-Title": project.name,
"Implementation-Version": project.version,
"Implementation-Vendor": "XXX",
"Main-Class": mainClassName
)
}
include '**/**'
}
}
}
子项目build.gradle:
mainClassName = 'project.specific.Main'
ext.set("mainClassName", mainClassName)