IDEA 2016與eclipse 4.5.1打運行jar包教程及打包失敗的原因

現在手裏有一個小項目Tank 其中用到了數據庫所以用到了mysql驅動

1.先來看eclipse的打包過程

 點擊項目右鍵export如下圖


我們風別用JAR file與Runable JAR file創建

一.先用JAR file一路點擊記着查找主類 生成Tank.jar

二.再用Runable JAR file這裏有三個可選項

  1.這個意思是將需要的庫榨取到jar裏(不明白什麼意思看下面的圖)

  2.將需要的jar和庫直接導入到生成的jar中(不明白什麼意思看下面的圖)

  3.複製需要的jar包和庫提取到子目錄中


將這三個依次生成的Tank1.jar Tank2.jar Tank3.jar與Tank.jar一併放到D:/JarTest 目錄中,當生成Tank3.jar時多出了Tank3_lib文件夾,裏面是mysql數據庫驅動

三.分析

下面我們在命令行中輸入java -jar Tank*.jar分別測試

Tank.jar會出現java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

Tank1.jar正常

Tank2.jar一會出現java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

Tank3.jar正常

現在我們用jd-gui分別查看jar包分別查看它的文件目錄 和清單文件

 1.


Tank.jar很乾淨只有我們寫的class和清單,清單中只有我們選擇的主類,沒有mysql相關驅動類所以運行不起來

2.


      Tank1.jar可以清楚地看出它把mysql驅動包裏的所有東西與咱們自己寫的class混合到了一起,還有驅動包裏的services(這個東東是幹啥的看我另一片轉載人家的博客點擊打開鏈接)下的java.sql.Driver也被加進去了。這時候運行正常是因爲Class-path爲當前路徑及在jar中的mysql驅動類所以運行成功。

3.

     Tank2.jar的Main-class爲什麼不是com.hanghang.ui.TankWindow呢?原因是加載的時候是通過org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader主類再加載com.hanghang.ui.TankWindow類。 這個com.hanghang.ui.TankWindow類可以找到的但是jdbc相關類找不到,爲什麼呢?

    通過反編譯的java代碼和調試我們知道了org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader加載別的jar的時候通過URL.setURLStreamHandlerFactory(參看點擊打開鏈接)拓展了URL的協議所以說這個 Rsrc-Main-Class當前的jdk1.8不認識所以說報錯(目前認識到這裏)

4.



tank3.jar與Tank.jar一樣乾淨但是MANIFEST.MF多了Class-Path: . Tank3_lib/mysql-connector-java-5.1.6.jar 就是這一點就運行成功在Tank.jar中的清單文件中也加入Class-Path: . mysql-connector-java-5.1.6.jar 把mysql-connector-java-5.1.6.jar 複製到與Tank.jar同一個目錄你會發現這時候運行成(MANIFEST.MF相關介紹參看http://blog.csdn.net/zhifeiyu2008/article/details/8829637)
2.IDEA打包
按快捷鍵ctrl+shift+alt+s彈出項目結構選擇 artifact

從你項目中選取一個模塊

1.選擇extract to the target JAR時與eclipse的Tank1.jar 包情況一模一樣(把在項目中用到的Jar包解壓開,當成項目的一部分,打包到最後的Jar包中。但是這樣會有一個問題,即,如果項目中引用的Jar包有簽名,最後打包成的Jar包運行時會拋出錯誤:
“java.lang.SecurityException: Invalid signature file digest for Manifest main attributes”
)按確定

         在這個頁面我們可以寫Class Path中的jar 或目錄(即選擇你所依賴的jar),IDEA會將這些依賴的信息生成到此模塊的**( 你的路徑)\Tank\META-INF\MANIFEST.MF文件的的Class-path屬性中(對應於jar中的MAINIFEST.MF清單文件)。是不是IDEA很方便。
         這裏還可以打開D:\楊召成\IntelliJ IDEA WorkSpace\JavaSE\Tank\META-INF\MANIFEST.MF自己動態修改(如下圖)。
     
       這是IDEA模塊思想的重大好處,這裏還可以將生成的jar提供給這個項目的其他模塊或者整個項目IDEA,將相關的配置寫在 模塊名.imp 或項目名.imp文件中。是不是現在感覺IDEA比eclipse方便多了。
最後菜單欄Build->Build Artfiacts去輸出路徑找吧
2.選擇第二個的時候與eclipse的第三個一樣

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