
用gradle构建一个java项目,以及自定义打包。
最近公司要求,新的项目要用gradle来代替maven来构建项目,自己也踩了很多坑,分享一下。
·
0 起因
最近公司要求,新的项目要用gradle来代替maven来构建项目,自己也踩了很多坑,分享一下。
本次gradle的版本为7.x
1 gradle-wrapper
Gradle Wrapper(以下简写为“Wrapper”)用于管理当前项目的Gradle版本,Gradle官方强烈推荐使用Wrapper构建项目。多人协作时,必须规定项目的Gradle版本,并以此版本的Gradle作为项目的构建工具,由于每个人在本地安装的Gradle版本可能并不一致(也没有必要一致),因此有必要在项目中统一管理Gradle版本。
1.1 引入
- 使用
gradle init
创建新项目,则会初始化一个带有Wrapper的Gradle项目。 - 使用
gradle wrapper
在旧的项目中添加Wrapper。 - idea自动添加。(本次gradle完全使用idea管理的gradle)
2 目录结构
2.1 单模块
├── build.gradle # 描述子项目的依赖和构建等信息,类似于pom
├── settings.gradle # 描述根目录和子项目的关键信息
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar # 一个很轻量的可执行jar,用于下载Gradle
│ └── gradle-wrapper.properties # 描述gradle版本和下载相关配置
├── gradlew # Wrapper的shell script # Wrapper的shell script
└── gradlew.bat # Wrapper的cmd script
2.2 多模块
├─build.gradle # 描述根项目的依赖和构建的核心文件
├─settings.gradle # 描述根目录和子项目的关键信息
├─gradlew # Wrapper的shell script
├─gradle.bat # Wrapper的cmd script
├─application-api
│ ├─build.gradle # 描述子项目的依赖和构建等信息
│ └─src
│ └─main
│ └─java
│ └─com.example.x
├─application-boot
│ ├─build.gradle # 描述子项目的依赖和构建等信息
│ └─src
│ ├─main
│ │ ├─java
│ │ │ └─com.example.x
│ │ └─resources
│ └─test
│ └─java
│ └─com.example.x
├─application-core
│ ├─build.gradle # 描述子项目的依赖和构建等信息
│ └─src
│ └─main
│ └─java
│ └─com.example.x
└─gradle
└─wrapper
├─gradle-wrapper.jar # 一个很轻量的可执行jar,用于下载Gradle
└─gradle-wrapper.properties # 描述gradle版本和下载相关配置
2.3 执行gramlin命令
在项目的根目录下执行gradlew命令来代替gradle
例:列出所有的任务
$ ./gradlew tasks
3 新建一个gradle项目
3.1 单模块
等待idea下载默认的gradle并初始化好项目后
3.1.1 gradle-wrapper.properties
#解压gradle的总目录
distributionBase=GRADLE_USER_HOME
#解压gradle总目录下的目录
distributionPath=wrapper/dists
#下载gradle的地址,和版本
#1. gradle-xx-all.zip是完整版,包含了各种二进制文件,源代码文件,和离线的文档。
#2. gradle-xx-bin.zip是二进制版,只包含了二进制文件(可执行文件),没有文档和源代码。
#3. gradle-xx-src.zip是源码版,只包含了Gradle源代码,不能用来编译你的工程。
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
#下载gradle的总目录
zipStoreBase=GRADLE_USER_HOME
#下载gradle总目录下的目录
zipStorePath=wrapper/dists
GRADLE_USER_HOME
:环境变量(类似于JAVA_HOME
),gradle的用户目录,里面放gradle的相关配置等,类似于maven的.m2的文件路径。
- Mac的默认目录是:/Users/xxx/.gradle
- Windows的默认目录是:C:/用户/xxx/.gradle
3.1.2 settings.gradle
/**
* 项目的名称
*/
rootProject.name = 'gradle-demo-project'
3.1.3 build.gradle
/**
* 插件
*/
plugins {
/**
* 使用 'java-library' 代替 'java',功能更健全
*/
id 'java-library'
/**
* 发布到仓库的插件
*/
id 'maven-publish'
}
group 'org.example'
version '1.0-SNAPSHOT'
publishing {
publications {
/**
* 默认发布
* 默认的POM标识
* groupId -> project.group
* artifactId -> project.name
* version -> project.version
*/
maven(MavenPublication) {
from components.java
}
/**
* 自定义发布
*/
/*maven(MavenPublication) {
groupId = 'org.gradle.sample'
artifactId = 'library'
version = '1.1'
from components.java
}*/
}
/**
* 发布到私服
*/
repositories {
maven {
/**
* 7.0 指定是否可以通过不安全的 HTTP 连接与存储库进行通信。
*/
allowInsecureProtocol(true)
/**
* 发布url,来自于/Users/xxx/.gradle/gradle-wrapper.properties
*/
url nexus_publish_url
/**
* maven私服配置,为了避免密码明文,将用户名和密码申明成全局变量,在/Users/xxx/.gradle/gradle-wrapper.properties
*/
credentials{
username nexus_username
password nexus_password
}
}
}
}
repositories {
/**
* maven私服配置,maven mavenLocal谁在前先找谁
*/
maven {
/**
* 7.0 指定是否可以通过不安全的 HTTP 连接与存储库进行通信。
*/
allowInsecureProtocol(true)
/**
* 来自于/Users/xxx/.gradle/gradle-wrapper.properties的全局变量
*/
url nexus_url
}
/**
* 优先找.m2路径下的settings.xml,如果没有的话使用默认的本地仓库地址.m2/repository
* gradle建议避免使用mavenLocal(),Gradle不为本地存储库执行任何缓存,将影响构建性能
*/
mavenLocal()
}
configurations.all {
/**
* 全局排除依赖
*/
exclude module: 'logback-core'
resolutionStrategy {
/**
* 强制某个依赖使用某个版本
*/
force('org.slf4j:slf4j-api:1.7.15')
}
}
dependencies {
/**
* 引入依赖,不会传递
*/
implementation 'com.fasterxml.jackson.core:jackson-annotations:2.13.2'
/**
* 引入依赖,会传递
*/
api 'com.fasterxml.jackson.core:jackson-core:2.13.2'
/**
* 排除依赖
*/
implementation ('ch.qos.logback:logback-classic:1.2.9'){
exclude group: 'org.slf4j',module: 'slf4j-log4j12'
}
/**
* 引入测试依赖
*/
testImplementation 'com.fasterxml.jackson.core:jackson-core:2.13.2'
/**
* 如果要引入lombok这种,必然有annotationProcessor和testAnnotationProcessor,不然会报错
* 不同版本的gradle对lombok的注解支持版本不一样,请查看官网
*/
annotationProcessor 'org.projectlombok:lombok:1.18.12'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.12'
implementation 'org.projectlombok:lombok:1.18.12'
}
/**
* 复制src/main/resources/application.yml到构建目录(默认build)下的 项目名-server目录。$rootProject.name是settings.gradle中的项目名称
* 本项目:复制src/main/resources/application.yml到/build/gradle-demo-project/
*/
task copyApplication(type: Copy) {
into "$buildDir/$rootProject.name-server"
from "src/main/resources/application.yml"
}
/**
* 复制/bin目录下的除去version其他文件到/build/gradle-demo-project/bin/
*/
task copyBin(type: Copy) {
into "$buildDir/$rootProject.name-server/bin"
from "bin"
exclude "version"
}
/**
* 复制/build/libs/和项目依赖的所有jar到build/gradle-demo-project/lib/
*/
task copyToLib(type: Copy) {
into "$buildDir/$rootProject.name-server/lib"
from "$buildDir/libs"
from configurations.runtimeClasspath
}
/**
* 打zip包
*/
task dist(type: Zip) {
/**
* 执行copyApplication
*/
dependsOn copyApplication
/**
* 执行copyBin
*/
dependsOn copyBin
/**
* 执行copyToLib
*/
dependsOn copyToLib
/**
* 打包哪个文件
*/
from "$buildDir/$rootProject.name-server"
/**
* 打包的目标路径
*/
destinationDir file('build')
/**
* 打包名称
*/
baseName "$project.name"
}
/**
* build后进行dist方法
*/
build.finalizedBy(dist)
3.1.3.1 build后的效果图
3.1.3.2 引入发布插件
- generatePomFileForPubNamePublication
- 为名为PubName的发布创建 POM 文件,填充已知的元数据,例如项目名称、项目版本和依赖项。
- POM 文件的默认位置是build/publications/$pubName/pom-default.xml。
- publishPubNamePublicationToRepoNameRepository
- 将PubName发布发布到名为RepoName的存储库。
- 如果您有一个没有明确名称的存储库定义,则 RepoName将为“Maven”。
- publishPubNamePublicationToMavenLocal
- 将PubName发布复制到本地 Maven 缓存(通常是$USER_HOME/.m2/repository)以及发布的 POM 文件和其他元数据。
- publish
- 取决于:所有任务publishPubNamePublicationToRepoNameRepository
- 将所有定义的发布发布到所有定义的存储库的聚合任务。它不包括将发布复制到本地 Maven 缓存。
- publishToMavenLocal
- 取决于:所有任务publishPubNamePublicationToMavenLocal
- 将所有定义的发布复制到本地 Maven 缓存,包括它们的元数据(POM 文件等)。
更多推荐
所有评论(0)