深入理解Java可执行JAR文件

目录

  1. 引言
  2. JAR文件简介
  3. 创建JAR文件
    • 使用JDK的jar工具
    • 使用IDE创建JAR文件
  4. 指定Main-Class属性
    • MANIFEST.MF文件中指定
    • 使用jar工具指定
  5. 运行可执行JAR文件
  6. 在Maven项目中创建可执行JAR文件
    • 配置pom.xml
    • 使用maven-jar-plugin
  7. 在Gradle项目中创建可执行JAR文件
    • 配置build.gradle
    • 使用application插件
  8. 包含依赖库的可执行JAR文件
    • 使用Maven Shade插件
    • 使用Gradle Shadow插件
  9. 多模块项目中的可执行JAR文件
  10. 总结

引言

JAR文件是Java应用程序打包和分发的标准格式。特别是可执行JAR文件,它可以将Java应用程序的所有必要组件(包括类文件、资源文件和依赖库)打包在一起,使得分发和运行应用程序变得更加便捷。在本文中,我们将详细介绍创建、配置和使用可执行JAR文件的各种方法和最佳实践。

JAR文件简介

JAR文件是一种基于ZIP文件格式的归档文件,它可以包含多个Java类文件、元数据和资源文件。JAR文件可以用于:

  • 打包Java类文件和相关资源。
  • 分发Java应用程序或库。
  • 提高下载速度和减少存储空间。

JAR文件的主要优势在于它们可以将多个文件打包成一个归档文件,简化了应用程序的分发和部署。

创建JAR文件

使用JDK的jar工具

JDK提供了一个命令行工具jar,可以用于创建和操作JAR文件。以下是创建JAR文件的基本步骤:

  1. 编译Java源文件:

    javac MyApp.java
    
  2. 创建JAR文件:

    jar cvf MyApp.jar MyApp.class
    

    这里的c表示创建新的JAR文件,v表示生成详细输出,f表示指定JAR文件名。

使用IDE创建JAR文件

大多数IDE,如Eclipse和IntelliJ IDEA,都提供了创建JAR文件的图形界面工具。以下是使用Eclipse创建JAR文件的步骤:

  1. 选择项目并右键点击,选择Export...
  2. 在弹出的对话框中选择Java -> JAR file
  3. 指定输出路径和文件名,点击Finish

指定Main-Class属性

为了使JAR文件可执行,我们需要在JAR文件的MANIFEST.MF文件中指定主类(包含main方法的类)。

MANIFEST.MF文件中指定

MANIFEST.MF文件是JAR文件中的一个特殊文件,它包含了JAR文件的元数据。以下是一个示例MANIFEST.MF文件:

Manifest-Version: 1.0
Main-Class: com.example.MyApp

使用jar工具指定

我们可以在创建JAR文件时使用jar工具的e选项指定主类:

jar cvfe MyApp.jar com.example.MyApp MyApp.class

这里的e选项用于指定主类。

运行可执行JAR文件

创建好可执行JAR文件后,可以使用以下命令运行它:

java -jar MyApp.jar

该命令会启动JAR文件中指定的主类,并执行其main方法。

在Maven项目中创建可执行JAR文件

配置pom.xml

在Maven项目中,我们可以通过配置pom.xml文件来创建可执行JAR文件。

使用maven-jar-plugin

以下是一个配置示例:

<project>...<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.2.0</version><configuration><archive><manifest><mainClass>com.example.MyApp</mainClass></manifest></archive></configuration></plugin></plugins></build>
</project>

配置好后,运行以下命令生成JAR文件:

mvn package

在Gradle项目中创建可执行JAR文件

配置build.gradle

在Gradle项目中,我们可以通过配置build.gradle文件来创建可执行JAR文件。

使用application插件

以下是一个配置示例:

plugins {id 'java'id 'application'
}mainClassName = 'com.example.MyApp'jar {manifest {attributes('Main-Class': mainClassName)}
}

配置好后,运行以下命令生成JAR文件:

gradle build

包含依赖库的可执行JAR文件

可执行JAR文件通常需要包含应用程序的依赖库。我们可以使用Maven Shade插件或Gradle Shadow插件来创建包含所有依赖库的可执行JAR文件。

使用Maven Shade插件

以下是一个Maven Shade插件的配置示例:

<project>...<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>3.2.4</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><transformers><transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass>com.example.MyApp</mainClass></transformer></transformers></configuration></execution></executions></plugin></plugins></build>
</project>

配置好后,运行以下命令生成包含所有依赖库的可执行JAR文件:

mvn package

使用Gradle Shadow插件

