如何将子项目类文件包含在jar包中?

7

经过长时间的研究和尝试,我希望有人能够解释如何在Gradle中将一个或多个子项目的类包含在特定的jar文件中。

假设我们只有三个模块:

  1. 核心(Core)
  2. 应用(App)
  3. 网站(Web)

很明显,AppWeb项目工件(jar)应该包含Core项目的所有类。

Gradle设置如下:

rootProject.name = 'MyProject'
include 'MyProjectCore'
include 'MyProjectApp'
include 'MyProjectWeb'

MyProjectApp / MyProjectWeb:

...
dependencies {
    ...
    compile project(':MyProjectCore')
}

项目可以编译,但输出的JAR文件不包含核心类。

你正在尝试构建什么样的目标包?如果它将来要部署到应用服务器(我假设这是因为涉及到“web”子项目),你也可以尝试使用Gradle的ear或war插件。有专门的依赖范围,以便按照您所需的方式添加子jar / war。 - Doe Johnson
2个回答

10

好的,最终我找到了一个可行的解决方案,即使可能不是最好的。

对于 AppWeb 项目,我像这样覆盖了 jar 任务,以添加 Core 模块的源集。

jar {
    from project.sourceSets.main.allSource
    from project(":MyProjectCore").sourceSets.main.java.srcDirs
}

3
谢谢,我在阅读 https://rominirani.com/gradle-tutorial-part-3-multiple-java-projects-5b1c4d1fbd8d 这篇优秀的多项目构建教程后,这是我需要的缺失环节。然而,我有一个评论:对于核心项目 from 使用 sourceSets.main.java.srcDirs 导致我的 jar 文件中包含了 .java 和 .class 文件。我改用 sourceSets.main.output,现在只获取到 .class 文件。 - yokeho
除了添加 from project(":MyProjectCore").sourceSets.main.output 之外,还有其他好的解决方案吗? - feeblefakie
对我来说,执行此操作会出现错误:无法获取类型为 org.gradle.api.Project 的项目 ':shared' 的未知属性 'sourceSets'。 - szx

2
使用此功能,您可以自动将子项目中创建的所有*.class文件添加到您的jar包中:
jar {
    from {
        subprojects.collect { it.sourceSets.main.output }
    }
}

为了确保 .class 文件存在,请确保根项目依赖于子项目:
dependencies {
    compile project(':mySubProject')
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接