java打jar包和運行jar包的兩種方式
更詳細的打包方式請參考https://www.cnblogs.com/mq0036/p/8566427.html
一、java類不依賴第三方jar包
以簡單的一個java類Hello為例:
最終生成的jar包結構
META-INF
MENIFEST.MF
Hello.class
方法步驟
(1)用記事本寫一個Hello.java的文件
class Hello{
public static void main(String[] agrs){
System.out.println("hello");
}
}
(2)用命令行進入到該目錄下,編譯這個文件
javac Hello.java
(3)將編譯后的Hello.class文件打成jar包
jar -cvf hello.jar Hello.class
c表示要創建一個新的jar包,v表示創建的過程中在控制台輸出創建過程的一些信息,f表示給生成的jar包命名
(4)運行jar包
java -jar hello.jar 這時會報錯誤:hello.jar中沒有主清單屬性
添加Main-Class屬性
用壓縮軟件打開hello.jar,會發現里面多了一個META-INF文件夾,里面有一個MENIFEST.MF的文件,用記事本打開
Manifest-Version: 1.0
Created-By: 1.8.0_121 (Oracle Corporation)
在第三行的位置寫入 Main-Class: Hello (注意冒號后面有一個空格,整個文件最后有一行空行),保存
再次運行 java -jar hello.jar ,此時成功在控制台看到 hello ,成功。
二、java類依賴第三方jar包
假設類Hello依賴jar包Tom.jar,最終生成的jar包結構還是:
META-INF
MENIFEST.MF
Hello.class
解釋: Hello類與Tom.jar的調用關系如下:
class Hello{
public static void main(String[] agrs){
Tom.speak();
}
}
class Tom{
public static void speak(){
System.out.println("hello");
}
}
但是Tom類已經打成了jar包Tom.jar
方法步驟:
(1)編寫一個Hello.java並將其編譯成Hello.class,注意,由於Hello里面引用了Tom類的speak方法,因此在打jar包時應使用-cp參數,將tom.jar包引入
javac -cp tom.jar Hello.class
這里的 -cp 表示 -classpath,指的是把tom.jar加入classpath路徑下
(2)將hello.class達成jar包
jar -cvf hello.jar Hello.class
(3)引入jar包需要在MENIFEST.MF文件中配置一個新屬性:Class-Path,路徑指向你需要的所有jar包
現在MENIFEST.MF這個文件應該變成:
Manifest-Version: 1.0 Created-By: 1.8.0_121 (Oracle Corporation) Main-Class: Hello Class-Path: Tom.jar
(4)使用java -cp Tom.jar;hello.jar hello來運行jar包