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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值