一、 Gradle使用
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML。——维基
- 自动处理包相依关系 - 取自 Maven Repos 的概念
- 自动处理布署问题 - 取自 Ant 的概念
- 条件判断写法直觉 - 使用 Groovy 语言
注:在Maven和Gradle使用上,碰到的问题是引入本地jar
包,Gradle一行代码就搞定了,而Maven相当麻烦,得一个个引入,没有找到批量引入的方法。
1. settings.gradle
位于项目根目录,用于指示 Gradle 在构建应用时应将哪些模块包括在内。
rootProject.name = 'java-toolkit'
include 'toolkit-common'
include 'toolkit-config'
include 'toolkit-model'
2. build.gradle(parent)
在项目根目录下,通过allprojects{}
将配置应用至整个项目,再通过subprojects{}
将配置应用至整个子模块中。
// 所有项目通用配置
allprojects {
//引入 idea 插件
apply plugin: 'idea'
//指定项目版本号和group
version = '2.0'
group = 'gradle.multi'
idea.module.iml {
beforeMerged { module ->
module.dependencies.clear()
}
whenMerged { module ->
module.dependencies*.exported = true
}
}
}
// 所有子项目的通用配置
subprojects {
//引入java插件
apply plugin: 'java'
// JVM 版本号要求
sourceCompatibility = 1.6
// java编译的时候缺省状态下会因为中文字符而失败,所以这儿需要改为utf8
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
repositories {
//本地库,local repository(${user.home}/.m2/repository)
mavenLocal()
//Maven中心库(http://repo1.maven.org/maven2)
mavenCentral()
}
jar {
manifest.attributes provider: 'gradle'
}
configurations {
...
}
dependencies {
// 通用依赖
compile(
...
)
// 测试依赖
testCompile(
...
)
}
}
//如果module中名称有包含web的,则加入下面的内容
configure(subprojects.findAll {it.name.contains('web')}) {
apply plugin: 'war'
apply plugin: 'jetty'
war {
manifest {
attributes("Implementation-Title": "Gradle")
}
}
}
3. build.gradle(child module)
在子模块中,单独配置特有的构建需求。
// jar或者war的名字
archivesBaseName = 'module1'
dependencies {
compile (
...
)
}
4. gradle.properties
Gradle某些全局参数的配置或者可以自定义Gradle文件中用到的变量,在构建脚本中使用${xxx}
就可以访问该文件中定义的相关值。
env=dev
springVersion=4.3.16.RELEASE
servletApiVersion = 3.1.0
jacksonVersion=2.8.6
junitVersion=4.12
log4jVersion=2.10.0
hibernateCoreVersion=5.2.1.Final
hibernateEntityManagerVersion=5.2.1.Final
hibernateValidatorVersion=5.2.4.Final
hibernateJava8Version=5.2.1.Final
- 添加依赖包
dependencies {
// 批量引入本地`jar`包
implementation fileTree(dir: 'libs', include: ['*.jar'])
// 引入本地指定`jar`包
implementation files('libs/foo.jar', 'libs/bar.jar')
// 引入远程包
implementation group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25'
// 缩写如下
//implementation 'org.slf4j:slf4j-simple:1.7.25'
}
二、多模块创建
多模块创建,是对项目代码进行职责分工,模块之间通过gradle或maven来管理继承和聚合,方便代码的解耦和重用,以及模块的编译、发布;
1. 先创建一个空项目:
- GroupID 是项目组织唯一的标识符,实际对应JAVA的包的结构,是main目录里java的目录结构,第一段为域,第二段为公司名称,域又分为org、com、cn等等许多,其中org为非营利组织,com为商业组织。如
com.me.moduleName
。- ArtifactID是项目的唯一的标识符,实际对应项目的名称,就是项目根目录的名称。
接下来,一路按默认点击“下一步”,直至完成,得到下面的项目结构:
2. 创建子模块
按以下步骤,依次创建子模块toolkit-common
、toolkit-config
、toolkit-model
。
3. 最终项目结构
4. 问题记录
为什么要写这篇记录文档?
因为在刚开始创建时,我不是创建空项目,在第一步创建项目时,勾选了java,此时生成的项目就会带有src结构,如
java-toolkit
- src
- - main
为了创建最终效果的项目结构,我便手动删除了父目录的src,此时问题就出来了,每次新建子模块,父目录的src就会自动生成出来。
解决方案是:修改父目录下的build.gradle的默认配置,原数据如下:
plugins {
id 'java'
}
group 'com.vip.toolkit'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
}
修改如下:
allprojects {
group 'com.vip.toolkit'
version '1.0-SNAPSHOT'
repositories {
// 本地库,local repository(${user.home}/.m2/repository)
mavenLocal()
// Maven中心库(http://repo1.maven.org/maven2)
mavenCentral()
// 指定Maven库位置
maven { url "http://repo.maven.apache.org/maven2" }
}
}
subprojects {
// 引入java插件
apply plugin: 'java'
// 指定jvm版本
sourceCompatibility = 1.8
targetCompatibility = 1.8
// java编译的时候缺省状态下会因为中文字符而失败,所以这儿需要改为utf8
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
}
}
参考:https://michaelliuyang.github.io/projectsupport/2014/11/04/gradle-multi-project.html
https://developer.android.com/studio/build/dependencies