深入理解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.mfbz.cn/a/777730.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

绝了,华为伸缩摄像头如何突破影像边界?

自华为Pura70 Ultra超聚光伸缩镜头诞生以来&#xff0c;备受大家的关注&#xff0c;听说这颗镜头打破了传统手机的摄像头体积与镜头的设计&#xff0c;为我们带来了不一样的拍照体验。 智能手机飞速发展的今天&#xff0c;影像功能已经成为我们衡量一款手机性能的重要指标。想…

Mac|install vue

安装Node&#xff1a;Node.js — Download Node.js 选择系统为mac&#xff0c;安装步骤在终端输入 &#xff08;放文字版在这里&#xff5e;方便复制&#xff09; # installs nvm (Node Version Manager) curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/ins…

【TB作品】数码管独立按键密码锁,ATMEGA16单片机,Proteus仿真 atmega16数码管独立按键密码锁

文章目录 基于ATmega16的数码管独立按键密码锁设计实验报告实验背景硬件介绍主要元器件电路连接 设计原理硬件设计软件设计 程序原理延时函数独立按键检测密码显示主函数 资源代码 基于ATmega16的数码管独立按键密码锁设计实验报告 实验背景 本实验旨在设计并实现一个基于ATm…

ctfshow web入门 web338--web344

web338 原型链污染 comman.js module.exports {copy:copy };function copy(object1, object2){for (let key in object2) {if (key in object2 && key in object1) {copy(object1[key], object2[key])} else {object1[key] object2[key]}}}login.js var express …

c/c++ 程序运行的过程分析

c/c编译基础知识 GNU GNU&#xff08;GNU’s Not Unix!&#xff09;是一个由理查德斯托曼&#xff08;Richard Stallman&#xff09;在1983年发起的自由软件项目&#xff0c;旨在创建一个完全自由的操作系统&#xff0c;包括操作系统的内核、编译器、工具、库、文本编辑器、邮…

深度网络现代实践 - 深度前馈网络之反向传播和其他的微分算法篇

序言 反向传播&#xff08;Backpropagation&#xff0c;简称backprop&#xff09;是神经网络训练过程中最关键的技术之一&#xff0c;尤其在多层神经网络中广泛应用。它是一种与优化方法&#xff08;如梯度下降法&#xff09;结合使用的算法&#xff0c;用于计算网络中各参数的…

前端正悄悄蚕食后端开发者的工作,这真的好吗?

**前端正悄悄蚕食后端开发者的工作&#xff0c;这真的好吗&#xff1f;** 前端开发者的职责范围正在逐渐扩大。从最初的单纯页面设计&#xff0c;到现在的与后端数据交互、应用逻辑处理等&#xff0c;前端开发者在项目中的作用日益重要。与此同时&#xff0c;这也引发了一个值…

固态,机械,移动(U盘),sd卡,哪个更适合长期储存数据 保存数据用什么硬盘可靠 硬盘数据丢失怎么找回 硬盘维护注意事项

有关硬盘数据丢失的恢复技巧&#xff0c;这篇文章一定要收藏好。在硬盘使用过程中&#xff0c;很多情况都会导致数据丢失&#xff0c;例如硬盘跌落、病毒感染、系统文件损坏等。这时候&#xff0c;一定要采用正确的方法&#xff0c;抢救硬盘中存储的珍贵数据和文档。 有关长期保…

技术实现路径怎么写?(Word项目技术路径文档参考)

软件项目编写技术实现路径至关重要&#xff0c;因为它为项目团队提供了清晰的开发蓝图。这一路径明确了从项目启动到交付各阶段所需的技术方案、步骤及预期成果&#xff0c;有助于团队统一认识&#xff0c;确保开发工作有序进行。同时&#xff0c;技术实现路径有助于识别潜在的…

ELK优化之Filebeat部署

目录 1.安装配置Nginx 2.安装 Filebeat 3.设置 filebeat 的主配置文件 4.修改Logstash配置 5.启动配置 6.kibana验证 主机名ip地址主要软件es01192.168.9.114ElasticSearches02192.168.9.115ElasticSearches03192.168.9.116ElasticSearch、Kibananginx01192.168.9.113ng…

