我发现Gradle的多项目文档对多项目设置中项目的源和输出的位置感到困惑和无助。
我希望看到一个Java和application
插件的具体例子,而不仅仅是按照标准编写的任务。
我正在尝试构建2到4个java应用程序,它们共享一些公共类,但有不同的主类。我在一个项目EG中看到了一些实现这一点的方法,在该项目中,您使用application
插件,但禁用脚本的默认值,然后为每个应用程序创建自定义任务。我希望有一种更简单的维护方式来完成子项目,比如:
- 所有源仍在一个
~<project>/src/java/{main,test}/pkg/name/
树中 - 应用程序是引用根项目源的子项目
- build和distInstall任务构建并安装所有应用程序
例如,看看(记录在案的)
我希望能够有这样的结构:
water/
build.gradle (uses plugin java, builds main and test sourcesets)
whale/
build.gradle (uses plugin application for whale.WhaleApp, depends on water proj)
krill/
build.gradle (uses plugin application for krill.KrillApp, depends on water proj)
src/
java/
main/<namespace>/
common/
Water.java (common utils)
Life.java (a base class for Whale etc)
whale/
WhaleApp.java (main cmd line for Whales)
Whale.java (extends Life)
krill/
KrillApp.java (main cmd line for Krill)
Krill.java (extends Life)
test/<namespace>/
common/
*Test.java
whale/
*Test.java
krill/
*Test.java
这需要一些尝试和错误,但如果让其他人知道我确实通过以下文件设置(类似于我的问题布局(其中没有提到重要的设置.gradle文件)解决了我的限制,这对其他人有好处,那么基本上可以工作的设置看起来像:
结构
water/
settings.gradle
build.gradle
whale/
settings.gradle
build.gradle
krill/
settings.gradle
build.gradle
src/
java/
main/<namespace>/
common/
Water.java
Life.java
whale/
WhaleApp.java
Whale.java
krill/
KrillApp.java
Krill.java
test/<namespace>/
common/
*Test.java
whale/
*Test.java
krill/
*Test.java
这些文件的内容看起来像:
水/环境等级
rootProject.name = 'water'
include 'whale', 'krill'
水/建筑.gradle
group 'oceanGroup'
version '1.0-SNAPSHOT'
apply plugin: 'java'
sourceCompatibility = 1.8
sourceSets {
main { java { srcDir 'src/java/main' }}
test { java { srcDir 'src/java/test' }}
}
repositories { mavenCentral() }
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.11'
}
whale/settings.gradle
$task.name = 'whale'
whale/build.gradle
apply plugin: 'application'
mainClassName = '<namespace>.whale.WhaleApp'
dependencies {
compile project(rootProject.path)
runtime project(rootProject.path)
}
磷虾
$task.name = 'krill'
磷虾/建筑.gradle
apply plugin: 'application'
mainClassName = '<namespace>.krill.KrillApp'
dependencies {
compile project(rootProject.path)
runtime project(rootProject.path)
}
现在,如果您发出gradle installDist
,它将在每个子项目中生成一个build/install/$task.name/bin/$task.name
脚本,您可以使用该脚本在复制到lib
目录的jar中运行正确的主类。如果您只有assemble
,您将获得正确的jar和build/scripts
中的脚本,但如果类路径上没有jar或类似的东西,它们将无法运行。
然而,仔细想想,我想知道";多项目;安装程序无法完全从water
内的单个settings.gradle
和build.gradle
集进行配置,这两个集定义了子项目的任务和设置,并将应用程序插件指向根项目的构建目录。