IDEA對使用了第三方依賴jar包的非Maven項目打jar包

前言:

最近,遇到了一個問題,都快把我整瘋了;
這個問題開始是由 使用IDEA 對 非Maven項目進行打 Jar 包 引起的;
本來就是想簡簡單單的打個 jar 包,並將使用的第三方依賴 jar 包打進去,但是問題就出現在了項目中依賴的第三方 jar 包( bcprov-jdk15on-1.54.jar )存在簽名,那在打包過程中會把 簽名 破壞掉,導致在使用打好的jar包時報錯: JCE cannot authenticate the provider BC

注意:如果依賴的第三方jar包不存在簽名的話,直接按照下面的 打包方式 就能成功打包;

IDEA打jar包:

使用 IDEA 將項目打成jar包,並將使用的第三方依賴jar包打進去;

1、首先看下打包的項目工程:

2、具體的打包流程:

2.1、首先配置 MANIFEST.MF

首先需要配置 MANIFEST.MF , 因爲這會在打包時使用的;

首先新建一個文件夾,文件夾取名爲 META-INF , 在文件夾META-INF中創建文件,取名爲 MANIFEST.MF ,然後需要配置下 MANIFEST.MF 文件的內容; 內容如下:

Manifest-Version: 1.0
Class-Path: lib/log4j-core-2.0-rc1.jar lib/bcprov-jdk15on-1.54.jar 
Main-Class: com.lyl.Test.PackageTest

注意上面 MANIFEST.MF 配置文件中的內容在填寫時,需要注意幾點:

1、Class-Path 在 冒號後面需要有 一個空格 ;然後後面跟隨的每個依賴包之間也必須有 一個空格 ,並且最後一個依賴後面也必須要存在 一個空格

2、Main-Class這一行後面需要跟 兩個空行 ;

最後簡單說下,MANIFEST.MF 在打包時起到什麼作用呢:

  1. Main-Class 指定程序的運行入口,這樣可以直接用java -jar xxx.jar來運行程序。

  2. Class-Path 指定依賴jar包的路徑,class loader類加載器會依據這個路徑來搜索依賴的class。

2.2、具體配置過程

下面將進行打包前的一些配置,需要將這些配置好後,才能進行打包的;

(1)、

(2)、

(3)、

(4)、

(5)、

(6)、

(7)、

(8)、

2.3、進行打包

上面將打包前的一些配置完成後,最後就可以直接進行打包了;

(1)、

(2)、

end, IDEA 打jar包流程已經完成了;但是打好的jar包,直接使用時,可能還會存在問題,再聊聊會出現的問題。

擴展: 如果想在打jar包時,將依賴的第三包jar包打進去的話,使用IDEA可能會比較繁瑣,但是使用 Eclipse 會比較方便快捷,直接使用 Eclipse 的 fat jar 插件 進行打包,十分方便的。

3、打好的jar包在使用時可能存在的問題:

3.1、報錯:Invalid signature file digest for Manifest main attributes

將打好的jar包引用到另一個項目中,可能會報錯:Invalid signature file digest for Manifest main attributes ;

這就是因爲 打好的jar包中 存在多餘的.SF文件,可以將jar包中後綴爲 .SF文件刪除就可以了。

3.2、報錯:JCE cannot authenticate the provider BC

在項目中使用打好的jar包,可能會報錯:JCE cannot authenticate the provider BC ;

這是因爲 之前打包時,項目中依賴的第三方jar包中有存在 簽名 的jar包(bcprov-jdk15on-1.54.jar);在將其打進jar包時,就會將簽名破壞掉,導致在使用這個簽名被破壞的包中的類時,就會報錯了。

3.3、解決方案:

3.3.1、將簽名包放一份到本地JDK中(不推薦)

此方案需要將簽名包(bcprov-jdk15on-1.54.jar)放到 JDK 中的 jre 中的lib文件夾下的 ext 文件夾中;

例如:本地安裝的JDK路徑爲 E:\Java\jdk1.8.0_60\jre\lib\ext ; 將簽名包放到這裏一份 。

但是此解決方案不推薦,爲什麼不推薦呢?

因爲如果你打的jar包需要提供給別人的話,別人爲了使用你的jar包,還需要改變自己的JDK,這個不太方便了。

3.3.2、打包時,不講依賴簽名包打進去(推薦)

打包時,不將簽名包打進去。打好包後,在項目中使用時,需要將依賴的簽名包與打好的包一起放到 lib 文件夾下,這樣在使用簽名包時,就會使用與 打好的包在同級別下的 依賴的簽名包。

使用這種方案進行解決時,會比第一種方案方便很多,只是使用時,除了引入打好的jar包外,還需喲再引入下使用到的簽名包( bcprov-jdk15on-1.54.jar ),並將其放到同一級別目錄下 即可。

打包時,不將簽名包打進去的實現步驟:(以 bcprov-jdk15on-1.54.jar 簽名包爲例子)

(1)、首先是將 MANIFEST.MF 配置文件進行修改:

之前:存在簽名包的

Manifest-Version: 1.0
Class-Path: lib/log4j-core-2.0-rc1.jar lib/bcprov-jdk15on-1.54.jar 
Main-Class: com.lyl.Test.PackageTest

修改:就是將簽名包 bcprov-jdk15on-1.54.jar 的依賴引入刪除

Manifest-Version: 1.0
Class-Path: lib/log4j-core-2.0-rc1.jar
Main-Class: com.lyl.Test.PackageTest

(2)、改完 配置文件後,再修改上面打包 具體配置步驟 中的 第(7) 中的引入依賴jar包,將簽名包刪除,然後再點擊OK,並重新打包 即可。如下圖:

之前,簽名包也引入了:

之後,去掉引入的簽名包:

重新打好的包,由於沒有將依賴的簽名包打進去,那麼如果使用到簽名包bcprov-jdk15on-1.54.jar的類時,就會報《 類找不到 》怎麼辦呢?

可以將打好的jar包 “ packagetest-1.0.0.jar ”, 與 簽名包 bcprov-jdk15on-1.54.jar 放到引用的項目的 lib 文件夾下(需要保證這兩個jar包在項目中的存放的位置在同一級別 即可); 然後在使用時就會使用 外部引用的 依賴簽名包中的類了,不會報 類找不到

並且沒有破壞簽名包的簽名,所以也不會報簽名被破壞的錯了:JCE cannot authenticate the provider BC

end, 暫時只找到了這兩種解決方案,感覺這都不是最優的解決方案,但是實在找不到了,唉,如果有知道的朋友,可以告訴下嗎? 謝謝啦!

不要忘記留下你學習的足跡 [點贊 + 收藏 + 評論]嘿嘿ヾ

一切看文章不點贊都是“耍流氓”,嘿嘿ヾ(◍°∇°◍)ノ゙!開個玩笑啦,動一動你的小手,點贊就完事了,你每個人出一份力量(點贊 + 評論)就會讓更多的學習者加入進來!非常感謝! ̄ω ̄=

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章