先說解決方法
1、推薦使用官方建議的使用jar in jar插件
官方文檔 https://pulsar.apache.org/docs/zh-CN/security-bouncy-castle/
打包插件 https://github.com/nthuemmel/executable-packer-maven-plugin
(如果你使用的是eclipse打包 直接有選項可以實現jar in jar。不需要使用插件)
插件使用方法 mainClass為啟動類。還有一些其他功能配置 可以自行在git倉庫查看
<plugin> <groupId>de.ntcomputer</groupId> <artifactId>executable-packer-maven-plugin</artifactId> <version>1.0.1</version> <configuration> <mainClass>com.example.MyMainClass</mainClass> </configuration> <executions> <execution> <goals> <goal>pack-executable-jar</goal> </goals> </execution> </executions> </plugin>
2、網上普遍使用的修改jre環境(不推薦)
將使用的bouncycastle jar包直接扔到jre/lib/ext下
再修改 jre/lib/security/java.security 添加一行security.provider.X=org.bouncycastle.jce.provider.BouncyCastleProvider (X為按實際內容順序的數字)
不推薦的原因是你的jar大概率不是你自己用的。而你可能很難去改所有使用者的jre環境
有興趣的可以繼續往下看看原因
問題原因
其實原因也很簡單 當在編輯器里運行的時候 使用的jar包是maven下載好的引用
而當使用maven打包的時候 mvn會將引用的jar包 解包然后重新打包(具體maven為什么這么做 我沒有深入研究 如有大神請不吝賜教)
但是因為bouncycastle包有簽名 maven的解包操作導致了簽名失效 從而無法再使用。而本地的jre環境也沒有這個jar包 就導致了JCE無法驗證。
這也是為什么可以直接把jar包扔到jre里可以解決這個問題。
最后說說executable-packer-maven-plugin插件做了啥
首先會將所有依賴的第三方jar包直接打到你的jar包中。然后修改啟動類為他的ExecutableLauncher
這個類會在啟動時加載所有的第三方jar包 最后再反射啟動你真正要用的mainClass
功能很簡單 有興趣的可以看看源碼
如果大家有什么其他方法 或者有什么不明白的歡迎留言
完結撒花