現在手裏有一個小項目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.
“java.lang.SecurityException: Invalid signature file digest for Manifest main attributes”)按確定