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

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

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

image-20221129145835288

思考

當我們在使用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'

image-20221129140443834

驗證

maven項目執行下載依賴

cd maven_project_demo
mvn clean compile #執行maven compile

image-20221129140744732

此時查看 repository_maven_gradle_test 倉庫目錄 已經有了依賴

image-20221129140940241

gradle項目執行下載依賴

cd gradle_project_demo
gradle classes # gradle 編譯命令

image-20221129141055849

再次查看 倉庫發現多了一個 caches

image-20221129141145953

cd  caches/modules-2/files-2.1 # 默認的gradle 的jar位置

可以發現 並沒有 org.projectlombok

image-20221129141258098

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

image-20221129144330490

反過來 執行gradle

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

cd gradle_project_demo
gradle classes # 先執行 gradle 項目的

image-20221129144736818

總結

因爲思考 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小屋
歡迎關注個人公衆號

歡迎關注個人公衆號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章