Groovy 不推荐使用的动态属性:“0”;“档案名称”;关于;源集';战争'&引用;

Groovy 不推荐使用的动态属性:“0”;“档案名称”;关于;源集';战争'&引用;,groovy,gradle,Groovy,Gradle,我编写了gradle插件,它在应用时配置了一个war项目。我的问题涉及战争任务的配置。我想更改archiveName和类路径 class MyPlugin implements Plugin<Project> { void apply(Project project) { project.plugins.apply('war') // do something configureConfigurations(project)

我编写了gradle插件,它在应用时配置了一个war项目。我的问题涉及战争任务的配置。我想更改archiveName和类路径

class MyPlugin implements Plugin<Project> {
    void apply(Project project) {
        project.plugins.apply('war')
        // do something
        configureConfigurations(project)
        configureTask(project)
    }
    void configureTask(final Project project) {
        project.war {
            archiveName = "${project.war.baseName}.${project.war.extension}"
            classpath = project.sourceSets.main.runtimeClasspath - project.configurations.providedRuntime - project.configurations.earModuleRuntime - project.configurations.earLibRuntime
        }
        project.war {
            doFirst {
                // just generating the manifest file
            }
        }
    }

    void configureConfigurations(final Project project) {
        project.configurations {
            earModuleCompile
            earModuleRuntime.extendsFrom(earModuleCompile)
            earLibCompile
            earLibRuntime.extendsFrom(earLibCompile)
        }
    }
}
classmyplugin实现插件{
无效申请(项目){
project.plugins.apply('war')
//做点什么
配置配置(项目)
配置任务(项目)
}
无效配置任务(最终项目){
战争计划{
archiveName=“${project.war.baseName}.${project.war.extension}”
classpath=project.sourceset.main.runtimeClasspath-project.configurations.providedRuntime-project.configurations.earModuleRuntime-project.configurations.earLibRuntime
}
战争计划{
首先{
//正在生成清单文件
}
}
}
无效配置配置(最终项目){
project.configurations{
耳蜗
earModuleRuntime.ExtendFrom(earModuleCompile)
早期编译
earLibRuntime.extendsFrom(earLibCompile)
}
}
}
出于某种原因,gradle将first war块解释为一个源集。这就是为什么它在源集合“war”上创建一个名为archiveName和classpath的新属性。我可以用
project.war.archiveName
修复它。但我仍然不知道为什么第一个war块是源代码集,而第二个带有
doFirst
的块是任务集

使用此插件的构建文件只定义了对
earLibRuntime


如果有人能给我解释一下,那就太好了。

如果不知道上下文,就无法解释这一点。(常规版本甚至没有名为
war
的源代码集)您的插件是否应用了
war
插件?否则,它不能假定将有一个
war
任务。插件访问任务的一种更安全的方法是
project.tasks[“taskName”]
。很抱歉,没有看到这一行。是的,它应用了war插件,但它从未引入名为war的源代码集。我可以向你保证,没有任何事情会干扰战争的进行。很难想象。为了进一步研究,我需要一个独立的可复制的例子。好吧,我开始相信我可能会意外地添加一个源代码集war,但我仍然不知道在哪里。但即便如此,gradle为什么要在源代码集上调用
archiveName
?源代码集不是只能通过
project.sourceset.war
访问吗?是的。您的构建脚本或插件代码可能有问题。