Docker(二):Docker image Docker Container

本文将介绍 Docker 映像和容器以及 docker 文件之间的差异与联系&#xff0c;本文还将解释如何以及何时使用它们。 什么是 Dockerfile&#xff1f; 它是一个简单的文本文件&#xff0c;包含命令或过程的集合。我们运行的这些命令和准则作用于配置为创建新的 Docker 镜像的基本…

G1.【C语言】EasyX初步了解

1.介绍 EasyX 是针对 C/C 的图形库&#xff0c;可以帮助使用C/C语言的程序员快速上手图形和游戏编程。 2.安装 EasyX Graphics Library for CEasyX Graphics Library 是针对 Visual C 的绘图库&#xff0c;支持 VC6.0 ~ VC2019&#xff0c;简单易用&#xff0c;学习成本极低…

轻预压:滚珠丝杆精度与刚性的平衡点!

预压是指在所需的工作负荷下&#xff0c;使滚珠丝杆预先承受一定的负荷&#xff0c;从而使滚珠丝杆的轴向向心度和侧向偏差达到较小的偏差范围&#xff0c;保证了滚珠丝杆的准确性和稳定性&#xff0c;也确保机器的高精度和长期运作的可靠性。 预压是滚珠丝杆设计中的一个重要参…

vue3项目图片压缩+rem+自动重启等plugin使用与打包配置

一、Svg配置 每次引入一张 SVG 图片都需要写一次相对路径&#xff0c;并且对 SVG 图片进行压缩优化也不够方便。 vite-svg-loader插件加载SVG文件作为Vue组件&#xff0c;使用SVGO进行优化。 插件网站https://www.npmjs.com/package/vite-svg-loader 1. 安装 pnpm i vite-svg…

智能与伦理:Kimi与学术道德的和谐共舞

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 Kimi&#xff0c;由月之暗面科技有限公司开发的智能助手&#xff0c;擅长中英文对话&#xff0c;能处理多种文档和网页内容。在论文写作中&#xff0c;Kimi可提供资料查询、信息整理、语…

JavaWeb--jquery篇

概述 jQuery是一个快速、简洁的JavaScript框架&#xff0c;是一个优秀的JavaScript代码库&#xff08;框架&#xff09;于2006年1月由John Resig发布。它封装JavaScript常用的功能代码&#xff0c;提供一种简便的JavaScript设计模式&#xff0c;优化HTML文档操作、事件处理、动…

Faster-RCNN·代码解读系列01:Selective Search 和 R-CNN、Fast-CNN 简介

Selective Search 和 R-CNN、Fast-CNN 简介 1 目标检测算法简介1.0滑窗法的思路1.1 Selective Search 和 R-CNN 简介1.2.1 Selective Search简介1.1.1 Selective Search的思路1.1.2 Selective Search图解 1.2 Selective Search 和 Fast-CNN简介1.2.1 SPP和ROI Pooling简介1.2.2…

高级计算机体系结构--期末教材复习

Chap2 性能评测和并行编程性能评测并行编程为什么需要三次 barrier改进方法 Chap3 互连网络交换和路由二维网格中 XY 路由 死锁、活锁及饿死死锁避免的方法&#xff1a;虚通道、转弯模型二维网格中最小 西向优先、北向最后和负向优先算法转弯模型&#xff1a;超立方体的部分自适…

原生JavaScript实现录屏功能

1. 前言 使用JavaScript实现浏览器中打开系统录屏功能 示例图: 2. 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><…

深度学习——卷积神经网络(convolutional neural network)CNN详解(一)——概述. 步骤清晰0基础可看

在CNN的学习过程中我会提供相应的手算例子帮助理解训练过程。 其他关于神经网络的学习链接如下&#xff1a; 一、了解卷积神经网络 卷积神经网络的作用 总的来说&#xff0c;卷积神经网络的第一个主要作用是对图像进行特征提取&#xff0c;所谓特征提取&#xff0c;就是明白…