最近一段时间改用了IntelliJ,遇到一个打Jar包的问题。这里的前提是maven项目。
因为要提交hadoop相关jar包去服务器上执行job,所以开发完hadoopMR逻辑之后要把相关 任务类和依赖打包上传。
依赖中有一个bouncyCastle相关的jdk15on,如果用Intellj 建立artifacts去打包就会把相关依赖jar包进拆包,然后再合并起来。这样有个问题,将原有的jar包拆开后,jar包的签名就被破坏了,整合的jar包运行job的时候就会出现“java.lang.SecurityException: Invalid signature file digest for Manifest main attributes”。
百度或者google的方法就是删掉 .SF 或者.DSA文件,这样确实可以运行。但是如果调用了bouncy的包,就会疯狂报错,
java.lang.SecurityException: JCE cannot authenticate the provider BC。
原因就是ide打包的时候拆了原来bouncy的jar包,导致数字签名破坏了。
解决办法就是让这些带有数字签名的jar包原封不动的被关联到用作执行hadoop job的jar包上。
- 第一个办法就是用maven的命令打包:
- 在这个项目下面,用mvn clean package -Dmaven.test.skip=true,跳过单元测试进行打包,这样在target目录下面,将会生成 一个体积很小的jar包(例如,hadoop-***.jar)下面称为“A jar包” 和一个***.tar.gz压缩包 下面称 “B 压缩包”。
- B压缩包里面包含一个lib文件夹,里面含有运行任务需要的第三方jar包。
- 现在我们把生成的A jar包 和 B压缩包 里面 lib文件夹里包含的任务需要的依赖jar包放在同一个运行目录下面。
- 运行任务时指定执行jar包文件为 Ajar包,这样就可以运行成功了。
- 第二个办法是通过MF文件进行关联,用ide的artifact打包,这个还没进行测试。