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 迁移的一些坑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 心态很容易受别人影响_为什么说缠论中的走
- 下一篇: python 一维数组所有元素是否大于_