1. 程式人生 > >Maven-Gradle專案管理

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包,完美解決。