Gradle 使用maven本地倉庫 帶來的思考

2022-12-10 06:00:58

Gradle 使用maven本地倉庫 帶來的思考

本篇主要探究一下 在使用Gradle 的時候一般會設定 maven 的本地倉庫的,那是不是Gradle 可以直接使用 maven本地倉庫的jar呢 ? 下面來探究一下

思考

當我們在使用Gradle的時候 一設定一個 mavenLocal() 代表它會使用maven的本地倉庫, 此時是不是直接用了maven的本地倉庫中的jar包呢? 新版本好像已經可以直接使用maven倉庫中的 jar 了 不過老版本好像是不行的

驗證方式

Gradle version : 7.1

下面我把maven 的倉庫和 Gradle的倉庫放到同一個目錄下面 看看會產生什麼效果, 如果依賴的jar 只有一份 那麼就是公用了

準備環境

設定maven 的 localRepository

為了測試 我先把maven 的settings檔案中設定的 localRepository 改成一個空的目錄repository_maven_gradle_test

<localRepository>/Users/johnny/.m2/repository_maven_gradle_test</localRepository>

設定Gradle 的預設本地倉庫

預設gradle倉庫位置為~/.gradle/caches/modules-2/files-2.1/....

那麼如何改變這個位置呢?需要設定環境變數GRADLE_USER_HOME, 指定新的目錄即可

這裡把 gradle 的本地倉庫設定到如下的目錄 和 maven 一致

export GRADLE_USER_HOME=/Users/johnny/.m2/repository_maven_gradle_test

建立maven 專案

#隨便找個目錄執行 ,我這裡就在 ~/.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 專案

通過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'

驗證

maven專案執行下載依賴

cd maven_project_demo
mvn clean compile #執行maven compile

此時檢視 repository_maven_gradle_test 倉庫目錄 已經有了依賴

gradle專案執行下載依賴

cd gradle_project_demo
gradle classes # gradle 編譯命令

再次檢視 倉庫發現多了一個 caches

cd  caches/modules-2/files-2.1 # 預設的gradle 的jar位置

可以發現 並沒有 org.projectlombok

用idea開啟lombok 的jar 的依賴位置 發現 確實是 直接使用了 maven 中的jar 了, 這個可能是新版本的優化?

反過來 執行gradle

cd repository_maven_gradle_test
rm -rf * #先清空倉庫

cd gradle_project_demo
gradle classes # 先執行 gradle 專案的

總結

因為思考 Gradle 和 Maven 的本地倉庫設定為一樣,那Jar能不能共用的探究得出 如下總結:

  1. Gradle 預設本地倉庫在 ~/.gradle/caches/modules-2/files-2.1/...
  2. 修改 Gradle 預設本地倉庫 只需要設定環境變數 GRADLE_USER_HOME 指向一個目錄即可,此時倉庫就是GRADLE_USER_HOME/caches/modules-2/files-2.1/...
  3. 如果把Gradle GRADLE_USER_HOME設定為 maven 本地倉庫的時候 新版本確實可以直接使用 maven 中的jar 了
  4. 最後 不建議把 Gradle 的倉庫設定的和 Maven 的一樣 最好分開 或者直接使用預設的 即可, 因為它們的jar管理方式都不一樣
  5. 網上的一些文章 說只是把maven倉庫中的jar 複製到 caches 中去, 可能是以前的 Gradle版本 , 我實驗的7.1 確實沒有複製到caches 中

多思考! 多實踐!

歡迎大家存取 個人部落格 Johnny小屋
歡迎關注個人公眾號