以下是一个Gradle Shadow插件的配置示例:

plugins {id 'java'id 'application'id 'com.github.johnrengelman.shadow' version '6.1.0'
}mainClassName = 'com.example.MyApp'shadowJar {manifest {attributes('Main-Class': mainClassName)}
}

配置好后,运行以下命令生成包含所有依赖库的可执行JAR文件:

gradle shadowJar

多模块项目中的可执行JAR文件

在多模块项目中,我们需要确保所有模块的类文件和资源文件都包含在可执行JAR文件中。以下是一个多模块Maven项目的示例配置:

<project>...<modules><module>module1</module><module>module2</module></modules><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.2.0</version><configuration><archive><manifest><mainClass>com.example.MyApp</mainClass></manifest></archive></configuration></plugin></plugins></build>
</project>

在多模块项目中,确保所有子模块都已打包并包含在最终的可执行JAR文件中。

总结

本文详细介绍了

Java可执行JAR文件的创建、结构和使用方法。我们探讨了如何使用JDK的jar工具、IDE、Maven和Gradle来创建和配置可执行JAR文件,以及如何在JAR文件中包含依赖库。通过掌握这些技术,您可以更高效地打包和分发Java应用程序,简化部署流程,提升开发效率。

希望本文能帮助您深入理解Java可执行JAR文件的相关知识。如果您有任何问题或建议,欢迎在评论区留言讨论。

Happy Coding!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/42736.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL中in和exists的区别

in和exists都是在 SQL 中用于检查子查询中是否存在数据的谓词&#xff0c;它们的区别主要体现在语法、用途、效率、错误处理以及子查询范围等方面&#xff0c;具体区别如下&#xff1a; 语法&#xff1a; exists&#xff1a;exists (子查询)in&#xff1a;列 in (子查询) 或 子…

Java实现布隆过滤器的几种方式

布隆过滤器应用场景: 为预防大量黑客故意发起非法的时间查询请求,造成缓存击穿,建议采用布隆过滤器的方法解决。布隆过滤器通过一个很长的二进制向量和一系列随机映射函数(哈希函数)来记录与识别某个数据是否在一个集合中。如果数据不在集合中,能被识别出来,不需要到数…

吉时利KEITHLEY KI-488驱动和说明

吉时利KEITHLEY KI-488驱动和说明

[吃瓜教程]南瓜书第6章支持向量机

0.补充知识 0.1 超平面 定义&#xff1a; 超平面是指在&#x1d45b;维空间中&#xff0c;维度为 &#x1d45b;−1的子空间。它是分割空间的一个平面。 性质&#xff1a; n维空间的超平面 ( w T x b 0 , 其中 w , x ∈ R n ) (w^Tx_b0,其中w,x\in \mathbb R^n) (wTxb​0,其…

【大模型】大语言模型:光鲜背后的阴影——事实准确性和推理能力的挑战

大语言模型&#xff1a;光鲜背后的阴影——事实准确性和推理能力的挑战 引言一、概念界定二、事实准确性的局限2.1 训练数据的偏差2.2 知识的时效性问题2.3 复杂概念的理解与表述 三、推理能力的局限3.1 表层理解与深层逻辑的脱节3.2 缺乏常识推理3.3 无法进行长期记忆和连续推…

通过端口转发实现docker容器运行时端口更改

通过端口转发实现docker容器运行时端口更改 前言启动容器查看容器ip地址端口转发 前言 关于修改docker正在运行中容器端口&#xff0c;网上大部分分为3类: 1. 删除原有容器重新创建;2. 改配置文件;3. 在现有容器上新提交镜像&#xff0c;用新镜像起新的容器。 1和3属于同一种流…

Spring Boot与Apache Kafka Streams的集成

Spring Boot与Apache Kafka Streams的集成 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 一、Apache Kafka Streams简介 Apache Kafka Streams是一个用于构…

如何在Android中实现网络通信,如HttpURLConnection和HttpClient。

在Android开发中&#xff0c;网络通信是一个不可或缺的功能&#xff0c;它允许应用与服务器交换数据&#xff0c;实现丰富的功能。在实现网络通信时&#xff0c;HttpURLConnection和HttpClient是两种常用的方式。下面将从技术难点、面试官关注点、回答吸引力以及代码举例四个方…

【学习笔记】Redis学习笔记——第8章 对象

第8章 对象 8.1 对象的类型与编码 在Redis中存储对象时&#xff0c;键值对全部封装为RedisObject。 8.1.1 类型(type) 记录了对象的类型&#xff0c;Redis存储的Key为字符串对象&#xff0c;而Value可以是字符串对象、列表对象、哈希对象、集合对象、有序集合对象当中的一种…

