成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java 以編程方式創(chuàng)建JAR文件

開發(fā) 前端
為了簡化創(chuàng)建JAR文件的過程,我們創(chuàng)建了一個單獨的、普通的舊Java對象(POJO)類,它封裝了我們的操作。我們可以將條目放入清單文件,創(chuàng)建JAR文件,添加文件或目錄。

大家好,我是指北君。

在這篇文章中,我們將介紹一下以編程方式創(chuàng)建jar文件的過程。在編寫軟件時,最終我們需要將其部署到生產(chǎn)狀態(tài)。在某些情況下,使用帶有獨立文件的classpath是可以的。通常情況下,處理一個文件會更方便。在Java的情況下,標(biāo)準(zhǔn)的方法是使用JAR、WAR或EAR文件。

基本過程是編寫清單,打開jar,添加內(nèi)容,最后保存jar。

Jar文件的解剖

jar文件是ZIP文件格式的擴展,包含了一個清單文件。清單文件是JAR文件專用的特殊文件,可能包含各種設(shè)置。其中一些是主類、可選數(shù)據(jù)(即作者、版本等)和代碼簽名信息。

我們可以使用兼容zip的工具來查看和提取部分或全部存檔。我們還可以包括一個jars或libs子目錄,用于包含依賴性jar。由于jar是zip文件的擴展,我們可以包括任何文件或目錄。

創(chuàng)建一個 JarTool 類

為了簡化創(chuàng)建JAR文件的過程,我們創(chuàng)建了一個單獨的、普通的舊Java對象(POJO)類,它封裝了我們的操作。我們可以將條目放入清單文件,創(chuàng)建JAR文件,添加文件或目錄。

我們還可以創(chuàng)建方法來執(zhí)行從JAR中刪除,甚至向現(xiàn)有的JAR追加條目,盡管這些操作需要完全讀取和重寫JAR。

JAR描述符

為了創(chuàng)建一個JAR文件,我們必須首先開始制定清單。

public class JarTool {    
private Manifest manifest = new Manifest();

public void startManifest() {
manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
}
}

如果我們希望jar是可執(zhí)行的,我們必須設(shè)置主類。

public void setMainClass(String mainFQCN) {
if (mainFQCN != null && !mainFQCN.equals("")) {
manifest.getMainAttributes().put(Attributes.Name.MAIN_CLASS, mainFQCN);
}
}

另外,如果我們想指定額外的屬性,我們可以把它們添加到清單中,比如說。

addToManifest("Can-Redefine-Classes", "true");

下面是這個方法。

public void addToManifest(String key, String value) {
manifest.getMainAttributes().put(new Attributes.Name(key), value);
}

打開JAR文件進(jìn)行編寫

隨著清單的完成,我們現(xiàn)在可以把條目寫到JAR文件中。要做到這一點,我們必須首先打開JAR。

public JarOutputStream openJar(String jarFile) throws IOException {        
return new JarOutputStream(new FileOutputStream(jarFile), manifest);
}

將文件添加到JAR中

在向JAR中添加文件時,Java使用Solaris風(fēng)格的文件名,使用正斜杠作為分隔符(/)。注意,我們可以添加任何類型的文件,包括其他JAR文件或空目錄。這對于包括依賴關(guān)系來說真的很方便。

另外,因為JAR文件是classpath的一種形式,我們必須指定我們希望在JAR中使用絕對路徑的哪一部分。對于我們的目的,根路徑將是我們項目的classpath。

了解了這一點,我們現(xiàn)在可以用這個方法完成我們的JarTool類。

public void addFile(JarOutputStream target, String rootPath, String source) 
throws FileNotFoundException, IOException {
String remaining = "";
if (rootPath.endsWith(File.separator)) {
remaining = source.substring(rootPath.length());
} else {
remaining = source.substring(rootPath.length() + 1);
}
String name = remaining.replace("\\","/");
JarEntry entry = new JarEntry(name);
entry.setTime(new File(source).lastModified());
target.putNextEntry(entry);

BufferedInputStream in = new BufferedInputStream(new FileInputStream(source));
byte[] buffer = new byte[1024];
while (true) {
int count = in.read(buffer);
if (count == -1) {
break;
}
target.write(buffer, 0, count);
}
target.closeEntry();
in.close();
}

一個工作實例

為了證明可執(zhí)行jar的最低要求,我們將編寫一個應(yīng)用類,然后看看它是如何工作的。

