本篇主要探究一下 在使用Gradle 的時候一般會設定 maven 的本地倉庫的,那是不是Gradle 可以直接使用 maven本地倉庫的jar呢 ? 下面來探究一下
當我們在使用Gradle的時候 一設定一個 mavenLocal()
代表它會使用maven的本地倉庫, 此時是不是直接用了maven的本地倉庫中的jar包呢? 新版本好像已經可以直接使用maven倉庫中的 jar 了 不過老版本好像是不行的
Gradle version : 7.1
下面我把maven 的倉庫和 Gradle的倉庫放到同一個目錄下面 看看會產生什麼效果, 如果依賴的jar 只有一份 那麼就是公用了
為了測試 我先把maven 的settings檔案中設定的 localRepository 改成一個空的目錄repository_maven_gradle_test
<localRepository>/Users/johnny/.m2/repository_maven_gradle_test</localRepository>
預設gradle倉庫位置為~/.gradle/caches/modules-2/files-2.1/....
那麼如何改變這個位置呢?需要設定環境變數GRADLE_USER_HOME
, 指定新的目錄即可
這裡把 gradle 的本地倉庫設定到如下的目錄 和 maven 一致
export GRADLE_USER_HOME=/Users/johnny/.m2/repository_maven_gradle_test
#隨便找個目錄執行 ,我這裡就在 ~/.m2/下執行的
mkdir maven_project_demo
vim maven_project_demo/pom.xml
新增pom.xml 檔案內容如下 隨便依賴一個jar 這裡選擇lombok
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.johnny</groupId>
<artifactId>mavenprojectdemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mavenprojectdemo</name>
<description>mavenprojectdemo</description>
<dependencies>
<!--引入外掛lombok 自動的set/get/構造方法外掛 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
</dependencies>
</project>
通過Gradle 提供的init方式直接初始化
gradle init
Select type of project to generate:
1: basic
2: application
3: library
4: Gradle plugin
Enter selection (default: basic) [1..4] 2
Select implementation language:
1: C++
2: Groovy
3: Java
4: Kotlin
5: Scala
6: Swift
Enter selection (default: Java) [1..6] 3
Split functionality across multiple subprojects?:
1: no - only one application project
2: yes - application and library projects
Enter selection (default: no - only one application project) [1..2] 1
Select build script DSL:
1: Groovy
2: Kotlin
Enter selection (default: Groovy) [1..2] 1
Select test framework:
1: JUnit 4
2: TestNG
3: Spock
4: JUnit Jupiter
Enter selection (default: JUnit Jupiter) [1..4] 1
Project name (default: gradle_project_demo): gradle_project_demo
Source package (default: gradle_project_demo): com.johnny.gradleprojectdemo
build.gradle新增 lombok
implementation group: 'org.projectlombok', name: 'lombok', version: '1.18.24'
cd maven_project_demo
mvn clean compile #執行maven compile
此時檢視 repository_maven_gradle_test
倉庫目錄 已經有了依賴
cd gradle_project_demo
gradle classes # gradle 編譯命令
再次檢視 倉庫發現多了一個 caches
cd caches/modules-2/files-2.1 # 預設的gradle 的jar位置
可以發現 並沒有 org.projectlombok
用idea開啟lombok 的jar 的依賴位置 發現 確實是 直接使用了 maven 中的jar 了, 這個可能是新版本的優化?
cd repository_maven_gradle_test
rm -rf * #先清空倉庫
cd gradle_project_demo
gradle classes # 先執行 gradle 專案的
因為思考 Gradle 和 Maven 的本地倉庫設定為一樣,那Jar能不能共用的探究得出 如下總結:
~/.gradle/caches/modules-2/files-2.1/...
GRADLE_USER_HOME
指向一個目錄即可,此時倉庫就是GRADLE_USER_HOME/caches/modules-2/files-2.1/...
如果把Gradle GRADLE_USER_HOME設定為 maven 本地倉庫的時候 新版本確實可以直接使用 maven 中的jar 了
不建議把 Gradle 的倉庫設定的和 Maven 的一樣
最好分開 或者直接使用預設的 即可, 因為它們的jar管理方式都不一樣多思考! 多實踐!
歡迎大家存取 個人部落格 Johnny小屋
歡迎關注個人公眾號