通常我在使用Maven构建项目的时候是将应用项目划分为多个更小的模块。

Gradle 项目也拥有多于一个组件,我们也将其称之为多项目构建(multi-project build)。

我们首先创建一个多项目构建:

mkdir cmdGradleProj && cd cmdGradleProj
gradle init

这时候

D:\cmdGradleProj> 目录下执行:
tree /f

的项目结构如下:

│  build.gradle
│ gradlew
│ gradlew.bat
│ settings.gradle

├─.gradle
│ └─3.0
│ └─taskArtifacts
│ cache.properties
│ cache.properties.lock
│ fileHashes.bin
│ fileSnapshots.bin
│ fileSnapshotsToTreeSnapshotsIndex.bin
│ taskArtifacts.bin

└─gradle
└─wrapper
gradle-wrapper.jar
gradle-wrapper.properties

然后,创建多个模块,这里以 core 和 web 模块为例,先创建四个目录(test 文件夹用于编写测试类):

  

mkdir core\src\main\java
mkdir core\src\main\test
mkdir web\src\main\java
mkdir web\src\main\resources

   core模块 :包含一些通用的组件,它们能够被程序的其他模块使用。例子中,只包含一个类:MessageService类返回 ‘Hello World!’ 字符串。该模块有两个依赖:Junit 4.11与commons-lang3。
   web模块:模块包含HelloWorld类,是程序的开端,它从MessageService对象中获取信息,并将接收到的信息写入一个日志文件中。该模块拥有两个依赖:它需要core模块,还使用Log4j作为日志。

现在,我们已经创建了所需的目录,下一步是配置Gradle构建,先对包含在多项目构建中的项目进行配置。

我们可以通过以下步骤,对包含在多项目构建中的项目进行配置:

  1. 在根项目的根目录下创建 settings.gradle 文件,一个多项目Gradle构建必须含有这个文件,因为它指明了那些包含在多项目构建中的项目。
  2. 确保 web 和 core 项目包含在我们的多项目构建中。

我们的 settings.gradle 文件如下:

include 'core'
include 'web'
简写:include 'core','web'

修改根目录下的 build.gradle:

// 所有子项目的通用配置
subprojects {
apply plugin: 'java'
// apply plugin: 'eclipse'
apply plugin: 'idea' version = '1.0' // JVM 版本号要求
sourceCompatibility = 1.8
targetCompatibility = 1.8 // java编译的时候缺省状态下会因为中文字符而失败
[compileJava,compileTestJava,javadoc]*.options*.encoding = 'UTF-8' //定义版本号
ext {
springVersion = '4.3.3.RELEASE'
hibernateVersion='5.2.2.Final'
} repositories {
mavenCentral()
} jar {
manifest {
attributes("Implementation-Title": "Gradle")
}
} configurations {
// 所有需要忽略的包定义在此
all*.exclude group: 'commons-httpclient'
all*.exclude group: 'commons-logging'
all*.exclude group: 'commons-beanutils', module: 'commons-beanutils'
} dependencies {
// 通用依赖
compile(
"org.springframework:spring-context:$springVersion",
"org.springframework:spring-orm:$springVersion",
"org.springframework:spring-tx:$springVersion",
"org.springframework.data:spring-data-jpa:1.10.3.RELEASE",
"org.hibernate:hibernate-entitymanager:$hibernateVersion",
"c3p0:c3p0:0.9.1.2",
"mysql:mysql-connector-java:6.0.4",
"org.slf4j:slf4j-nop:1.7.21",
"commons-fileupload:commons-fileupload:1.3.2",
"com.fasterxml.jackson.core:jackson-databind:2.8.2"
) // 依赖maven中不存在的jar
ext.jarTree = fileTree(dir: 'libs', include: '**/*.jar')
ext.rootProjectLibs = new File(rootProject.rootDir, 'libs').getAbsolutePath()
ext.jarTree += fileTree(dir: rootProjectLibs, include: '**/*.jar') compile jarTree // 测试依赖
testCompile(
"org.springframework:spring-test:$springVersion",
"junit:junit:4.12"
)
} // 显示当前项目下所有用于 compile 的 jar.
task listJars(description: 'Display all compile jars.') << {
configurations.compile.each { File file -> println file.name }
}
}

接下来可以修改 core/build.gradle 来定义 core 模块的依赖:

// jar包的名字
archivesBaseName = 'core'
// 还可以定义其他配置,这里直接继承父模块中的配置

web 模块需要依赖 core 模块,故定义 web/build.gradle 如下:

apply plugin:"war"  

dependencies{
// 依赖 core 模块
compile project(":core")
compile(
"org.springframework:spring-webmvc:$springVersion",
"org.apache.taglibs:taglibs-standard-impl:1.2.1"
)
//系统提供的依赖
providedCompile(
"javax.servlet:javax.servlet-api:3.1.0",
"javax.servlet.jsp:jsp-api:2.2.1-b03",
"javax.servlet.jsp.jstl:javax.servlet.jsp.jstl-api:1.2.1"
)
} task jarWithoutResources(type: Jar) {
baseName project.name
from("$buildDir/classes/main")
} war{
dependsOn jarWithoutResources
from("$projectDir/src/main/resources") {
include "*.properties"
into("WEB-INF/classes")
}
classpath=classpath - sourceSets.main.output
classpath fileTree(dir:libsDir, include:"${project.name}-${version}.jar")
}
task('jarPath')<<{
configurations.runtime.resolve().each {
print it.toString()+";"
}
println();
}

3. 编译项目

查看所有 jar:

> gradle listJars

// 查看各个模块的依赖:

> gradle :core:dependencies
> gradle :web:dependencies //编译所有模块: > gradle build

