日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

gradle 的cas 转maven_Gradle 历险记(二):从 maven 到 gradle 迁移的一些坑

發布時間:2024/10/8 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gradle 的cas 转maven_Gradle 历险记(二):从 maven 到 gradle 迁移的一些坑 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近寫 project,但線上發布需要使用 gradle,開發的時候并沒有思考這件事,所以就埋了一個巨大的坑,本文描述一下這個惡心的過程,浪費了我一整天的時間。

一、安裝指定版本的gradle

第一步其實可以不做,但是因為我這個網絡實在是太爛了,讓Intellij去下載 gradle 經常下崩,線上用了某版本的gradle,記為A 版本吧。

我是 Mac,推薦使用 brew 來進行這個操作,但是 brew 是無法安裝老版本的,所以就需要找到那個特定的版本,搜了很多,這里提供一個比較笨的方法。

說一下 brew 的原理,brew install 其實是去尋找一個同名的 ruby 腳本,去執行一遍,這些 ruby 被存儲在https://github.com/Homebrew/homebrew-core.git這個倉庫里,找到里面的 gradle.rb 的修改歷史,但由于這個倉庫過于大,網頁上不讓操作,所以只能 clone 下來本地操作,這個就很惡心了,需要花費硬盤空間和網速。

之后拿到那個特定分支的 rb 文件,

brewinstallgradle.rb?即可。

二、將pom轉為build.gradle

gradle 本身提供這個操作,命令是

gradleinit--typepom?,就會根據pom.xml自動生成

build.gradle? 和

settings.gradle?。但這玩意似乎挺破的,遇到不認識的、不常見的標簽,就直接跳過了,所以語意可能會改變,需要手動 patch 一些東西。

以我這個項目為例,是 Java 項目,maven 編譯時候先按照規則生成一些 java 文件,這些 java 文件將來會當做源碼來處理。

坑就在這個地方,這部分代碼是沒有被 gradle 自動生成的,直接使用會出現 ClassNotFound 的問題,所以我們不能直接刪掉 pom.xml,需要借助它替我們生成一些代碼。

暫時的解決方案就是,把這些生成出來的 java 文件也添加到git倉庫里,反正也不大。

但這樣操作之后仍然是 ClassNotFound,搜索發現代碼明明在里面,所以應該是沒找到,發現是 pom 里的 sourceSets 沒有被加到gradle里,所以也要手動加。這個故事告訴我們,一定要把 pom 里的主要邏輯都移植過去,自動初始化很蠢的。

加完之后,就沒有問題了,ok,算是解決了,進入下一個坑。

三、項目依賴的移植

在 pom 的依賴里,曾經是多個項目放在同一個目錄下,pom.xml里用

subA

subB

subC

1

2

3

4

5

subA

subB

subC

這樣subA/B/C就可以相互訪問到了,很簡潔。

A、B、C 是可以相互知道對方的存在的,假設C 依賴 A 和 B,那么直接在C 的pom.xml里,寫好 A 和 B 的 groupId 和 artifactId 和 版本號即可,不需要額外操作。優先從本地獲取模塊。

但是 gradle 這樣做是不行的,就算在 build.gradle 里寫的是 A 和 B 的信息,但也不會從本地拿,而是嘗試從網絡上搜索 A 和 B。

最終的解決方案有兩個,一個是使用平級依賴,一個是使用發布 maven 到本地這個功能。

先說平級依賴,settingsC.gradle里要寫明 A 和 B,使用

includeFlat("subA")

1

includeFlat("subA")

即可,這時候可以用

":subA"?來表示 moduleA。

之后修改 buildC.gradle 里的內容,在dependencies里加入

compile project(":subA")

1

compileproject(":subA")

就會將 moduleA 加入到依賴中。

嗯,在 Intellij 的右側可以正常發現這個模塊了。

再說第二個方法,將 maven 倉庫發布到本地。需要借助名叫

maven-publishing? 的gradle 插件,之后使用

publishingToMavenLocal? 即可在本地臨時發布,之后按照最常用的方式導入即可。但是存在缺點,每次都要手動來發布一遍很煩,所以推薦使用第一種方法。

再插播一個小 tips,在最外層的 settings.gradle 里包含 subA 和 subB的時候,默認是去找 subA 這個目錄,可以通過這句話來指定文件夾。

include(":subA")

project(":subA").projectDir = new File(settingsDir, 'path/to/subA')

1

2

include(":subA")

project(":subA").projectDir=newFile(settingsDir,'path/to/subA')

四、ban 掉 test

這步也不是必須的,但是作為開發者,我并不關心我依賴的庫是否 test 通過了,關我屁事,所以可以使用這個語句來關掉。

tasks.withType(Test) {enable=false;}

1

tasks.withType(Test){enable=false;}

其實不是我想關掉它,實在是因為依賴的 test 一直都過不去,懶得修好它,就直接 ban 掉吧,又不是不能用。

五、gradle 編譯一個帶有依賴的 jar 包(此處不大優雅,偶爾能用,推薦閱讀另外一篇關于打包的文章)

默認情況下,調用 gradle jar 只會打包自己的代碼,缺失所有的依賴庫。這里推薦一款叫

com.github.johnrengelman.shadow? 的插件。

apply plugin: 'com.github.johnrengelman.shadow'

sourceCompatibility = 1.8

buildscript {

repositories {

maven {

url "https://plugins.gradle.org/m2/"

}

}

dependencies {

classpath "com.github.jengelman.gradle.plugins:shadow:1.2.3"

}

}

shadowJar {

classifier = null

version = null

zip64 true

manifest {

attributes 'Main-Class': 'com.example.Main'

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

applyplugin:'com.github.johnrengelman.shadow'

sourceCompatibility=1.8

buildscript{

repositories{

maven{

url"https://plugins.gradle.org/m2/"

}

}

dependencies{

classpath"com.github.jengelman.gradle.plugins:shadow:1.2.3"

}

}

shadowJar{

classifier=null

version=null

zip64true

manifest{

attributes'Main-Class':'com.example.Main'

}

}

之后使用

gradleshadowJar?就可以拿到編譯好的jar包了,里面是各種各樣的 class 文件。

完結~~ gradle 基本操作,大神勿噴。。。

=============================================================

隨著訪客的增多,LeadroyaL在本站流量的開支越來越多了,曾經1元能用1個月,現在1元只能用3天。如果覺得本文幫到了你,希望能夠為服務器的流量稍微打賞一點,謝謝!

總結

以上是生活随笔為你收集整理的gradle 的cas 转maven_Gradle 历险记(二):从 maven 到 gradle 迁移的一些坑的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。