Java JAR
上次修改时间:2024 年 7 月 6 日
在本文中,我们将展示如何在 Java 中使用 JAR 文件。
JAR 文件充当一个逻辑容器,将 Java 软件应用程序或库的所有基本组件捆绑到一个压缩文件中。这些组件包括 Java 类文件、相关的元数据和资源。 JAR 文件使用无损压缩算法,使其存储效率高且易于共享。 它们基于 ZIP 格式,通常具有 .jar
文件扩展名。
JAR 代表 Java 归档 (Java ARchive)。它是一种用于聚合多个文件的文件格式,主要用于 .class
文件(编译后的 Java 代码)和其他资源(文本文件、图像等)到一个存档中。
JAR 文件的主要特征是
- 结构: JAR 文件可以包含一个清单文件 (META-INF/MANIFEST.MF),该文件提供有关存档的元数据,例如要运行的主类或对其他 JAR 的依赖关系。
- 平台无关性: JAR 文件是平台无关的,这意味着它们可以在安装了 Java 运行时环境 (JRE) 的任何系统上运行。
- 专为 Java 应用程序设计: JAR 专门用于打包和分发 Java 应用程序、库和 applet。
- 分发: JAR 提供了一种方便的方式,可以以单个文件分发整个 Java 应用程序或库。这简化了部署并降低了缺少文件的风险。
- 类路径管理: JAR 可以添加到类路径中,类路径是 Java 运行时搜索类和资源的位置列表。这允许应用程序访问存储在 JAR 中的类和资源。
- 模块化: JAR 可用于打包可重用组件,如库或框架。这促进了模块化和代码组织。
有两种类型的 JAR 文件
-
可执行 JAR: 这些 JAR 包含一个清单文件,该文件指定要运行的主类。 可以使用
java -jar
命令直接从命令行执行它们。 - 库 JAR: 这些 JAR 仅包含类文件,旨在供其他应用程序使用。 它们没有主类,无法直接执行。
IntelliJ IDEA 中的 JAR
按照以下步骤在 IntelliJ IDEA 中创建 JAR 文件。 选择
- 项目结构
- 构件
- 添加 JAR / 从具有依赖项的模块
- 创建具有指向 main 方法路径的清单文件
- 构建 / 构建构件
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.jar
和 eclipse-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
一开始,项目目录如下所示。
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 文件。
来源
在本文中,我们已经在 Java 中使用了 JAR 文件。
作者
列出所有Java教程。