【问题标题】:Get variable from child project in subproject configuration in multi module gradle project从多模块gradle项目的子项目配置中的子项目获取变量
【发布时间】:2020-04-26 07:05:27
【问题描述】:

我有一个多模块 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.

在子流程配置中,我还有其他任务,我可以轻松地从每个 subproejct 以及 project.name 访问 proejct.version,并且运行良好,当我将 "Main-Class": project.mainClassName 更改为 "Main-Class": "i.hate.mylife.SoMuch" 时,脚本运行完美.

在子项目中我也尝试以下方法

def mainClassName = "..."
project.ext{
    mainClassName = "..."
}

gradle 有什么方法可以从 subproejct 配置中的 subproejcts 中获取 subproject 的变量吗?

在子项目配置中,我还尝试了以下操作:

project.ext.mainClassName
project.ext.get("mainClassName")

而且它们都不起作用,当我尝试运行它时,它说:

无法在额外的属性扩展上获取属性“mainClassName”,因为它确实如此 不存在

【问题讨论】:

  • 为什么两个嵌套subprojects
  • @ToYonos 复制粘贴错误
  • 你为什么这么讨厌自己的生活?
  • @AndrewTobilko 我已经尝试解决这个小问题好几个小时了,我已经阅读了文档、许多文章、示例项目,但仍然没有解决方案。
  • @AndrewTobilko 为什么这么残忍?我刚刚发现自己陷入了同样的境地:基于子项目属性,从根项目到所有子项目动态地做一些事情。应该是微不足道的,但就像 OP 我似乎无法做到。

标签: java gradle


【解决方案1】:

要覆盖子项目的 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)

【讨论】:

    猜你喜欢
    • 2021-09-09
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 2012-02-19
    • 1970-01-01
    相关资源
    最近更新 更多