先新建工程
- 新建
couponApp
文件夹,cd进入,运行gradle init
新建工程,
- 把couponApp 里面的 app复制两份,分别改名为:services, data, integration
- 然后把之前创建的工程里面创建的项目里面的app文件夹复制到本次的couponApp文件夹下,命名为web
- 运行
tree
看下目录结构
@192 couponApp % tree
.
├── build.gradle
├── data
│ ├── build.gradle
│ └── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── xj
│ │ │ └── gradle
│ │ │ └── App.java
│ │ └── resources
│ └── test
│ ├── java
│ │ └── com
│ │ └── xj
│ │ └── gradle
│ │ └── AppTest.java
│ └── resources
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── integration
│ ├── build.gradle
│ └── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── xj
│ │ │ └── gradle
│ │ │ └── App.java
│ │ └── resources
│ └── test
│ ├── java
│ │ └── com
│ │ └── xj
│ │ └── gradle
│ │ └── AppTest.java
│ └── resources
├── services
│ ├── build.gradle
│ └── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── xj
│ │ │ └── gradle
│ │ │ └── App.java
│ │ └── resources
│ └── test
│ ├── java
│ │ └── com
│ │ └── xj
│ │ └── gradle
│ │ └── AppTest.java
│ └── resources
├── settings.gradle
└── web
├── build.gradle
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── xj
│ │ └── gradle
│ │ └── App.java
│ ├── resources
│ └── webapp
│ ├── index.html
│ └── response.jsp
└── test
├── java
│ └── com
│ └── xj
│ └── gradle
│ └── AppTest.java
└── resources
59 directories, 20 files
- 并在
couponApp/settings.gradle
里面添加子项目
rootProject.name = 'couponApp'
include('web')
include('services')
include('data')
include('integration')
新建task
- 在
couponApp
文件夹下面新建文件build.gradle
,并新建一个task:
task printProjectName {
doLast() {
println project.name
}
}
- 运行
./gradlew pPN
可以看到:
- 上面的命令是运行的parent工程的task,如果想运行子项目的某个task,比如子项目build,可以通过:
./gradlew :web:build
这种方式 - 但是如果尝试运行
./gradlew :web:pPN
, 发现会运行失败,因为子项目并没有从parent 工程继承task,如果需要继承,需要做如下改变:
allprojects {
task printProjectName {
doLast() {
println project.name
}
}
}
再次运行发现build成功,并且输出的工程名称为 web
5. 此时如果尝试运行./gradlew pPN
, 发现子工程的task也跟着运行了:
6. 如果此时只想把这个task放在子工程下,父工程让他没有,需要做:
subprojects {
task printProjectName {
doLast() {
println project.name
}
}
}
再次运行,发现不会输出couponApp了
7. 此时会发现data,services以及integration的build.gradle 完全一样,这时可以在couponApp/build.gradle
里面写上:
subprojects {
apply plugin: 'application'
repositories {
mavenCentral()
}
dependencies {
testImplementation 'junit:junit:4.13.2'
}
task printProjectName {
doLast() {
println project.name
}
}
}
并把上面三个工程里面的build.gradle
清空(web下面的不用改),最后先运行 ./gradlew clean
, 然后运行build,发现其他几个均会生成build文件夹
8. 也可以在build.gradle 里面添加version,version = '1.0'
,这样在对应的libs文件夹下生成的包即会带有版本信息:
libs
└── data-1.0.jar
多个子工程的依赖
- 解压
couponApp/web/build/libs/web-1.0.war
可以看到,里面没有其他的包 - 如果想让web工程依赖于services工程,在build.gradle 最下方添加依赖:
subprojects {
apply plugin: 'application'
repositories {
mavenCentral()
}
version = '1.0'
group = 'com.xj.gradle'
dependencies {
testImplementation 'junit:junit:4.13.2'
}
task printProjectName {
doLast() {
println project.name
}
}
}
project(':web') {
dependencies {
implementation project(':services')
}
}
- 再次解压,发现里面多了service-1.0.war的包了,说明依赖添加成功
- 运行
./gradlew :web:dependencies
, 输出里面有:
implementation - Implementation only dependencies for source set 'main'. (n)
+--- project services (n)
\--- javax.servlet:javax.servlet-api:3.1.0 (n)