Gradle多模块项目设置

jua*_*lla 20 java gradle

我最近开始使用Gradle并替换现有的基于Maven的项目.过去我使用Maven处理多模块构建时遇到了很多问题.Gradle在处理多模块构建时已经呼吸新鲜空气,但它还不完美.

我的项目有以下文件夹布局:

-- Projects
---- EnterpriseApp1
------ EarProject
-------- build.gradle
------ EjbProject
-------- build.gradle
------ WarProject
-------- build.gradle
------ properties.gradle
------ build.gradle
---- CommonLib
------ build.gradle
---- ClientApplication
------ build.gradle
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是"EnterpriseApp1"和"ClientApplication"都依赖于CommonLib项目.我不知道如何配置我的"EnterpriseApp1"构建文件以使用CommonLib项目作为"EjbProject"的依赖项.我已经非常接近让这个工作,但还没有完成工作.我通过复制"EnterpriseApp1"中的CommonLib文件夹取得了成功,但这不是一个长期的解决方案.

这是我在"EnterpriseApp1"中的当前properties.gradle文件:

include "EarProject", "EjbProject", "WarProject"
includeFlat "CommonLib"
Run Code Online (Sandbox Code Playgroud)

根据Gradle文档,"settings.gradle"文件中的"includeFlat"命令将包含与"settings.gradle"文件所在文件夹相同的栏中的项目(所需行为).

EnterpriseApp1/build.gradle文件:

subprojects {
   apply plugin: 'java'

   sourceCompatibility  = 1.6
   group = 'org.example'
   version = '1.0-SNAPSHOT'

   repositories {
      mavenCentral()
      ...
   }

   dependencies {

   }    
}
Run Code Online (Sandbox Code Playgroud)

EnterpriseApp1/EjbProject /的build.gradle:

apply plugin: 'java'

sourceCompatibility  = 1.6

repositories {
   mavenCentral()
   ...
}

dependencies {
   compile project(':CommonLib')

   compile group: 'org.restlet.jee', name: 'org.restlet', version: '2.0.11'
   compile group: 'ma.glasnost.orika', name: 'orika-core', version: '1.0'
   ...
   compile group: 'javax.jmdns', name: 'jmdns', version: '3.4.1'
}
Run Code Online (Sandbox Code Playgroud)

当我从EnterpriseApp1文件夹执行"gradle clean build"时,所有依赖项都按预期下载并且项目开始编译(包括CommonLib项目),但是EjbProject项目在构建期间失败,因为它缺少CommonLib jar参考.Gradle不够聪明(或者我完全无能;))配置我的EjbProject以使用从CommonLib项目构建阶段生成的Jar.

我为漫长而复杂的设置道歉.我一直在努力解决这个问题已经有一段时间了,但几乎没有想法.我真的很感谢社区的任何帮助.

谢谢!

Pet*_*ser 7

您选择的目录布局已经提示了一个很好的解决方案.我建议有三个独立的构建:EnterpriseApp1,CommonLib,和ClientApplication.我将发布CommonLib到Maven或Ivy存储库,以便其他两个版本可以从那里使用它.对于本地开发,您可以发布CommonLib到本地Maven仓库(最简单)或基于文件的Ivy仓库.

  • 如果`EnterpriseApp1`和`ClientApplication`是具有不同开发和发布周期的不同应用程序,则构建应该反映这一点.您可以将`CommonLib`作为`EnterpriseApp1`构建的一部分发布,但这仍然需要一个存储库,并且当`ClientApplication`需要在`CommonLib`中进行更改时会使问题复杂化.或者,如果所有代码都在同一个源代码库中,则可以有两个构建,这两个构建都包含`CommonLib`.或者,如果开发/发布周期相同,则可以使用一个大型构建,在这种情况下,您将不需要回购. (2认同)