Gradle项目取决于兄弟项目创建的工件

sto*_*vik 14 dependencies siblings gradle

我有这个Gradle设置有四个项目,一个有三个孩子的父项,其中一个Java Servlet JSON'后端'被内置到一个war文件中,然后一个静态HTML5'前端'消费它被内置到一个zip中.这两个人都将他们的艺术品"安装"到当地的maven仓库.

第三个兄弟项目"合并"依赖于这两个工件,通过简单地"将它们拉到一起"来构建"合并"战争.

但是,一旦我按照预期启动并运行,我显然必须通过删除本地存储库中的工件测试引导程序.

现在我突然得到"Artifact'no.company:frontend:1.0-SNAPSHOT@zip'not found".

是否不可能依赖当前构建产生的工件?

编辑:

根据另一个想法(以及彼得的回复阻止了这个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)
}
Run Code Online (Sandbox Code Playgroud)

编辑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)
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*ser 13

install只有在与Maven构建交换工件时才应使用本地Maven存储库(和Gradle的任务).它并不意味着用于在Gradle构建的项目之间交换工件,并且不会自动安装到本地Maven存储库中.

相反,merger需要在其他两个项目上声明项目依赖项.例如:

configurations {
     merge
}

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

task merge(type: Zip) {
    from { configurations.merge.collect { zipTree(it) } }
}
Run Code Online (Sandbox Code Playgroud)

这假设frontendbackend正确地声明了它们的工件.(这可能会自动发生,例如,如果使用war插件.)

您可以在Gradle用户指南中找到更多相关信息,特别是多项目构建章节.