【问题标题】:Gradle projects depending on artifacts created by sibling projectsGradle 项目取决于兄弟项目创建的工件
【发布时间】:2013-07-26 09:10:45
【问题描述】:

我有这个带有四个项目的 Gradle 设置,一个带有三个孩子的父级,其中 Java Servlet JSON“后端”内置到一个战争文件中,然后一个静态 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:

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

// ## 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)
}

【问题讨论】:

    标签: dependencies gradle siblings


    【解决方案1】:

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

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

    configurations {
         merge
    }
    
    dependencies {
        merge project(":frontend"), project(":backend")
    }
    
    task merge(type: Zip) {
        from { configurations.merge.collect { zipTree(it) } }
    }
    

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

    您可以在Gradle User Guide 中找到更多相关信息,尤其是多项目构建章节。

    【讨论】:

    • 谢谢!好的,因为这就是我使用 Maven 的方式(并且我确实将工件安装到本地 Maven 存储库 - 这有效!)。但是,我已经尝试了您在此处建议的项目依赖路径,但是我只从 java-war-project (不是战争)中获取 JAR,而根本没有从静态 HTML-files 项目中获取 zip。另外,如果我执行您定义的合并任务,我不会也合并 java-war 项目中的所有 jar 吗?看,我只希望 WAR 结构与静态 HTML 文件的 ZIP 文件合并(由于战争的性质,由此产生的野兽是 servlet-container-deployable 作为适当的战争)。
    • 另外 - 现在我正在尝试另一条路线:在合并项目中,我只需定义一个 type:War 任务,它将 from-properties 设置为后端“war”任务的输出,并且关于前端的“zipFrontend”任务。这可能吗?如何?任务属性似乎没有兄弟引用?
    • 不鼓励接触其他项目的项目模型。相反,为其他两个项目声明必要的工件,例如configurations { zip }; artifacts { zip taskThatProducesZip }。然后调整项目依赖项(例如dependencies { merge project(path: ":frontend", configuration: "zip") }.
    • 太好了,这种方法看起来不错!我现在如何以相同的逻辑从“后端”项目中掌握战争?已经有一个战争任务,因为我应用了战争插件。但显然这不是“配置”,我在定义它时遇到了问题。
    • 将`mergeFrontAndBack` 设为Zip 任务会更安全,否则您可能会遇到一些重复的War 行为(例如重复的描述符)。另一个改进是使mergeFrontAndBack 依赖于configurations.merge,而不是单个任务。
    【解决方案2】:

    利用这篇文章和其他地方的想法,我创建了一个 github 项目 - https://github.com/istomisgood/WarNode

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-07
      • 2019-04-24
      • 2022-07-02
      • 2015-04-07
      • 1970-01-01
      • 2017-03-19
      • 2020-01-12
      • 2018-09-08
      相关资源
      最近更新 更多