欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java命令行下Jar包打包小結(jié)

 更新時(shí)間:2017年12月20日 16:36:52   作者:Allocator  
這篇文章主要介紹了Java命令行下Jar包打包小結(jié),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

jar包打包實(shí)現(xiàn)

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

jar指令

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

第一種簡單的打包方式

最簡單的就是在當(dāng)前文件夾下將編譯的class字節(jié)碼文件進(jìn)行打包輸出。示例如下:
編寫三個(gè)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();
  }
}

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

這里寫圖片描述

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

這里寫圖片描述

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

這里寫圖片描述

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

這里寫圖片描述

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

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

這里寫圖片描述

沒有主清單屬性報(bào)錯(cuò)。這是因?yàn)槲覀兪褂玫谝环N方法生成jar使用了默認(rèn)的清單,默認(rèn)清單沒有指定程序入口,所以出錯(cuò)。
可以直接更改jar包中的MANIFEST文件(解壓工具打開,更改后保存),改成如下效果:

這里寫圖片描述

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

這里寫圖片描述

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

第二種打包方式

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

這里寫圖片描述

注意 上面的指令中foo/ 文件夾后面有一個(gè)空格還有一個(gè)點(diǎn)

下面看一個(gè)例子

同樣還是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 指令編譯,三個(gè)class文件存在于不同的路徑下,因?yàn)樗麄儼灰粯?。把編譯號(hào)的含有class文件的文件夾全部放在foo文件夾下:

這里寫圖片描述

然后在foo 外面寫一個(gè)MANIFEST文件:

這里寫圖片描述

MANIFEST內(nèi)容如下:

這里寫圖片描述

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

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

這里寫圖片描述

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

這里寫圖片描述

正確打包,成功運(yùn)行jar.

MANIFEST文件介紹

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

manifest實(shí)例

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

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

小結(jié)

jar文件打包容易出錯(cuò)的地方就是Manifest清單文件的編寫,容易出一些格式上的錯(cuò)誤比如屬性的冒號(hào)和內(nèi)容之間少空格,Class-Path中添加依賴之間沒有空格,依賴文件過多,多行書寫的時(shí)候每行開頭沒加空格,文件最后一行沒有空行等等。寫MANIFEST文件的時(shí)候注意這些關(guān)鍵的地方就不會(huì)在打包上面耗費(fèi)太多的時(shí)間。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 運(yùn)行Springboot測試類查詢數(shù)據(jù)庫數(shù)據(jù)顯示白網(wǎng)頁問題及解決方法

    運(yùn)行Springboot測試類查詢數(shù)據(jù)庫數(shù)據(jù)顯示白網(wǎng)頁問題及解決方法

    Spring Boot應(yīng)用未能啟動(dòng)的原因是它沒有找到合適的數(shù)據(jù)庫配置具體來說,它需要一個(gè)數(shù)據(jù)源(DataSource),但未能在你的配置中找出,也沒有找到任何嵌入式數(shù)據(jù)庫(H2, HSQL 或 Derby),本文給大家分享運(yùn)行Springboot測試類查詢數(shù)據(jù)庫數(shù)據(jù)顯示白網(wǎng)頁問題及解決方法,一起看看吧
    2023-11-11
  • SpringBoot中基于AOP和Semaphore實(shí)現(xiàn)API限流

    SpringBoot中基于AOP和Semaphore實(shí)現(xiàn)API限流

    調(diào)用速率限制是 Web API 中的常見要求,旨在防止濫用并確保公平使用資源,借助Spring Boot 中的 AOP,我們可以通過攔截方法調(diào)用并限制在特定時(shí)間范圍內(nèi)允許的請求數(shù)量來實(shí)現(xiàn)速率限制,需要的朋友可以參考下
    2024-10-10
  • Java中線程安全有哪些實(shí)現(xiàn)思路

    Java中線程安全有哪些實(shí)現(xiàn)思路

    在 Java 多線程編程中,線程安全是一個(gè)非常重要的概念,本文主要介紹了Java中線程安全有哪些實(shí)現(xiàn)思路,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2023-05-05
  • IntelliJ IDEA中properties文件顯示亂碼問題的解決辦法

    IntelliJ IDEA中properties文件顯示亂碼問題的解決辦法

    今天小編就為大家分享一篇關(guān)于IntelliJ IDEA中properties文件顯示亂碼問題的解決辦法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • idea運(yùn)行java項(xiàng)目main方法報(bào)build failure錯(cuò)誤的解決方法

    idea運(yùn)行java項(xiàng)目main方法報(bào)build failure錯(cuò)誤的解決方法

    當(dāng)在使用 IntelliJ IDEA 運(yùn)行 Java 項(xiàng)目的 main 方法時(shí)遇到 "Build Failure" 錯(cuò)誤,這通常意味著在項(xiàng)目的構(gòu)建過程中遇到了問題,以下是一些詳細(xì)的解決步驟,以及一個(gè)簡單的代碼示例,用于展示如何確保 Java 程序可以成功構(gòu)建和運(yùn)行,需要的朋友可以參考下
    2024-09-09
  • 全面解析Java中的注解與注釋

    全面解析Java中的注解與注釋

    這篇文章主要介紹了Java中的注解與注釋,簡單來說注解以@符號(hào)開頭而注釋被包含在/***/符號(hào)中,各自具體的作用則來看本文詳解,需要的朋友可以參考下
    2016-05-05
  • JavaEE微框架Spring Boot深入解讀

    JavaEE微框架Spring Boot深入解讀

    spring框架作為JavaEE框架領(lǐng)域的一款重要的開源框架,在企業(yè)應(yīng)用開發(fā)中有著很重要的作用。接下來通過本文給大家介紹JavaEE微框架Spring Boot深入解讀,需要的朋友可以參考下
    2017-04-04
  • 常見的排序算法,一篇就夠了

    常見的排序算法,一篇就夠了

    這篇文章主要介紹了一些常用排序算法整理,插入排序算法、直接插入排序、希爾排序、選擇排序、冒泡排序等排序,需要的朋友可以參考下
    2021-07-07
  • RocketMq同組消費(fèi)者如何自動(dòng)設(shè)置InstanceName

    RocketMq同組消費(fèi)者如何自動(dòng)設(shè)置InstanceName

    這篇文章主要介紹了RocketMq同組消費(fèi)者如何自動(dòng)設(shè)置InstanceName問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 基于Java實(shí)現(xiàn)簡易的局域網(wǎng)對(duì)話系統(tǒng)

    基于Java實(shí)現(xiàn)簡易的局域網(wǎng)對(duì)話系統(tǒng)

    這篇文章主要介紹了基于Java實(shí)現(xiàn)的簡易的局域網(wǎng)對(duì)話系統(tǒng),文中的示例代碼對(duì)我們學(xué)習(xí)Java有一定的幫助,感興趣的小伙伴快來跟隨小編一起學(xué)習(xí)一下吧
    2021-12-12

最新評(píng)論