将多个应用程序清楚地分离为具有共同依赖关系和联合源的子项目



我发现Gradle的多项目文档对多项目设置中项目的源和输出的位置感到困惑和无助。

我希望看到一个Java和application插件的具体例子,而不仅仅是按照标准编写的任务。

我正在尝试构建2到4个java应用程序,它们共享一些公共类,但有不同的主类。我在一个项目EG中看到了一些实现这一点的方法,在该项目中,您使用application插件,但禁用脚本的默认值,然后为每个应用程序创建自定义任务。我希望有一种更简单的维护方式来完成子项目,比如:

  1. 所有源仍在一个~<project>/src/java/{main,test}/pkg/name/树中
  2. 应用程序是引用根项目源的子项目
  3. 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.gradlebuild.gradle集进行配置,这两个集定义了子项目的任务和设置,并将应用程序插件指向根项目的构建目录。

最新更新