Dependencies 渐变项目取决于兄弟项目创建的工件

Dependencies 渐变项目取决于兄弟项目创建的工件,dependencies,gradle,siblings,Dependencies,Gradle,Siblings,我有四个项目的Gradle设置,一个有三个子项目的父项目,其中Java Servlet JSON“后端”构建到war文件中,然后使用它的静态HTML5“前端”构建到zip中。这两个“安装”他们的工件到本地maven repo 第三个兄弟项目“合并”依赖于这两个工件,通过简单地“将它们压缩在一起”来构建“合并”战争。 然而,一旦我按照预期安装并运行了它,我显然必须通过从本地repo中删除工件来测试引导场景 现在我突然得到了“神器”编号。公司:前端:1.0-SNAPSHOT@zip“未找到” 是否不

我有四个项目的Gradle设置,一个有三个子项目的父项目,其中Java Servlet JSON“后端”构建到war文件中,然后使用它的静态HTML5“前端”构建到zip中。这两个“安装”他们的工件到本地maven repo

第三个兄弟项目“合并”依赖于这两个工件,通过简单地“将它们压缩在一起”来构建“合并”战争。

然而,一旦我按照预期安装并运行了它,我显然必须通过从本地repo中删除工件来测试引导场景

现在我突然得到了“神器”编号。公司:前端:1.0-SNAPSHOT@zip“未找到”

是否不可能依赖当前构建将生成的工件

编辑:

基于另一个想法(以及Peter对Maven逻辑的否定),这个版本看起来很有希望,而不是遍历Maven(注意:它可以工作!):

编辑2:

根据Peter关于未触及兄弟姐妹项目结构的评论和他的具体建议,以下是最终的结论(注意:它起作用了!):


本地Maven存储库(以及Gradle的
install
task)只应在与Maven构建交换工件时使用。它不用于在Gradle构建的项目之间交换工件,并且不会自动安装到本地Maven存储库中

相反,
合并
需要声明项目对其他两个项目的依赖关系。例如:

configurations {
     merge
}

dependencies {
    merge project(":frontend"), project(":backend")
}

task merge(type: Zip) {
    from { configurations.merge.collect { zipTree(it) } }
}
这假设
前端
后端
正确声明了它们的工件。(这可能会自动发生,例如,如果使用了
war
插件。)


您将在中找到更多关于这方面的信息,特别是多项目构建一章。

利用这篇文章和其他地方的想法,我制作了一个github项目-

谢谢!好的,因为这就是我使用Maven的方式(我确实将工件安装到本地Maven repo中——这很有效!)。然而,我尝试了您在这里建议的项目依赖路径,但是我只从java war项目(而不是war)获得JAR,而根本没有从静态HTML文件项目获得zip。另外,如果我执行您定义的合并任务,我是否也会合并java war项目中的所有jar?请看,我只希望WAR结构与静态HTML文件的ZIP文件合并(由于WAR的性质,生成的beast是可作为适当WAR部署的servlet容器)。此外-现在我正在尝试另一种方法:在合并项目中,我只需定义一个类型:WAR任务,它将属性设置为后端“WAR”任务的输出,以及前端的“Zipfronted”任务。这可能吗?怎么用?tasks属性似乎不包含兄弟引用?不鼓励接触其他项目的项目模型。相反,为其他两个项目声明必要的工件,例如
configurations{zip};工件{zip taskThatProducesZip}
。然后调整项目依赖项(例如,
依赖项{merge project(path::frontend,configuration:“zip”)}
。很好,这种方法看起来不错!我现在如何从具有相同逻辑的“后端”项目获得war?因为我应用了war插件,所以已经有了war任务。但显然这不是“配置”,我在定义它时遇到问题。将“mergeFrontAndBack”设为
Zip
任务更安全,否则可能会导致一些重复的
War
行为(例如重复的描述符)。另一个改进是使
mergefront和back
依赖于
配置。合并
,而不是单个任务。
// ## From frontend's build.gradle:
task zipFrontend(dependsOn: 'buildFrontend',  type: Zip) {
    from ('dist/')
}
configurations { zip }
artifacts { zip zipFrontend }

// ## From backend's build.gradle:
apply plugin: 'war'
configurations { jsonOnlyWar }
artifacts { jsonOnlyWar war }

// ## From merger's build.gradle:
configurations { merge }
dependencies {
    merge project(path: ':backend', configuration: 'jsonOnlyWar')
    merge project(path: ':frontend', configuration: 'zip')
}
task mergeFrontAndBack(dependsOn: configurations.merge, type: War) {
    from { configurations.merge.collect { zipTree(it) } }
    destinationDir(buildDir)
}
configurations {
     merge
}

dependencies {
    merge project(":frontend"), project(":backend")
}

task merge(type: Zip) {
    from { configurations.merge.collect { zipTree(it) } }
}