项目模块化
在企业项目中,包层次和类关系比较复杂,把代码拆分成模块通常是最佳实践,这需要你清晰的划分功能的边界,比如把业务逻辑和数据持久化拆分开来。项目符合高内聚低耦合时,模块化就变得很容易,这是一条非常好的软件开发实践。
项目范围
model、repository、web 都是子项目。
allprojects 是所有的项目,比子项目就多一个 root 根项目。
新建一个 todo-gradle 的项目,里面有三个子模块。此时 setting.gradle 就会有变化,include 后面跟的就是子模块名字。gradle 的窗口也多了三个子模块,暂时没有任何依赖。
根据上面的图 repository 要依赖 model ,需要在 repository 模块里的 build.gradle 的脚本文件中添加如下脚本。
// 依赖子模块 model
compile project(':model')
添加完依赖点击刷新,发现 repository 模块中编译和运行时依赖都多了一个 model 模块。
根据上面的关系图 web 模块不仅依赖 repository 模块还依赖 model 模块。这时只需要在 web 的模块中添加一个 repository 的依赖就可以了。根据传递性依赖的原理 repository 也会将 model 带入到 web 模块中。添加配置如下。
// 依赖子模块 repository
compile project(':repository')
添加完脚本,刷新构建发现 web 模块中确实不仅依赖了 repository 模块也间接依赖了 model 模块。
配置优化
公共的插件配置
新建的项目里可以发现每个子模块的 build.gradle 的构建脚本里都有引入 java 这个插件。
这些公共的配置都可以提到总项目的 build.gradle 的脚本配置中,写一处所有子项目都拥有。
// 所有项目依赖的配置
allprojects {
apply plugin: 'java'
}
公共的依赖配置
现在要去每个子模块中都要依赖 log-back 这个jar包用于记录日志。
此时我们可以在总项目的 build.gradle 的配置脚本中添加如下配置。
// 所有子项目共享的依赖配置
subprojects {
repositories {
maven { url "http://maven.aliyun.com/nexus/content/groups/public/" }
mavenCentral()
}
dependencies {
compile 'ch.qos.logback:logback-classic:1.2.1'
testCompile group: 'junit', name: 'junit', version: '4.12'
}
}
统一管理version和group
项目的根目录下新建一个 gradle.properties 配置文件,文件名字一定要是这个名字不能随便定义,里面配置上 version 和 group 。之前每个子模块里都有版本和组的配置,这里配置了子模块里都可以删除了。group之前都有各自的现在统一成一个了。
version=1.0
group='com.avatar.todo'
#org.gradle.jvmargs=-Xmx1536M
#org.gradle.caching=true
#org.gradle.parallel=true
Gradle 默认的参数如果根据情况需要调整也可以配置到这个文件中,注释的部分配置就是关于Gradle 构建的优化配置。
项目的发布
下图是发布的详细流程图,通过 Gradle 构建工具将我们的jar包发布到本地仓库和远程仓库。
发布需要在总项目的 build.gradel 的脚本文件中添加如下脚本配置。
// 所有项目的依赖配置
allprojects {
apply plugin: 'java'
// 添加 maven-publish 插件
apply plugin: 'maven-publish'
// 发布配置
publishing {
publications {
myPublish(MavenPublication) {
from components.java
}
}
// 发布到的仓库
repositories {
maven {
name 'myRepo'
url ''
}
}
}
}
了解更多: