最近重新开始搞java源代码的分析工具,其中用到了eclipse的jdt来直接分析java源代码。用maven添加了org.eclipse.jdt.core包之后,发现代码写完之后不能运行,有一些依赖无法找到。搜索了下貌似是因为从maven中央仓库下载的jdt和其依赖包都有小版本号,导致maven的依赖管理找不到这写包了(都不知道为什么能够下载下来,却不能加入到依赖中)。具体情况的描述,和这里的相同。
找了半天,发现maven的eclipse有个很强大的功能,就是把eclipse目录中的插件都安装到maven的本地仓库,先用这个方法解决了maven依赖找不到的情况,具体命令如下:
[cc lang='bash' ]mvn eclipse:make-artifacts -DstripQualifier=true -DeclipseDir=PATH_TO_ECLIPSE[/cc]
同这样的方法,把jdt3.6(eclipse helios使用的)安装到了本地,然后在工程的pom.xml中改成这个依赖,其中的 -DstripQualifier=true 就是为了在安装到本地仓库的时候去处后面 v 开头的小版本号。
用了这个方法,在命令行中已经可以用mvn命令进行打包了,但是又发现了一个问题,在eclipse中调试的时候,eclipse中的maven插件,虽然用了本地安装的jdt core,但后面的依赖解析仍然用的是带小版本号的jar包,还自动去maven官方的远程仓库里面进行了下载。但是,悲剧的事情是这些jar包没有通过数字验证(应该不会是下载出错),在执行的时候,会抛出java.lang.SecurityException: Invalid signature file digest for Manifest main attributes这样的异常。在命令行里面用:jarsigner -verify xxx.jar
进行了验证,果然都是无法不能通过验证的,而本地安装的jar包验证都是通过的。先用最简单的方法,就是用本地的不带小版本号的jar包替换,但是这样在eclipse中执行还是有问题,最后查了下maven的dependency插件,利用这个插件的拷贝依赖的功能才手工解决了这个问题。过程如下:
- 在工程目录下再建立一个lib文件夹
- 使用:mvn dependency:copy-dependencies -DoutputDirectory=lib 命令将所有的依赖复制到lib目录中
- 在eclipse中,将maven管理的依赖全部删除,手工添加lib目录中的所有jar包
通过这个过程可以发现,直接使用mvn命令复制出来的jar包,都是本地安装的无小版本号的,说明eclipse中的maven插件还是有点问题的。
当然,如果紧紧是想执行工程中的main方法,也可以使用:mvn dependency:build-classpath,将当前依赖的jar包所在的目录全部列出来,然后使用java命令将刚才的这些jar包设置为classpath就可以了。