给定一个像这样的项目文件结构:
git-root
├── ServerApp
│ ├── build.gradle
│ └── src
│ └── ...
└── ClientJAR
├── build.gradle
└── src
└── ...
字符串ServerApp
需要包含ClientJAR
的构建工件(默认工件)作为其资源之一。在传统意义上,ServerApp
和ClientJAR
之间没有 * 依赖关系 *-两个项目都不引用对方的代码。
如图所示,两个Gradle项目在一个git repo中是兄弟项目。更改该结构(例如,使其成为容器/复合构建)只是最后的手段;我正在寻找一个保持该结构完整的解决方案。
背景/背景
目的是ServerApp
构建的应用程序有一个端点,可以用来下载ClientJAR
项目中构建的工件。最明显的实现方式(对我来说)是在构建时将ClientJAR
的工件作为资源嵌入到ServerApp
(这是一个Sping Boot 应用程序)中。
我尝试过使用includeFlat
并将ClientJAR
声明为ServerApp
中的依赖项,但这导致“普通”ClientJAR
对象化工件被包含在ServerApp
的库中,这不是我所需要的。我需要bootJar工件(目前是在ClientJAR
中调用gradlew build
的结果)。
有没有一种干净的方法来“嵌入”一个兄弟节点呢?甚至一个具体的例子,一个构建调用另一个(兄弟节点),然后将其输出复制到/build/resources
文件夹中也是一个合理的选择(我认为)。
3条答案
按热度按时间ztigrdn81#
我仍然在测试和检查,但下面是我使用自定义
GradleBuild
和Copy
任务的组合所做的工作。在
ServerApp
中,我添加了以下自定义任务:字符串
我还声明了
processResources
应该依赖于copyClient
:型
这样,
client.jar
就像预期的那样在ServerApp/build/resources/main/
中结束(以及在最终的 Boot WAR工件中)。kadbb4592#
你可以通过三个步骤来做到这一点:
1.将项目的构建链接在一起,以便它们可以相互引用;
1.根据
ClientJAR
配置在ServerApp
构建中获得所需的配置;以及1.将目录复制到资源中需要它的位置。
1.将项目的build链接在一起
正如你已经做过的那样,你可以使用
includeFlat
来实现这一点:字符串
2.通过新配置获取消费项目中的CDN
Gradle有关于以这种方式共享工件的说明。总结一下,你可以通过四个步骤来完成:
(a)向生产者项目添加新的耗材配置(
ClientJAR
):型
(b)使用生成
bootJar
(假定称为bootJarTaskName
)的Jar任务向其添加所需的工件:型
(c)向
ServerJAR
添加新配置以加载型
(d)通过依赖于新的配置,依赖于消费项目中的工件:
型
3.将目录复制到资源中需要的位置
然后
ServerApp
可以访问该文件,但它不在所需的位置。您可以编写一个任务来执行最后的复制步骤:型
最后,您需要确保
processResources
任务依赖于此,以便在运行ServerApp
构建时所有内容都将运行:型
0md85ypi3#
这里有一个变体,可以使用复合构建正确解决它:
在
ServerApp
的settings.gradle.kts
中:字符串
在
ServerApp
的build.gradle.kts
中:型
这里有一个使用工具API正确解决它的变体,尽管我可能更喜欢上面更集成的方法,例如它可以更好地更新,通过驱动另一个构建,您几乎总是必须完全运行它:
在
ServerApp
的build.gradle.kts
中:型