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

Gradle 清晰地将多个应用程序分离为具有公共依赖关系和联合源的子项目,gradle,Gradle,我发现Gradle的多项目文档对于多项目设置中项目的源和输出将驻留在何处既令人困惑又毫无帮助 我希望看到Java和应用程序插件的具体示例,而不仅仅是编写标准输出的任务 我正在尝试构建2到4个java应用程序,这些应用程序共享一些公共类,但拥有不同的主类。在一个项目中,我看到了一些方法可以做到这一点,其中您使用应用程序插件,但禁用脚本的默认值,然后为每个应用程序创建自定义任务。我希望有一种更简单的维护方法来完成子项目,这样: 所有源代码仍然在一个~/src/java/{main,test}/pkg

我发现Gradle的多项目文档对于多项目设置中项目的源和输出将驻留在何处既令人困惑又毫无帮助

我希望看到Java和
应用程序
插件的具体示例,而不仅仅是编写标准输出的任务

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

  • 所有源代码仍然在一个
    ~/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(使用插件java,构建主和测试源集)
    鲸鱼/
    build.gradle(使用whale.whalapp的插件应用程序,取决于water项目)
    磷虾/
    build.gradle(使用krill.KrillApp的插件应用程序,取决于水项目)
    src/
    爪哇/
    主要//
    普通的/
    Water.java(通用utils)
    java(鲸鱼等的基类)
    鲸鱼/
    whalapp.java(鲸鱼的主命令行)
    java(延长生命)
    磷虾/
    KrillApp.java(磷虾的主命令行)
    Krill.java(延长寿命)
    试验//
    普通的/
    *Test.java
    鲸鱼/
    *Test.java
    磷虾/
    *Test.java
    
    这需要一些尝试和错误,但如果其他人知道我确实通过以下文件设置(类似于我的问题布局(其中没有提到重要的settings.gradle文件))解决了我的限制,这对他们是有好处的,那么基本上工作的设置如下所示:

    结构 水/build.gradle whale/settings.gradle 鲸鱼/build.gradle 磷虾/build.gradle
    apply插件:“应用程序”
    mainClassName='.krill.KrillApp'
    依赖关系{
    编译项目(rootProject.path)
    运行时项目(rootProject.path)
    }
    
    现在,如果您发出
    gradle installDist
    ,它将在每个子项目中生成一个
    build/install/$task.name/bin/$task.name
    脚本,您可以使用该脚本在复制到
    lib
    目录的jar中运行正确的主类。如果您只使用
    assembly
    ,您将获得正确的jar和
    build/scripts
    中的脚本,但是如果类路径上没有jar或类似的东西,它们将无法运行


    但是仔细想想,我想知道“多项目”无法从单个
    settings.gradle
    build.gradle
    中设置
    water
    定义子项目的任务和设置,并将应用程序插件指向输出到根项目的构建目录。您问题中的文件夹结构有点混乱。你能试着用ascii树来代替吗?类似这样的情况:您可以在linux和windows上使用
    tree
    命令从现有的文件夹结构生成它。顺便说一句,您会在Gradle文档中看到非常相似的图表,我认为这实际上比为每个目录换行更清楚,但我让它更符合Gradle doc的风格。你的编辑肯定有帮助。您的“所有源代码在1 src/java下”需求有多强?通常,每个模块的代码都位于自己的src/java文件夹中。您所要求的仍然可以完成,但这与gradle的固执己见的方式大不相同,并且使构建脚本变得复杂。如果有人想知道的话,1/src/java with main | test对这个项目很重要(不是关于鲸鱼)
    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'
    
    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'
    }
    
    $task.name = 'whale'
    
    apply plugin: 'application'
    mainClassName = '<namespace>.whale.WhaleApp'
    
    dependencies {
        compile project(rootProject.path)
        runtime project(rootProject.path)
    }
    
    $task.name = 'krill'
    
    apply plugin: 'application'
    mainClassName = '<namespace>.krill.KrillApp'
    
    dependencies {
        compile project(rootProject.path)
        runtime project(rootProject.path)
    }