修复ivy由于sha1码不正确导致找不到模块(jar)的错误
问题描述
在运行 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