从多模块gradle项目的子项目配置中的子项目中获取变量

问题描述 投票:4回答:1

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

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

在子过程中,我也尝试以下操作

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

gradle中有什么方法可以从子项目配置中的子项目中获取子项目的变量吗?

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

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

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

无法在附加属性扩展上获取属性'mainClassName',因为不存在

java gradle
1个回答
0
投票

要覆盖子项目的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)
© www.soinside.com 2019 - 2024. All rights reserved.