在gradle多项目中,如何构建单个jar并将其发布到maven?

Cod*_*ody 5 java gradle maven spring-boot

首先,请原谅我糟糕的英语。:P

项目结构如下:

parent
|-- admin // spring boot web application for management.
|   |-- client // SDK for other applications. publish it to maven.
|   |   |-- src
|   |   `-- build.gradle
|   |-- public // common part of admin and client of it. Such as DTOs.
|   |   |-- src
|   |   `-- build.gradle
|   |-- src
|   `-- build.gradle
|-- common // common part of admin and server.
|   |-- src
|   `-- build.gradle
|-- public // common part of admin, server and clients of them.
|   |-- src
|   `-- build.gradle
|-- server // spring boot web application for normal user.
|   |-- client // SDK for other applications. publish it to maven.
|   |   |-- src
|   |   `-- build.gradle
|   |-- public // common part of server and client of it. Such as DTOs.
|   |   |-- src
|   |   `-- build.gradle
|   |-- src
|   `-- build.gradle
|-- build.gradle
`-- settings.gradle
Run Code Online (Sandbox Code Playgroud)

当我发布:server:client到maven时,它会将:server:publicpom文件作为依赖项放入。这需要我也分别发布:server:public:publicmaven。

但我想要的是作为:server:client一个库并包含其中的类:server:public文件:public

另外,构建:server为 Spring Boot 应用程序时也存在类似的问题。它将依赖的项目构建到 jar 中,然后将它们打包到:server. 而不是打包他们的类文件。

是否有可能让 gradle 按我的预期工作?或者有没有更好的设计可以满足代码的复用而无需发布多个库?

有一个演示项目:https://github.com/cody1996/demo-gradle-build

小智 2

是的,你可以用 gradle 做你想做的事。您可以使用 gradle 插件来完成创建单个 jar 的工作,也可以使用自定义任务从不同的子项目中手动获取类文件并从中创建单个工件。

标准gradle fat jar插件 -shadow插件

如果你想手动执行 -

task singleJar(type: Jar) {
   baseName = 'app-jar'
   from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
   with jar
}
Run Code Online (Sandbox Code Playgroud)

  • 我也在努力实现这个目标。我基本上需要将源代码组织在模块中,但这并不意味着我想在存储库上传播许多 Maven 依赖项。Android插件是这样工作的,Spring Boot也是这样,但是整个互联网上没有简单的java项目的工作示例。 (2认同)