我正在创建一个多子项目Java项目。子项目每个都有自己独立的git存储库,并使用git子模块包含在超级项目中。我们首选的情况是,我们的持续集成工具(Jenkins)将独立地将这些子项目构建到.jars中,而不考虑或以其他方式了解超级项目。
这可以很容易地通过确保子项目每个都有一个build.gradle来完成,该build.gradle具有构建由构建产生的.jar所需的所有信息。结果的唯一复杂因素是某些子项目依赖于其他子项目。
如果您愿意总是让子项目从Maven或Ivy仓库中提取其依赖项.jars,那么即使这样也非常简单。但是,当我们在开发过程中构建我们的本地盒子时,我们希望能够构建和部署超级项目的.war文件到Tomcat以及所有.jars到类路径上的某个地方,并确保所有的.jars是根据我们自己的盒子上的代码副本构建的。 (也就是说,我们希望它的行为基本上就像我们使用compile(project(“:otherproject”))而不是编译(“group:otherproject:1.0-SNAPSHOT”)或其他一些。)
我对Gradle很新,而且我完全有可能错过一些非常明显的东西,但我还没有找到一个很好的方法来解决这个问题。
我们可以做一些事情,通过从我们的Maven存储库中拉出.jars来构建它的依赖集在一个文件中,并通过在另一个文件中使用其兄弟子项目来构建它的依赖集,但这似乎是一个干违规。 (在这种情况下,我们有两个不同的位置来管理依赖项列表。)
我们可以创建子项目的构建脚本,以便始终从Maven存储库中提取并让超级项目的构建脚本包含每个子项目的部分,这些部分覆盖子项目中的依赖项,但这与前一个选项一样,都是DRY违规。
我想也许可以让超级项目实际内省并根据需要修改每个子项目上的依赖项列表(超级项目中的代码应该可以访问将Maven工件的依赖项转换为相应的所需的所有信息。我认为依赖于兄弟子项目,但在仔细研究之后,我不确定会怎么做。
我希望大家可以提供帮助。谢谢!
答案 0 :(得分:4)
在项目和外部依赖项之间动态切换目前还不是Gradle中的一流功能。但是,有Prezi的Pride工具,我强烈建议让它旋转。
答案 1 :(得分:1)
你可以通过挂钩进行依赖解析来做你想做的事。
在伪代码中并忽略错误路径:
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'或map {group =,name =,version =}),tryFindProject将查看是否存在名为'name'的项目,如果所以归还它。 (可能返回':$ name'也会起作用)
当然,假设您的项目名称与工件名称完全匹配,并忽略组/版本。您可以通过在settings.gradle include 'name'; project(":${name}").projectDir = dir
中包含项目时重命名项目来解决第一个问题。