修复ivy由于sha1码不正确导致找不到模块(jar)的错误

Table of Contents

问题描述

在运行 ant resolve 时出现如下信息:

 1: [ivy:retrieve]  problem while downloading module descriptor: SshResource:/home/k
 2: fs/repository/shared/com.ztools/z-xml/1.0/ivys/ivy.xml (1073)]:
 3: invalid sha1:
 4: expected=b5eb4687b80aec44ea9d06a3c07432d199d965de
 5: computed=64a256acca7c2eb97917957703fb3e8454677459 (63ms)
 6: [ivy:retrieve]          module not found: com.ztools#z-xml;1.0
 7: [ivy:retrieve]  ==== local: tried
 8: [ivy:retrieve]    E:\Zhong Lizhi\.ivy2/local/com.ztools/z-xml/1.0/ivys/ivy.xml
 9: [ivy:retrieve]    -- artifact com.ztools#z-xml;1.0!z-xml.jar:
10: [ivy:retrieve]    E:\Zhong Lizhi\.ivy2/local/com.ztools/z-xml/1.0/jars/z-xml.jar
11: [ivy:retrieve]  ==== shared: tried
12: [ivy:retrieve]    /home/kfs/repository/shared/com.ztools/z-xml/1.0/ivys/ivy.xml
13: [ivy:retrieve]  ==== public: tried
14: [ivy:retrieve]    http://repo1.maven.org/maven2/com/ztools/z-xml/1.0/z-xml-1.0.pom
15: [ivy:retrieve]    -- artifact com.ztools#z-xml;1.0!z-xml.jar:
16: [ivy:retrieve]    http://repo1.maven.org/maven2/com/ztools/z-xml/1.0/z-xml-1.0.jar
17: [ivy:retrieve]          ::::::::::::::::::::::::::::::::::::::::::::::
18: [ivy:retrieve]          ::          UNRESOLVED DEPENDENCIES         ::
19: [ivy:retrieve]          ::::::::::::::::::::::::::::::::::::::::::::::
20: [ivy:retrieve]          :: com.ztools#z-xml;1.0: not found
21: [ivy:retrieve]          ::::::::::::::::::::::::::::::::::::::::::::::
22: [ivy:retrieve]
23: [ivy:retrieve]
24: [ivy:retrieve] :: USE VERBOSE OR DEBUG MESSAGE LEVEL FOR MORE DETAILS

上面的信息中,在第3行的位置提示 invalid sha1 ,表示下载 到的jar文件和发布时的jar文件已经不是同一个文件了,他们的 sha1 码已 经完全不同。于是,ivy认为依赖的模块不能被解析,并提示 没有找到相应的依赖模块

原因

在公司内部我们配置了一个ivy的共享库,这个库用来存放公司内部发布的项 目模块,另外ivy有一个本地cache仓库,项目依赖的一些模块都会缓存在这个 cache仓库中。

在开发过程中,大家经常会执行 ant clean-cache (ivy:clean-cache),用 来清除缓存中的依赖模块,这样可以使得在执行 ant resolve 时能从公司 共享库里下载最新的项目模块。但是这样做也会删除缓存库里一些已经成熟并 固化了的开源项目模块,如果缓存里没有这些模块,那么每次解析依赖包时, 系统都会去公网上下载,这样解析过程会变得很慢。

这时有人想到将缓存库里的所有内容都拷到公司内部的共享库中(局域网), 这样一来就相当于在共享库中建立了一个公网仓库的“镜像”(这样做镜像是不 安全的,请勿模仿!)。于是想clean就可以clean了, Love Who Who

请注意:上面说的是把本地缓存中所有的内容都拷到了共享库中,这里面包含 了公司内部自行开发的,且没有固化的,且不稳定的一些项目模块。

问题来了,不巧你依赖的某个项目模块被公司内的其他的“抠地儿”给修改并 重新发布到共享仓库里了,如果这个发布过程在来点“文艺范儿”,那么Ivy也 就会给你一个像上面那样的“规范儿”的犯错信息!

综上所述,是由于开发过程和项目模块发布过程的不规范导致的上述问题的发 生。

解决办法

不规范造成的问题,在这里也用一个很不规范且暴力的方法来解决:

在ivy共享仓库中输入如下命令,用来修复ivy.xml.sha1文件,使其和ivy.xml 的sha1编码一致

for f in `find ./ -name 'ivy.xml'`;do sha1sum $f | \
    awk -F" " '{print $1}' > $f.sha1; done