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

时间:2016-04-14 21:46:46

标签: gradle

我发现Gradle的多个项目文档令人困惑,并且对多项目设置中项目的源和输出所在的位置无关。

我希望看到一个使用Java和application插件的具体示例,而不仅仅是写入标准输出的任务。

我正在尝试构建2到4个Java应用程序,这些应用程序共享一些公共类但具有不同的主类。我已经在一个项目中EG看到了一些方法,您可以使用application插件但禁用脚本'默认值然后为每个应用程序创建自定义任务。我希望可能有一个更简单的维护方法来实现这个子项目,以便:

  1. 所有来源仍在一个~<project>/src/java/{main,test}/pkg/name/
  2. 应用程序是涉及根项目的子项目。源
  3. 构建和distInstall任务构建并安装所有应用程序。
  4. E.G。查看(documentedexample

    我希望能够将其结构化为:

    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
    

1 个答案:

答案 0 :(得分:1)

它需要一些试验和错误,但是如果它让其他任何人知道我通过执行以下文件设置来解决这个问题(类似于我的问题的布局(其中重要的settings.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

这些文件的内容如下:

水/ settings.gradle

rootProject.name = 'water'
include 'whale', 'krill'

水/的build.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'
}

鲸/ settings.gradle

$task.name = 'whale'

鲸/的build.gradle

apply plugin: 'application'
mainClassName = '<namespace>.whale.WhaleApp'

dependencies {
    compile project(rootProject.path)
    runtime project(rootProject.path)
}

磷虾/ settings.gradle

$task.name = 'krill'

磷虾/的build.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脚本,您可以使用该脚本在jar中运行正确的主类复制到lib目录。如果只有assemble,你将获得正确的jar和build/scripts中的脚本,但是如果没有类路径上的jar或类似的东西,它们将无法运行。

考虑一下,我想知道“多项目”设置是否无法完全由settings.gradle内的build.gradle water设置来定义子项目'任务和设置,并将应用程序插件指向输出到根项目的构建目录。