UI还原度小技巧之缩放

还原度小技巧之缩放 背景缩放 背景 我们经常会遇到UI给的设计图尺寸较大&#xff0c;和我们浏览器相差太大&#xff0c;这时候&#xff0c;按照UI给的尺寸直接写进代码里面的话&#xff0c;可能会让页面结构在我们的浏览器上面显得很大&#xff0c;产生横向滚动条等&#xff0…

探讨4层代理和7层代理行为以及如何获取真实客户端IP

准备工作 实验环境 IP角色192.168.1.100客户端请求IP192.168.1.100python 启动的HTTP服务192.168.1.102nginx服务192.168.1.103haproxy 服务 HTTP服务 这是一个简单的HTTP服务&#xff0c;主要打印HTTP报文用于分析客户端IP #!/usr/bin/env python # coding: utf-8import …

「技术分享」FDL对接金蝶云API取数

很多企业的ERP系统都在用金蝶云星空&#xff0c;金蝶云星空API是IT人员获取数据的重要来源&#xff0c; 常常用来生成定制化报表&#xff0c;进行数据分析&#xff0c;或是将金蝶云的数据与OA系统、BI工具集成。 通常情况下&#xff0c;IT人员需要使用Python、Java等语言编写脚…

44、tomcat安装

一、tomcat tomcat和php一样&#xff0c;都是用来处理动态页面的。 tomcat也可以作为web应用服务器&#xff0c;开源的。 php .php tomcat .jsp nginx .html tomcat 是用Java代码写的程序&#xff0c;运行的是Java的web应用程序。 tomcat的特点和功能&#xff1a; 1、s…

XSS平台的搭建

第一步&#xff1a;安装MySQL 数据库 因为xss平台涉及到使用mysql 数据库&#xff0c;在安装之前&#xff0c;先使用docker 安装mysql 数据库。 docker run --name mysqlserver -e MYSQL_ROOT_PASSWORD123 -d -i -p 3309:3306 mysql:5.6 第二步&#xff1a;安装xssplatform…

hadoop分布式中某个 节点报错的解决案例

前言 在分布式节点中&#xff0c;发现有个节点显示不可用状态&#xff0c;因此需要紧急修复。 hadoop版本 目前这套集群hadoop的版本如下&#xff1a; 集群报错详细日志&#xff1a; 1/1 local-dirs are bad: /kkb/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/tempDatas/n…

离线开发(VSCode、Chrome、Element)

一、VSCode 扩展 使用能联网的电脑 A&#xff0c;在VSCode官网下载安装包 使用能联网的电脑 A&#xff0c;从扩展下载vsix扩展文件 将VSCode安装包和vsix扩展文件通过手段&#xff08;u盘&#xff0c;刻盘 等&#xff09;导入到不能联网的离线电脑 B 中 在离线电脑 B 中安装…

Spring之 IoC、BeanFactory、ApplicationContext

IoC (Inverse of Control) IoC &#xff0c;也就是 控制反转。 对于软件来说&#xff0c;即某一接口具体实现类的选择控制权从调用类中移除&#xff0c;转交给第三方决定&#xff0c;即由Spring容器借由Bean配置来进行控制。 Martin Fowler提出了DI(Dependency Injection,依…

快速解决找不到krpt.dll,无法继续执行代码问题

对于那些遇到计算机开机出现由于无法找到krpt.dll&#xff0c;进而无法继续执行代码问题的用户。 krpt.dll是计算机系统中与DirectX紧密相关的重要文件&#xff0c;如果它出现问题&#xff0c;可能会对一些特定的软件或游戏的运行产生影响。实际上&#xff0c;我们有多种解决该…

在CentOS和Ubuntu云服务下搭建Git版本控制器管理系统

目录 0.Git背景 1.在CentOS下安装Git 2.在Ubuntu下安装Git 3.安装git和图形化界面工具_哔哩哔哩_bilibili 0.Git背景 不知道你⼯作或学习时&#xff0c;有没有遇到这样的情况&#xff1a;我们在编写各种⽂档时&#xff0c;为了防⽌⽂档丢失&#xff0c;更改失误&#xff…

无需服务器,浏览器跑700+AI模型?!【送源码】

Transformers.js 是一个创新的网络机器学习库&#xff0c;它将先进的 Transformer 模型直接带入浏览器&#xff0c;无需服务器端支持。这个库与 Hugging Face 的 Python transformers 库功能对等&#xff0c;提供相似的 API 接口来运行预训练模型&#xff0c;涵盖了自然语言处理…