针对同一个目录解决
假设有一个项目,该项目包含两个模块:core
和web
,其中,core
模块包含一些基本的或公共的Java类,而web
模块是一个Web应用程序,依赖于core
模块。首先,需要在项目根目录下创建一个settings.gradle
文件,用于定义项目中的模块:
= 'myproject'
include 'core'
include 'web'
接下来,在项目根目录下创建一个build.gradle
文件,这个文件通常用于配置所有模块共用的构建逻辑,比如插件应用、仓库定义等:
allprojects {
group = 'com.example'
version = '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
apply plugin: 'java'
sourceCompatibility = 1.8
targetCompatibility = 1.8
}
subprojects {
apply plugin: 'java'
dependencies {
// 这里可以定义所有子模块共用的依赖项
}
}
然后,为每个模块创建它们各自的build.gradle
文件。在core
模块的目录下创建core/build.gradle
:
apply plugin: 'java'
dependencies {
// core模块的依赖项
}
在web
模块的目录下创建web/build.gradle
:
apply plugin: 'war' // 假设web模块需要打包成WAR文件
dependencies {
implementation project(':core') // web模块依赖于core模块
// web模块的其他依赖项
}
注意,在web/build.gradle
中,使用implementation project(':core')
语句来声明web
模块对core
模块的依赖,Gradle会自动处理这种依赖关系,并确保在构建web
模块之前先构建core
模块。
最后,可以在命令行中运行Gradle构建命令来构建整个项目或特定的模块,例如,要构建整个项目,可以在项目根目录下运行:
./gradlew build
要仅构建web
模块,可以运行:
./gradlew web:build
针对不同目录实现
如果两个模块不在同一个目录,但想要在同一个Gradle构建中包含它们,则需要确保每个模块都有一个build.gradle
文件,并且在项目的根目录中的settings.gradle
或settings.gradle.kts
文件中正确地引用这些模块,Gradle会基于这些设置来确定哪些模块应该被包含在构建中,以及它们之间的关系。
假设有如下的目录结构:
/root-project
/moduleA
build.gradle
/some-other-directory
/moduleB
build.gradle
settings.gradle
build.gradle
在这个例子中,moduleA
和moduleB
不在同一个目录下,想要在同一个Gradle构建中包含它们,则需要在settings.gradle
文件中指定这两个模块的位置,如下代码:
= 'root-project'
include 'moduleA'
project(':moduleA').projectDir = new File(rootDir, 'moduleA')
include 'moduleB'
project(':moduleB').projectDir = new File(rootDir, 'some-other-directory/moduleB')
这里,使用projectDir
属性来指定每个模块的实际位置,注意,路径是相对于根项目目录的。然后,可以在根目录的build.gradle
文件中定义所有模块共用的配置,以及在每个模块的build.gradle
文件中定义模块特定的配置和依赖关系。
现在,运行Gradle命令时,它会考虑这两个模块,并根据在build.gradle
文件中定义的依赖关系来正确地构建它们。