Maven-Gradle專案管理
最近在練手一個專案,服務端用Maven管理,Android端用Gradle管理,著實坑點太多,因此本文持續更新,以備其他人少走彎路。
Failed to resolve: XXX
網上許多這個錯誤的文章集中於依賴他人的專案失敗。如果這個專案是自己上傳的呢?
我的服務端專案結構如下:
mata-entity這個子模組需要和APP端共享,因此打算將它打包上傳到私服,然後Gradle新增這個專案的依賴。上傳成功後,私服已經可以看到我上傳的jar包,並且Maven管理的專案能夠從私服下載jar包。但!是!AS上添加了mata-entity依賴後,gradle報錯:
Failed to resolve: com.synaric.web:mata-entity:0.0.1-SNAPSHOT
嘗試gradlew -stacktrace
,具體報錯的節選如下:
POM檔案解析失敗了。對比了下正常依賴的POM檔案,發現我的mata-entity的POM檔案中多了parent節點,而父模組mata的POM檔案不在私服上,自然解析失敗。
目前,最快捷的解決辦法是:將整個mata專案打包上傳私服(打包專案的過程搜尋maven deploy
網上一大把,不贅述了),有更好的解決辦法望告知。
Gradle無法更新snapshot的依賴
網路上的解決辦法是在根級別build.gradle上新增如下程式碼:
configurations.all {
resolutionStrategy. cacheDynamicVersionsFor 0, 'seconds'
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}
其原理是讓Gradle的快取失效,強制更新依賴。反正在我這裡不起作用。還有人提議這麼寫依賴:
compile (group : 'com.synaric.web', name : 'mata-entity', version : '0.0.1-SNAPSHOT') {
changing = true;
}
額,無效。
既然是快取問題,我去刪快取總行了吧。找到快取,刪除com.synaric.web
C:\Users\Administrator.gradle\caches\modules-2\files-2.1\com.synaric.web
如果到這地步仍然無效,恭喜你,你像我一樣浪費了一小時。看起來在Gradle上,即使標註snapshot而版本號不變,也無法良好識別。那麼最速解決辦法,就是每釋出一個jar都要更新版本。將服務端的mata-entity版本提升為0.0.2,並修改APP端依賴:
compile 'com.synaric.web:mata-entity:0.0.2'
問題解決了,比Maven-Maven專案依賴稍微複雜。有更好的解決方案望指教。
DuplicateFileException: Duplicate files copied in XXX
還是上述那個mata-entity的jar包報錯了。當我嘗試執行APP端debug的時候有如下錯誤:
Error:Execution failed for task ‘:app:transformResourcesWithMergeJavaResForDebug’.
>com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException:
copied in APK META-INF/maven/com.synaric.web/mata-entity/pom.xml
File1: C:\Users\Administrator.gradle\caches\modules-2\files-2.1\com.synaric.web\mata-entity\0.0.3-SNAPSHOT\fc616448b724ae88ebdbee3ae06fbcb17ca410d0\mata-entity-0.0.3-SNAPSHOT.jar
File2: C:\Users\Administrator.gradle\caches\modules-2\files-2.1\com.synaric.web\mata-entity\0.0.3-SNAPSHOT\fc616448b724ae88ebdbee3ae06fbcb17ca410d0\mata-entity-0.0.3-SNAPSHOT.jar
是的你沒有看錯,兩個一模一樣的檔案。這時按照網上所說,改動專案的build.gradle無效:
android {
...
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
}
}
突然異想天開,嘗試直接解壓jar包,等等發生了什麼……
pom.xml看起來解壓了兩次?!
苦苦搜尋Maven的打包配置,終於發現一個外掛,能夠在打包jar時排除檔案!
在Maven專案里加入如下外掛並Update Project...
:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<excludes>
<exclude>**/pom.xml</exclude>
<exclude>**/*.properties</exclude>
</excludes>
</configuration>
</plugin>
重新打包,檢視jar包發現那個坑爹的pom.xml和.properties檔案還在,並沒有排除掉(原理不明),但是解壓jar包已經不會提示覆蓋了。在Gradle專案引入這個jar包,完美解決。