public class Driver {
public static void main(String[] args) throws IOException {
JarTool tool = new JarTool();
tool.startManifest();
tool.addToManifest("Main-Class", "com.javanorth.createjar.HelloWorld");

JarOutputStream target = tool.openJar("HelloWorld.jar");

tool.addFile(target, System.getProperty("user.dir") + "\\src\\main\\java",
System.getProperty("user.dir") + "\\src\\main\\java\\com\\javanorth\\createjar\\HelloWorld.class");
target.close();
}
}

HelloWorld類是一個非常簡單的類,只有一個main()方法可以打印出文本。

public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}

為了證明它的作用,我們有這個例子。

$ javac -cp src/main/java src/main/java/com/javanorth/createjar/HelloWorld.java
$ javac -cp src/main/java src/main/java/com/javanorth/createjar/JarTool.java
$ javac -cp src/main/java src/main/java/com/javanorth/createjar/Driver.java
$ java -cp src/main/java com/javanorth/createjar/Driver
$ java -jar HelloWorld.jar
Hello World!

在這里,我們已經(jīng)編譯了每個類,然后執(zhí)行了Driver類,這將創(chuàng)建HelloWorld jar。最后,我們執(zhí)行了這個jar,結(jié)果是打印出了 "Hello World "信息。

上面的命令應(yīng)該從項目所在地執(zhí)行。

總結(jié)

在本教程中,我們看到了如何以編程方式創(chuàng)建一個jar文件,向其中添加文件,并最終執(zhí)行。

責(zé)任編輯:武曉燕 來源: Java技術(shù)指北
相關(guān)推薦

2013-03-08 02:46:00

個人開發(fā)APP

2010-04-13 08:49:08

JavaLombokJavabean

2009-04-03 13:45:29

JavaiTextPDF

2020-08-28 09:40:51

Java開發(fā)代碼

2021-08-02 11:13:28

人工智能機器學(xué)習(xí)技術(shù)

2011-07-11 08:59:51

PHP

2020-11-28 19:37:03

MeldLinuxdiff命令

2025-06-30 00:01:00

Node.js?Go線程

2016-02-23 09:23:32

2019-12-12 10:46:15

Kubernetes容器系統(tǒng)

2020-01-15 13:50:29

桌面快捷方式Windows 10WiFi網(wǎng)絡(luò)

2009-10-23 09:02:52

Linux系統(tǒng)安裝卸載文件操作系統(tǒng)

2021-02-27 16:08:17

Java異步非阻塞

2012-09-17 10:35:41

JavaScriptJS代碼

2022-04-27 09:39:11

Mixin工具

2018-08-19 09:45:19

Windows 10藍(lán)屏死機轉(zhuǎn)儲文件

2020-08-18 10:04:49

大數(shù)據(jù)數(shù)據(jù)架構(gòu)技術(shù)

2010-01-25 17:33:25

Android Men

2022-12-30 11:05:40

Rust代碼

2010-03-05 15:14:55

Ubuntu網(wǎng)絡(luò)配置
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 成人在线精品 | 91精品国产一区二区三区动漫 | 在线视频一区二区三区 | 特级丰满少妇一级aaaa爱毛片 | 精品在线免费看 | 久久国产精品视频 | 黄色av网站在线观看 | 久久综合狠狠综合久久综合88 | 国产精品免费一区二区三区四区 | 中文字幕成人在线 | 精品国产黄a∨片高清在线 成人区精品一区二区婷婷 日本一区二区视频 | 狠狠干狠狠操 | 日本黄色的视频 | 亚洲二区在线 | 欧美福利影院 | 欧美一区二区在线视频 | 97国产爽爽爽久久久 | 国产成人小视频 | 国产在线二区 | 中文字幕日韩三级 | 精品无码久久久久久国产 | 欧美老少妇一级特黄一片 | 亚洲午夜av久久乱码 | 亚洲精品68久久久一区 | 国产小视频在线观看 | a黄毛片 | www.888www看片 | 日韩中文一区二区三区 | 日韩二区| 中文字幕高清 | 国产日韩精品一区二区 | 黄色大片在线视频 | 国产免费一区二区 | 欧美精品片 | 日本视频一区二区 | 在线播放国产一区二区三区 | 国产精品欧美一区二区三区不卡 | 日本一本在线 | 午夜影视免费片在线观看 | 欧美不卡网站 | 精一区二区 |