溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java命令行中Jar包打包的示例分析

發(fā)布時間:2021-07-01 10:25:27 來源:億速云 閱讀:135 作者:小新 欄目:編程語言

這篇文章主要介紹Java命令行中Jar包打包的示例分析,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!

jar包打包實現(xiàn)

jar包打包可以使用jar指令實現(xiàn)打包,在命令行中輸入jar可以查看jar指令的內(nèi)容

Java命令行中Jar包打包的示例分析

從最后顯示的兩個示例看出存在兩種打包的方法,兩者的區(qū)別就是是否使用自己定義的MANIFEST清單文件。第一個示例沒有使用MANIFEST文件進(jìn)行打包,所以最終生成的jar包中MANIFEST文件為默認(rèn)文件,這種方式適用于比較簡單的jar包結(jié)構(gòu),不存在其他jar包依賴以及生成的jar包不需要可執(zhí)行。這種方式生成的jar包不能使用java -jar XXX.jar命令執(zhí)行,因為MANIFEST文件中未指定程序入口。而第二個實例是比較常用的打包方式,即是使用自定義的MANIFEST文件參與打包,這樣能夠?qū)崿F(xiàn)往包中添加依賴,并且可以指定程序入口,實現(xiàn)java -jar XXX.jar 直接運行jar包。

第一種簡單的打包方式

最簡單的就是在當(dāng)前文件夾下將編譯的class字節(jié)碼文件進(jìn)行打包輸出。示例如下:
編寫三個java文件,test1.java test2.java 以及Main.java

public class test1
{
  public static void main(String[] args)
  {
  }
  public void display()
  {
    System.out.println("this is class test1");
  }
}

以及test2.java 文件

public class test2
{
  public static void main(String[] args)
  {
  }
  public void display()
  {
    System.out.println("this is class test2");
  }
}

Main.java

public class Main
{
  public static void main(String[] args)
  {
    for(String a:args)
    {
      System.out.println("給定的參數(shù)"+a);
    }
    test1 t1 = new test1();
    t1.display();
    test2 t2 = new test2();
    t2.display();
  }
}

命令行下將這三個文件進(jìn)行編譯,使用javac命令實現(xiàn)編譯。

Java命令行中Jar包打包的示例分析

用jar指令將編譯的class文件打包

Java命令行中Jar包打包的示例分析

打包過程中有顯示已添加清單。用解壓工具打開生成的test.jar包,可以看到如下的結(jié)構(gòu):

Java命令行中Jar包打包的示例分析

除了編譯的三個class文件外多了一個META-INF文件夾,里面有一個MANIFEST.MF(清單文件)的文件,這個文件的作用非常重要,后面說明。我們先看它里面的內(nèi)容

Java命令行中Jar包打包的示例分析

非常簡單的清單,只包含清單版本與java版本。

這個時候執(zhí)行java -jar test.jar有如下效果:

Java命令行中Jar包打包的示例分析

沒有主清單屬性報錯。這是因為我們使用第一種方法生成jar使用了默認(rèn)的清單,默認(rèn)清單沒有指定程序入口,所以出錯。
可以直接更改jar包中的MANIFEST文件(解壓工具打開,更改后保存),改成如下效果:

Java命令行中Jar包打包的示例分析

再一次執(zhí)行java -jar test.jar 后程序輸入正確內(nèi)容:

Java命令行中Jar包打包的示例分析

在MANIFEST文件中添加了Main-Class屬性指定了程序入口,實現(xiàn)了直接執(zhí)行jar文件。
所以說使用默認(rèn)的MANIFEST是不能直接執(zhí)行jar文件,要么使用自己定義的MANIFEST文件打包,要么更改包中的MANIFEST文件。

第二種打包方式

第二種打包方式更加通用,一般情況下java文件第一行都是package XXX;即是包名,也決定了編譯后的class文件存在的路徑。當(dāng)有多個java文件要編譯打包并且他們存在不同的包名時,如果還是按照第一種方法打包時一個文件一個文件的寫非常不現(xiàn)實,所以有了第二種方法。將所有要打包的class文件存在的目錄以及依賴的jar包全部放在一個根文件夾里面(比如是foo),然后編寫MANIFEST清單文件,指定程序入口以及其他添加的依賴的jar包。在執(zhí)行指令:

Java命令行中Jar包打包的示例分析

注意 上面的指令中foo/ 文件夾后面有一個空格還有一個點

下面看一個例子

同樣還是test1.java與test2.java以及Main.java 但是各自有自己的包名。

package cn.mytest1;
public class test1
{
  public static void main(String[] args)
  {
  }
  public void display()
  {
    System.out.println("this is class test1");
  }
}
package cn.mytest2;
public class test2
{
  public static void main(String[] args)
  {
  }
  public void display()
  {
    System.out.println("this is class test2");
  }
}
package cn.mymain;
import cn.mytest1.test1;
import cn.mytest2.test2;
public class Main
{
  public static void main(String[] args)
  {
    for(String item:args)
    {
      System.out.println("傳遞參數(shù)"+item);
    }
    test1 t1 = new test1();
    test2 t2 = new test2();
    t1.display();
    t2.display();
  }
}

同樣使用javac 指令編譯,三個class文件存在于不同的路徑下,因為他們包名不一樣。把編譯號的含有class文件的文件夾全部放在foo文件夾下:

Java命令行中Jar包打包的示例分析

然后在foo 外面寫一個MANIFEST文件:

Java命令行中Jar包打包的示例分析

MANIFEST內(nèi)容如下:

Java命令行中Jar包打包的示例分析

注意:MANIFEST 文件最后一行是空行。

命令行下執(zhí)行指令:jar cvfm test.jar MANIFEST.MF -C foo/ .

Java命令行中Jar包打包的示例分析

在命令行下測試jar包是否能夠直接運行了,使用指令java -jar test.jar

Java命令行中Jar包打包的示例分析

正確打包,成功運行jar.

MANIFEST文件介紹

通過上面的兩個例子,可以看到MANIFEST文件對于jar打包都是必須的。MANIFEST文件描述了打包后的jar文件的詳細(xì)信息,存在于打包后的META-INF 的文件夾.一個簡單的MANIFEST文件主要內(nèi)容如下:

Java命令行中Jar包打包的示例分析

主要就是Manifest-Version Main-Class Class-Path這三個屬性在制作jar包時非常重要.Manifest-Version 是版本號,照著寫就行。Main-Class則是jar包的入口程序,指定運行的類的全稱(一定要包含包名),這樣可以使用java -jar name.jar直接運行jar包。第三個Class-Path是指的打包時需要依賴的其他jar包,打包的時候自己的程序中也可能含有其他的jar包所以要添加依賴。

注意每個MANIFEST屬性冒號與內(nèi)容之間都有一個空格,并且寫完后最后還要留有一行空行,不然運行時還是出現(xiàn)找不到主清單屬性的錯誤

以上是“Java命令行中Jar包打包的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI