IDEA 使用gradle开发java项目总结
(一)windows环境下gradle下载安装
官网下载 https://services.gradle.org/distributions/
选择bin或者all版本,下载后放在任意文件夹内解压即可,然后配置到Path环境变量中。
GRADLE_HOME:D:\gradle\gradle-6.7.1\bin
GRADLE_USER_HOME:C:\Users\xxx\.gradle (默认仓库)
C:\Users\xxx\.gradle\caches\modules-2\files-2.1 (资源下载的位置--jar包位置)
gradle的默认仓库位置是在C盘,不能像maven一样通过修改配置文件settings.xml改变位置,但是可以通过GRADLE_USER_HOME这个环境变量修改,本文暂不修改,使用默认值。
cmd输入gradle -v可以查看是否安装成功。
(二)IDEA 配置
配置插件 file–settings
配置为下载的 Gradle
其中Gradle user home为设置的jar包下载后存储的位置,默认为截图中的路径。
Build默认是gradle进行的,修改为IDEA Build,使用默认的可能速度慢一点,不在意的话可以不修改,使用默认即可。
(三)IDEA新建gradle项目(springboot)
<1> 新建gradle项目
项目目录如下:
其中 build.gradle 和 settings.gradle 是配置文件,在后面统一讲解参数含义。
通过这种方式新建的gradle项目是不适配springboot的,需要自行配置build.gradle,建议使用第二种方法。
<2> 新建spring项目
选择自己需要的,或者空白也行,后面需要什么再按需添加对应依赖。
初始 build.gradle 如下,已经帮我们设置好了springboot相关的配置。
plugins {
id 'org.springframework.boot' version '2.4.1'
id 'io.spring.dependency-management' version '1.0.10.RELEASE'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
test {
useJUnitPlatform()
}
(四)build.gradle讲解
接下来详细解析一下build.gradle文件的内容以及具体配置
build.gradle相当于maven里面的pom.xml,setting.gradle用于多模块的配置。下面是一个完整项目的build.gradle,比较重要的其实是dependencies,像Maven一样添加依赖即可。
在idea中,复制好maven的xml格式依赖 直接粘贴到gradle的dependencies节点里面它会自动调整成compile ‘groupId :artifactId:version’ 而不需要我们手动去改。
// 插件配置
plugins {
id 'org.springframework.boot' version '2.4.1' // 使用spring boot
id 'io.spring.dependency-management' version '1.0.10.RELEASE' // 使用spring boot的自动依赖管理
id 'java'
id 'idea'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
targetCompatibility = '1.8'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
//项目里需要依赖的jar的库
repositories {
// 本地库 本地仓库在配置maven时setting文件指定的仓库位置 C:\Users\xxx\.m2
// mavenLocal()
// 使用国内的源
maven { url 'https://maven.aliyun.com/repository/public' }
// 中央仓库
mavenCentral()
}
// 复制好maven的xml格式依赖 直接粘贴到dependencies节点里面 !!!
// 它会自动调整成compile 'groupId :artifactId:version' !!!
// complie:编译范围依赖在所有的 classpath 中可用,同时它们也会被打包,这个是最常用的
// compile files是从本地的lib目录下寻找xx.jar这个文件进行编译并打包
// compile fileTree(dir: 'libs', include: '*.jar')意思是将lib目录下所有jar文件进行编译并打包
// compile project是将另一个module(等同eclipse中的library库文件)进行编译并打包。
// api 完全等同于 compile指令
// implementation 使用该命令编译的依赖,对该项目有依赖的项目将无法访问到使用该命令编译的依赖中的任何程序,也就是将该依赖隐藏在内部,而不对外部公开。
// 这个依赖在编译时不能暴露给其他模块,例如依赖此模块的其他模块。这种方式指定的依赖在编译时只能在当前模块中访问。
// runtime:runtime 依赖在运行和测试系统的时候需要,但在编译的时候不需要。
// testComplie:测试期编译需要的附加依赖
// testRuntime:测试运行期需要
// annotationProcessor 用于注解处理器的依赖配置
// testImplementation 用于指定在测试代码的依赖
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.kafka:spring-kafka'
implementation 'org.springframework.boot:spring-boot-starter-data-rest'
implementation 'org.hibernate:hibernate-core:5.3.0.Final'
implementation 'org.springframework.data:spring-data-rest-webmvc:3.3.0.RELEASE'
implementation 'org.springframework.boot:spring-boot-starter-websocket'
implementation 'org.springframework:spring-websocket'
compile 'io.jsonwebtoken:jjwt:0.9.0'
compile 'com.auth0:java-jwt:3.9.0'
compile 'com.alibaba:fastjson:1.2.51'
implementation fileTree(dir: 'lib', include: ['*.jar'])
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.kafka:spring-kafka-test'
}
//test {
// useJUnitPlatform()
//}
jar {
String someString = ''
configurations.runtime.each {someString = someString + " lib\\"+it.name}
manifest {
attributes 'Main-Class': 'MainApplication'
attributes 'Class-Path': someString
}
}
//清除上次的编译过的文件
task clearPj(type:Delete){
delete 'build','target'
}
task copyJar(type:Copy){
from configurations.runtime
into ('build/libs/lib')
}
//把JAR复制到目标目录
task release(type: Copy,dependsOn: [build,copyJar]) {
// from 'conf'
// into ('build/libs/eachend/conf') // 目标位置
}
// 打包:运行build会生成一个build文件夹 class文件和jar包都在里面
// gradle init --type pom
// 根据pom文件自动生成gradle项目所需的文件和配置,然后以gradle项目重新导入即可
关于gradle中dependencies的compile、api、provided、implementation等关键词的使用方法和区别可以参考此博文。
简单区别:
complie:编译范围依赖在所有的 classpath 中可用,同时它们也会被打包,这个是最常用的
runtime:runtime 依赖在运行和测试系统的时候需要,但在编译的时候不需要。
testComplie:测试期编译需要的附加依赖
testRuntime:测试运行期需要
implementation和api
implementation和api是取代之前的compile的,其中api和compile是一样的效果,implementation有所不同,通过implementation依赖的库只能自己库本身访问,举个例子,A依赖B,B依赖C,如果B依赖C是使用的implementation依赖,那么在A中是访问不到C中的方法的,如果需要访问,请使用api依赖
compile only
compile only和provided效果是一样的,只在编译的时候有效, 不参与打包
runtime only
runtimeOnly 和 apk效果一样,只在打包的时候有效,编译不参与
test implementation
testImplementation和testCompile效果一样,在单元测试和打包测试apk的时候有效
debug implementation
debugImplementation和debugCompile效果相同, 在debug模式下有效
release implementation
releaseImplementation和releaseCompile效果相同,只在release模式和打包release包情况下有效
引入第三方jar包(本地jar)
- 在src目录下新建文件夹lib
- 复制要导入的jar包
- 将复制的jar包导入到lib文件夹下
- 配置build.gradle
特别说明:打包时本地jar也会随之被打包进去,不需要额外配置!!!
implementation fileTree(dir: 'lib', include: ['*.jar'])
gradle仓库(repositories )设置
可能的设置有如下几种:
repositories {
mavenLocal()
maven { url "http://maven.aliyun.com/nexus/content/groups/public/"}
mavenCentral()
jcenter()
maven { url "https://repo.spring.io/snapshot" }
maven { url "https://repo.spring.io/milestone" }
maven { url 'http://oss.jfrog.org/artifactory/oss-snapshot-local/' } //转换pdf使用
}
存储库只是文件的集合,按分组,名称和版本来组织构造。 默认情况下,Gradle不定义任何存储库。 这里使用repositories 指定存储库。
mavenLocal():指定使用maven本地仓库,而本地仓库在配置maven时setting文件指定的仓库位置。同时将setting文件拷贝到C:\Users\xxx.m2目录下,一般该目录下是没有setting文件的,gradle查找jar包顺序如下:gradle默认会按以下顺序去查找本地的仓库:USER_HOME/.m2/settings.xml >> M2_HOME/conf/settings.xml >> USER_HOME/.m2/repository。
maven { url “http://maven.aliyun.com/nexus/content/groups/public/”}:指定阿里云镜像加速地址
mavenCentral():这是Maven的中央仓库,无需配置,直接声明就可以使用
jcenter():JCenter中央仓库,实际也是是用的maven搭建的,但相比Maven仓库更友好,通过CDN分发,并且支持https访问。
后面的maven { url 地址},指定maven仓库,一般用私有仓库地址或其它的第三方库
gradle按配置顺序寻找jar文件。如果本地存在就不会再去下载。不存在的再去maven仓库下载,这里注意下载下来的jar文件不在maven仓库里,而是在gradle的主工作目录下,如上面的D:.gradle目录
文件里共有两个repositories ,含义不同:
buildScript {
repositories {
mavenCentral()
}
}
repositories {
mavenCentral()
}
buildScript里的repositories是这个脚本需要的依赖库,与项目无关,在执行脚本时,会从这个库里download对应的jar和插件。第二个repositories是项目里需要依赖的jar的库
简单gradle命令
assemble: 编译
build:编译并执行测试
clean:删除build目录
jar: 生成jar包
test:执行单元测试
参考博客:https://www.jianshu.com/p/22f0d9eac9b4
https://www.awaimai.com/2621.html