以編程方式創建 JAR 文件
一、簡介
在這篇簡短的文章中,我們將介紹以編程方式創建 jar 文件的過程。在編寫軟件時,最終我們需要將其部署到生產狀態。在某些情況下,可以使用帶有單獨文件的類路徑。通常,處理單個文件更方便。對於 Java,執行此操作的標準方法是使用 JAR、WAR 或 EAR 文件。
基本流程是寫manifest,打開jar,添加內容,最後關閉jar。
2. Jar 文件剖析
jar 文件是 ZIP 文件格式的擴展,其中包含清單文件。清單文件是特定於 JAR 文件的特殊文件,可能包含各種設置。其中一些是主類、可選數據(即作者、版本等)和代碼簽名信息。
我們可能會使用與 zip 兼容的工具(例如 WinRar)來查看和提取部分或全部存檔。我們還可以包含一個 jars 或 libs 子目錄來包含依賴 jars。由於 jar 是 zip 文件的擴展,我們可以包含任何文件或目錄。
3. 創建一個JarTool
類
為了簡化創建 JAR 文件的過程,我們創建了一個單獨的、普通的舊 Java 對象 (POJO) 類來封裝我們的操作。我們可能包括將條目放入清單文件、創建 JAR 文件、添加文件或目錄。
我們還可以創建方法來從 JAR 中執行刪除,甚至將條目附加到現有 JAR,儘管這些操作需要完全讀取和重寫 JAR。
3.1。 JAR 清單
為了創建 JAR 文件,我們必須首先開始清單:
public class JarTool {
private Manifest manifest = new Manifest();
public void startManifest() {
manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
}
}
如果我們希望 jar 是可執行的,我們必須設置主類:
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);
}
3.2.打開 JAR 進行寫作
清單完成後,我們現在可以將條目寫入 JAR 文件。為此,我們必須首先打開罐子:
public JarOutputStream openJar(String jarFile) throws IOException {
return new JarOutputStream(new FileOutputStream(jarFile), manifest);
}
3.3.將文件添加到 Jar
將文件添加到 JAR 時,Java 使用 Solaris 樣式的文件名,使用正斜杠作為分隔符 (/)。請注意,我們可以添加任何類型的任何文件,包括其他 JAR 文件或空目錄。這對於包含依賴項非常方便。
此外,因為 JAR 文件是類路徑的一種形式,所以我們必須指定我們希望在 JAR 中使用的絕對路徑的哪一部分。出於我們的目的,根路徑將是我們項目的類路徑。
了解了這一點,我們現在可以用這個方法完成我們的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();
}
4. 一個工作示例
為了演示可執行 jar 的最低要求,我們將編寫一個應用程序類,然後看看它是如何工作的:
public class Driver {
public static void main(String[] args) throws IOException {
JarTool tool = new JarTool();
tool.startManifest();
tool.addToManifest("Main-Class", "com.baeldung.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\\baeldung\\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/baeldung/createjar/HelloWorld.java
$ javac -cp src/main/java src/main/java/com/baeldung/createjar/JarTool.java
$ javac -cp src/main/java src/main/java/com/baeldung/createjar/Driver.java
$ java -cp src/main/java com/baeldung/createjar/Driver
$ java -jar HelloWorld.jar
Hello World!
在這裡,我們編譯了每個類,然後執行Driver
類,它將創建HelloWorld
jar。最後,我們執行了 jar,這會導致打印“Hello World”消息。
上面的命令應該從項目位置執行。
5. 結論
在本教程中,我們了解瞭如何以編程方式創建 jar 文件、向其中添加文件並最終執行它。
當然,代碼可以在 GitHub 上找到。