当前位置: 首页 > 知识库问答 >
问题:

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

娄嘉石
2023-03-14

我有一个多模块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 '**/**'
        }

    /*...*/
}

这就是建筑。gradle文件子项目之一:

    version = '1.2.0-SNAPSHOT'

    ext {
        mainClassName = "..."
    }
   /*...*/

当我想运行构建脚本时,我得到了以下异常

无法获取类型为org的对象的未知属性“mainClassName”。格雷德尔。应用程序编程接口。JAVA档案内部的默认舱单。

在子流程配置中,我还有其他任务可以轻松访问项目。来自每个子项目的版本也包括在内。名称,并且运行良好,当我更改一个“Main Class”:项目时。mainClassName“Main Class”:“i.hate.mylife.SoMuch”脚本运行得很好。

在subproejct中,我也尝试以下方法

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

gradle中是否有任何方法可以从SubEJB配置中的SubEJB获取SubProject的变量?

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

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

当我试着运行它时,它说:

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

共有1个答案

郭辉
2023-03-14

覆盖子项目生成中的额外属性。gradle您必须将所需的任务(在本例中是jar任务)放入afterEvaluate块中。

根项目构建。格雷德尔:

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)
 类似资料:
  • 是否可以设置子gradle项目的父项目。 在我的例子中,所有父子项目都位于文件层次结构中的同一级别。例如 > 代码 > /父项目 构建。格拉德尔 /child项目1 构建。格拉德尔 /子项目2 构建。格拉德尔 这里,项目1依赖于项目2,所以我将它们称为 也在我的设置中。gradle文件,我有 有了它,我可以从父项目文件夹运行任务,但单个任务不会从子项目运行。

  • 配置子项目 到目前为止你已经把ToDo项目根据功能拆分成多个模块,接下来可以用之前的方法来定义构建逻辑,下面有几点需要主要: 根目录和子目录使用相同的group和version属性值 所有的子目录都是Java项目需要Java插件来正常工作,所以你只需要在子项目中应用Java插件 web子项目是唯一一个依赖外部库的项目,它需要打包成WAR而不是JAR 子项目之间可以定义模块依赖 接下来你将学习如何定

  • 我按照以下指南将项目分为模块/子项目: https://docs.gradle.org/current/userguide/multi_project_builds.html 在主脚本中,我应用子项目的配置: 如果我从根build目录运行子项目build,这会很好: (成功构建

  • 问题内容: 我最近开始使用Gradle并替换了我现有的基于Maven的项目。过去我在使用Maven处理多模块构建时遇到很多问题。在处理多模块水龙头时,Gradle呼吸了新鲜空气,但还不是很完美。 我的项目有以下文件夹布局: 我遇到的问题是“ EnterpriseApp1”和“ ClientApplication”都依赖于CommonLib项目。我不知道如何配置“ EnterpriseApp1”构建

  • 我有一个Gradle多项目构建,看起来像这样: 我希望将目录< code>shared中的所有项目作为依赖项添加到< code>plugins中的所有项目。 更一般地说:我如何按目录配置子项目? settings.gradle的内容: build.gradle的内容:

  • 我正在使用sbt 0.13.12,这是我的项目 在构建中。sbt取决于公共。如果我按sbt project sub1 run运行就可以了。但是,当我将子项目打包为jar文件时,我运行sub1。jar文件中,错误显示sub1无法找到一类公共的。 我的目的是包装sub1。jar和sub2。在每个jar文件中编译带有通用代码的jar。 --更新-- 我尝试作为建议回答。运行时遇到这个问题: 而且,是的!