Java 格拉德尔。不包含'的子项目;我不知道他们';关于次级项目

Java 格拉德尔。不包含'的子项目;我不知道他们';关于次级项目,java,gradle,Java,Gradle,我正在创建一个多个子项目Java项目。每个子项目都有各自独立的git存储库,并使用git子模块包含在超级项目中。我们首选的情况是,我们的持续集成工具(Jenkins)将独立地将这些子项目构建到.jar中,而不考虑或不了解超级项目 只需确保每个子项目都有一个build.gradle,该build.gradle包含构建生成的.jar所需的所有信息,就可以很容易地实现这一点。唯一复杂的结果是当一些子项目依赖于其他子项目时 如果您愿意让子项目从Maven或Ivy repo中提取依赖项,那么即使这样也非常

我正在创建一个多个子项目Java项目。每个子项目都有各自独立的git存储库,并使用git子模块包含在超级项目中。我们首选的情况是,我们的持续集成工具(Jenkins)将独立地将这些子项目构建到.jar中,而不考虑或不了解超级项目

只需确保每个子项目都有一个build.gradle,该build.gradle包含构建生成的.jar所需的所有信息,就可以很容易地实现这一点。唯一复杂的结果是当一些子项目依赖于其他子项目时

如果您愿意让子项目从Maven或Ivy repo中提取依赖项,那么即使这样也非常简单。然而,当我们在开发过程中构建本地框时,我们希望能够将superproject的.war文件构建并部署到Tomcat,并将所有的.jar部署到类路径上的某个地方,并确保所有的.jar都是从我们自己的框中当前的代码副本构建的。(也就是说,我们希望它的作用基本上与我们使用compile(project(“:otherproject”)类似,而不是compile(“group:otherproject:1.0-SNAPSHOT”)或类似的东西。)

我对Gradle还很陌生,完全有可能我遗漏了一些很明显的东西,但我还没有找到一个好的方法来处理这个问题

我们可以这样做,通过从Maven存储库中提取.jar来构建它的依赖项集位于一个文件中,而通过在另一个文件中使用其兄弟子项目来构建它的依赖项集位于另一个文件中,但这似乎是一个完全违反。(在这种情况下,我们将有两个独立的位置来管理依赖项列表。)

我们可以创建子项目的构建脚本,以便始终从Maven存储库中提取,并让超级项目的构建脚本包含每个子项目的部分,这些部分覆盖子项目中的依赖项,但这与前面的选项一样,是一个干冲突

我考虑过让超级项目实际内省并根据需要修改每个子项目上的依赖项列表(我认为超级项目中的代码应该能够访问将Maven工件上的依赖项转换为兄弟子项目上的对应依赖项所需的所有信息),但在仔细研究之后,我不确定人们会怎么做


我希望你们能帮忙。谢谢

在项目依赖项和外部依赖项之间动态切换目前并不是Gradle的一流功能。不过,有Prezi的工具,我强烈建议您尝试一下。

您可以通过连接gradle来做依赖解析来做您想做的事情

在伪代码中忽略错误路径:

depHandler = project.getDependencies()

oldMM = depHandler.metaClass.getMetaMethod('methodMissing',
          [String.class, Object.class] as Class[])
depHandler.metaClass.methodMissing = { String n, def args ->
    depLocator = args[0]
    name = getDepName(depLocator)
    depProject = tryFindProject(project, name)
    if (depProject) args[0] = depProject
    oldMM.invoke(depHandler, name, args)
}

project.setDependencyHandler(depHandler)
getDepName将获取依赖项定位器(字符串“group:name:version”或映射{group=,name=,version=}),tryFindProject将查看名为“name”的项目是否存在,如果存在,则返回它。(可能返回“:$name”也可以)


当然,这是假设您的项目名称与工件名称完全匹配,并且忽略组/版本。在设置中包含项目时,可以通过重命名项目来解决第一个问题。gradle:
include'name';project(“:${name}”).projectDir=dir

噢,哇。骄傲看起来很有希望。我仍在研究它是什么以及它是如何工作的。非常感谢你的建议!如果这最终是我们的正确解决方案,我会接受你的回答。