我有这个Gradle设置有四个项目,一个有三个孩子的父项,其中一个Java Servlet JSON'后端'被内置到一个war文件中,然后一个静态HTML5'前端'消费它被内置到一个zip中。这些都将他们的艺术品“安装”到当地的maven仓库。
第三个兄弟项目'合并'取决于这两个工件,通过简单地“将它们拉到一起”来构建“合并”战争。
但是,一旦我按照预期启动并运行,我显然必须通过删除本地存储库中的工件来测试引导程序。
现在我突然得到“Artifact'no.company:frontend:1.0-SNAPSHOT@zip'not found”。
是否无法依赖当前版本将会产生的工件?
编辑:
根据另一个想法(以及Peter对这个Maven逻辑的回复),这个版本看起来很有希望,而不是遍历Maven(注意:它有效!):
// ## From frontend's build.gradle:
task zipFrontend(dependsOn: 'buildFrontend', type: Zip) {
from ('dist/')
}
// ## From backend's build.gradle:
apply plugin: 'war'
// ## From merger's build.gradle:
task mergeFrontAndBack(dependsOn: [':backend:war',
':frontend:zipFrontend'], type: War) {
from zipTree(project(':frontend').tasks['zipFrontend'].archivePath)
from zipTree(project(':backend').tasks['war'].archivePath)
destinationDir(buildDir)
}
编辑2:
基于彼得关于没有达到兄弟姐妹的项目结构及其具体建议的评论,这是最终的结果(注意:它有效!):
// ## 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)
}
答案 0 :(得分:12)
只有在与Maven构建交换工件时才应使用本地Maven存储库(和Gradle的install
任务)。它并不意味着用于在Gradle构建的项目之间交换工件,并且不会自动安装到本地Maven存储库中。
相反,merger
需要在其他两个项目上声明项目依赖项。例如:
configurations {
merge
}
dependencies {
merge project(":frontend"), project(":backend")
}
task merge(type: Zip) {
from { configurations.merge.collect { zipTree(it) } }
}
这假定frontend
和backend
正确地声明了它们的工件。 (这可能会自动发生,例如,如果使用war
插件。)
您会在Gradle User Guide中找到更多相关内容,尤其是多项目构建章节。
答案 1 :(得分:0)
使用这篇文章和其他地方的想法,我做了一个github项目 - https://github.com/istomisgood/WarNode