对比一下,这时候的目录如下:

│   build.gradle
│ gradlew
│ gradlew.bat
│ settings.gradle

├───.gradle
│ └───3.0
│ └───taskArtifacts
│ cache.properties
│ cache.properties.lock
│ fileHashes.bin
│ fileSnapshots.bin
│ fileSnapshotsToTreeSnapshotsIndex.bin
│ taskArtifacts.bin

├───core
│ │ build.gradle
│ │
│ ├───build
│ │ ├───libs
│ │ │ core-1.0.jar
│ │ │
│ │ └───tmp
│ │ └───jar
│ │ MANIFEST.MF
│ │
│ └───src
│ ├───main
│ │ └───java
│ └───test
│ └───java
├───gradle
│ └───wrapper
│ gradle-wrapper.jar
│ gradle-wrapper.properties

└───web
│ build.gradle

├───build
│ ├───libs
│ │ web-1.0.jar
│ │ web-1.0.war
│ │
│ └───tmp
│ ├───jarWithoutResources
│ │ MANIFEST.MF
│ │
│ └───war
│ MANIFEST.MF

└───src
└───main
├───java
└───resources

未完待续:

Gradle构建多模块项目的更多相关文章

  1. SpringBoot+Gradle构建多模块项目

    1 概述 Gradle由于构建速度比Maven快,且比Maven灵活,因此很多后端的应用都使用了Gradle进行构建,但一个问题是,Gradle的多模块项目比较难构建,再加上Gradle的更新非常快, ...

  2. Gradle构建多模块项目(转)

    废话不多说,直接进入主题. 1. 创建项目 首先创建项目,名称为 test: mkdir test && cd test gradle init 这时候的项目结构如下: ➜ test ...

  3. 【转载】Gradle构建多模块项目

    本文转载自:https://yq.aliyun.com/articles/25589写的非常好! 改动如下: 1. 增加了一些[补充说明]. 2. 将执行命令使用较为显眼的博客园样式. 3. 将输出结 ...

  4. Eclipse Gradle 构建多模块项目

    注意: 1.Eclipse不如IDEA智能,Eclipse建立的Gradle Project项目在目录级别上是同级的; 2.user-web模块如果要引用user-service模块,直接引用是找不到 ...

  5. IDEA中使用springBoot+gradle构建多模块项目

    https://blog.csdn.net/forMelo/article/details/78995875

  6. 使用Gradle构建多模块SpringBoot项目

    使用Gradle构建多模块SpringBoot项目 本项目使用Gradle构建SpringBoot项目,将不同的业务进行不同的模块划分(不做微服务与分布式架构); - 编辑器:Intellij IDE ...

  7. 使用Maven构建多模块项目

    [转] 使用Maven构建多模块项目 在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分层开发,最常见的就是分为domain(域模型层).dao(数据库访问层).service(业务 ...

  8. 加速 Gradle 构建大型 Android 项目的方法[转]

    加速 Gradle 构建大型 Android 项目的方法 时间 2016-03-14 20:38:00  Mystra 原文  http://www.wangchenlong.org/2016/03/ ...

  9. 用Gradle构建Spring Boot项目

    相比起Maven的XML配置方式,Gradle提供了一套简明的DSL用于构建Java项目,使我们就像编写程序一样编写项目构建脚本.本文将从无到有创建一个用Gradle构建的Spring Boot项目, ...

随机推荐

  1. js常用正则表达式判断

    1.判断IP:端口 <html> <head> </head> <body> ip:port<input type="" na ...

  2. 4.29python

    题目: 代码:(?) list = input().split()list1 = []list2 = []for i in range(len(list)): if (i+1)%3 != 0 and ...

  3. 召回率(Recall),精确率(Precision),平均正确率

    https://blog.csdn.net/yanhx1204/article/details/81017134 摘要 在训练YOLO v2的过程中,系统会显示出一些评价训练效果的值,如Recall, ...

  4. FPC导通阻抗计算

    pc线路板是有导电功能的,那么如何仅适用手工计算出线路的阻值能?那么就需要使用到一个公式: W*R*T=6000 W是指铜箔的宽度单位是密耳mil. T是指铜箔厚度单位是盎司oz. R是指铜箔的电阻单 ...

  5. 好用的一些 git 命令

    git stash  将已修改未提交的 改动保存起来   恢复用git stash pop gir revert  反转commit git rebase 更换基础分支 git grep  -n 显示 ...

  6. Dapper的应用

    Dapper是一个轻型的开源ORM类,代码就一个SqlMapper.cs文件 using Dapper; using System; using System.Collections.Generic; ...

  7. UML作业第一次:UML用例图绘制

    UML第一次作业 一. 用例图:用例图(usecase diagram)是UML用于描述软件功能的图形.用例图包括用例.参与者及其关系,用例图也可以包括注释和约束.程序员要画时序图啥的用其他的比较麻烦 ...

  8. 关于cc.easesinexxx 与 cc.easeexponentiallxxx 的几种效果简单描述

    代码样例: var biggerEase = cc.scaleBy(0.7,1.2,1.2).easing(cc.easeSineInOut()) 呈正弦变化 1)CCEaseSineIn       ...

  9. java操作JacocClient下载dump文件

    记录瞬间 import org.jacoco.core.data.ExecutionDataWriter; import org.jacoco.core.runtime.RemoteControlRe ...

  10. mvc partialView+kendo window

    在写mvc项目时,一个列表查询页面含有多个操作按钮及弹框操作.原本写在了一个view中,导致代码繁多复杂,难以维护,还有表单赋值清空.验证等麻烦. 因此改用kendo window +partialV ...