ZetCode

Java JAR

上次修改时间:2024 年 7 月 6 日

在本文中,我们将展示如何在 Java 中使用 JAR 文件。

JAR 文件充当一个逻辑容器,将 Java 软件应用程序或库的所有基本组件捆绑到一个压缩文件中。这些组件包括 Java 类文件、相关的元数据和资源。 JAR 文件使用无损压缩算法,使其存储效率高且易于共享。 它们基于 ZIP 格式,通常具有 .jar 文件扩展名。

JAR 代表 Java 归档 (Java ARchive)。它是一种用于聚合多个文件的文件格式,主要用于 .class 文件(编译后的 Java 代码)和其他资源(文本文件、图像等)到一个存档中。

JAR 文件的主要特征是

有两种类型的 JAR 文件

IntelliJ IDEA 中的 JAR

按照以下步骤在 IntelliJ IDEA 中创建 JAR 文件。 选择

Maven Shade 插件

Maven Shade 插件将我们的 Java 项目打包到一个 uber-jar 中,该 uber-jar 包含主构件及其依赖项。 它通过创建一个包含我们的应用程序所需的所有内容的单个 JAR 文件来简化部署。 此外,它可以重命名包以防止依赖项之间的冲突。 它在我们 Maven 构建过程的 package 阶段中使用。

可以使用生成的 JAR 文件直接运行应用程序,从而使 shaded JAR 成为可执行文件。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.6.0</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>a
                        <transformers>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <manifestEntries>
                                    <Main-Class>com.zetcode.Main</Main-Class>
                                    <Build-Number>1.0</Build-Number>
                                </manifestEntries>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

这是一个配置 Maven shade 插件的示例。 通过指向 com.zetcode.Main 的主类使其可执行

Gradle JAR 插件

这是用于创建 JAR 归档文件的默认 Gradle 任务。 它将我们编译后的类文件 (*.class) 和项目中的资源打包到单个 JAR 文件中。

它不包含 JAR 中的任何依赖项。 我们的应用程序需要它所依赖的库单独安装在目标系统上。

plugins {
    id 'java'
    id 'application'
}

group = 'com.zetcode'
version = '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

application {
    mainClass = 'com.zetcode.Main'
}

jar {
    duplicatesStrategy(DuplicatesStrategy.EXCLUDE)
    manifest {
        attributes(
                'Main-Class': 'com.zetcode.Main'
        )
    }
    from {
        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    }
}

Gradle Shadow JAR 插件

它创建一个 fat JAR 或 shadow JAR,这是一个包含我们的应用程序代码及其所有传递依赖项的单个 JAR。

它使部署更容易,因为您只需要分发包含我们的应用程序所需的所有内容的单个 JAR 文件。 由于包含所有依赖项,JAR 文件将更大。

plugins {
    id 'java'
    id 'application'
    id 'io.github.goooler.shadow' version '8.1.8'
}

group = 'com.zetcode'
version = '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

application {
    mainClass = 'com.zetcode.Main'
}

dependencies {
    implementation 'org.eclipse.collections:eclipse-collections:11.1.0'
}

jar {
//    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
    duplicatesStrategy(DuplicatesStrategy.EXCLUDE)
    exclude 'META-INF/*.RSA', 'META-INF/*.SF', 'META-INF/*.DSA'
    manifest {
        attributes(
                'Main-Class': 'com.zetcode.Main'
        )
    }
    from {
        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    }
}

手动 JAR 创建

我们创建一个可执行的 fat JAR 文件,该文件使用 Eclipse collections 库。 它由两个 JAR 文件组成:eclipse-collections-11.1.0.jareclipse-collections-api-11.1.0.jar。 这两个文件也必须包含在最终的 JAR 中。

bin
    manifest.txt
lib
    eclipse-collections-11.1.0.jar
    eclipse-collections-api-11.1.0.jar
src
└───main
    └───java
        └───com
            └───zetcode
                    Main.java

一开始,项目目录如下所示。

com/zetcode/Main.java
package com.zetcode;

import org.eclipse.collections.api.factory.Lists;

import java.util.List;

public class Main {
    public static void main(String[] args) {

        List<String> words = Lists.mutable.of("sky", "town", "rock");
        words.add("ten");
        words.add("small");
        words.add("lucid");

        System.out.println(words);
    }
}

我们使用 Lists.mutable.of 定义一个单词列表。此方法来自 Eclipse collections 库。

我们使用 javac 工具编译程序。 我们需要使用 -cp 选项提供库的路径。

javac -cp lib\eclipse-collections-11.1.0.jar;lib\eclipse-collections-api-11.1.0.jar src\main\java\com\zetcode\Main.java -d bin

Java 字节码在 bin 目录中生成。 在 Windows 上,我们使用分号字符分隔库。 在 Unix 系统上,我们使用冒号。

java -cp bin;lib\eclipse-collections-11.1.0.jar;lib\eclipse-collections-api-11.1.0.jar com.zetcode.Main

我们使用 java 工具运行程序。

manifest.txt 文件

Manifest-Version: 1.0
Main-Class: com.zetcode.Main
Class-Path: ../lib/eclipse-collections-11.1.0.jar ../lib/eclipse-collections-api-11.1.0.jar

manifest.txt 文件中,我们指定主类和类路径。 在类路径中,我们包含程序中使用的两个库。 我们将 manifest.txt 文件放入 bin 子目录中,我们在其中生成 fat JAR 文件。

请注意,最后一个空行是强制性的

jar -cvfm main.jar manifest.txt com ../lib
added manifest
adding: com/(in = 0) (out= 0)(stored 0%)
adding: com/zetcode/(in = 0) (out= 0)(stored 0%)
adding: com/zetcode/Main.class(in = 901) (out= 513)(deflated 43%)
adding: lib/(in = 0) (out= 0)(stored 0%)
adding: lib/eclipse-collections-11.1.0.jar(in = 10475509) (out= 9523556)(deflated 9%)
adding: lib/eclipse-collections-api-11.1.0.jar(in = 1789461) (out= 1388818)(deflated 22%)
adding: lib/package.md(in = 7625) (out= 2496)(deflated 67%)
adding: lib/slf4j-api-1.7.36.jar(in = 41125) (out= 36381)(deflated 11%)
adding: lib/sqlite-jdbc-3.46.0.1-20240611.065717-6.jar(in = 13615977) (out= 13580269)(deflated 0%)

bin 目录内,我们创建 JAR 文件。

java -jar main.jar
[sky, town, rock, ten, small, lucid]

最后,我们运行 JAR 文件。

来源

使用 JAR 文件:基础知识

在本文中,我们已经在 Java 中使用了 JAR 文件。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 到目前为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我在编程教学方面拥有超过十年的经验。

列出所有Java教程