JAVA项目通过IDEA如何构建可执行JAR

news/2025/1/12 8:54:40/

开发JAVA工程代码(main方法启动)如何构建出可以通过java -jar命令直接执行的jar?如果工程中依赖其他jar又如何处理?本文即针对以上两点通过IDEA开发工具来做一个简单的分析和尝试,测试如下四种方法,如有瑕疵请轻喷。

文字目录

    • 1.通过IDEA直接构建可执行jar
    • 2.通过ANT构建可执行jar
    • 3.通过maven-assembly插件构建可执行jar
    • 4.通过maven-shade插件构建可执行jar

1.通过IDEA直接构建可执行jar

如下所示通过IDEA创建一个本地JAVA工程,此处工程名JavaPackage1,在lib引入一个hutool-all-5.3.7.jar作为测试,目录结构如下点击运行JPackage1正常打印日期。

在这里插入图片描述
如何通过IDEA直接构建可执行jar呢?具体步骤如下:

  1. 选择File -> Project Structure
    在这里插入图片描述

  2. 选择Arifacts->ADD->JAR->Form modules with dependencies
    在这里插入图片描述

  3. 在Main Class栏选择要打包成jar文件的java类,点击OK
    在这里插入图片描述

  4. 出现如下界面,点击ok。最后构建完成jar的启动相关信息会写入到META-INF/MANIFEST.MF清单文件中。
    在这里插入图片描述

  5. 点击Build->Build Artifacts,参照以下两张图,最后在\out\artifacts\目录下生成j可执行ar文件
    在这里插入图片描述
    在这里插入图片描述

  6. 最后通过在cmd窗口直接执行java -jar JavaPackage1.jar 运行正常输出hutool工具类获取的日期
    在这里插入图片描述

后续若修改代码后可直接执行Build->Build Artifacts生成jar,不需要再做前面的配置步骤。同时解压该生成的jar可以发现依赖的hutool工具类是以class文件全部打入进来了。其中生成的MANIFEST.MF文件很简单就指明了Main-Class启动类信息。
在这里插入图片描述
在这里插入图片描述

2.通过ANT构建可执行jar

  • IDEA新建JAVA工程,此处新建工程名JavaPackage2,并在lib下引入hutool依赖jar
    在这里插入图片描述
  • 在项目根目录下编写ant.xml(文件名无要求)
    在这里插入图片描述
    xml中内容如下,具体语法可参考官网学习
<?xml version="1.0" encoding="UTF8"?>
<project name="buildJar" default="jar" basedir="."><tstamp><format property="TODAY" pattern="yyyy-MM-dd HH:mm:ss" /></tstamp><!-- 定义:打包生成的jar的名字 --><property name="jar.name" value="JavaPackage2.jar"/><!-- 定义:主类路径 --><property name="main.class" value="com.xren.jpackage2.JPackage2"/><property name="build.dir" value="${basedir}/build" /><property name="classes.dir" value="${basedir}/classes" /><property name="lib.dir" value="${basedir}/lib" /><!--阶段1.删除之前生成的jar包--><target name="clean"><delete dir="${build.dir}"/><delete dir="${classes.dir}"/></target><!--定义依赖jar路径--><path id="lib.path"><fileset dir="${lib.dir}"><include name="*.jar"/></fileset></path><!--阶段2.编译java文件--><target name="compile" depends="clean"><!--创建classes文件夹--><mkdir dir="${classes.dir}"/><!--编译java文件--><javac srcdir="${basedir}/src" destdir="${classes.dir}" encoding="UTF8"><!--编译依赖jar --><classpath refid="lib.path"/></javac></target><!--阶段3.生成可运行的jar包--><pathconvert property="relate.classpath" pathsep=" "><mapper><chainedmapper><flattenmapper /><globmapper from="*" to="lib/*" /></chainedmapper></mapper><path refid="lib.path" /></pathconvert><target name="jar" depends="compile"><mkdir dir="${build.dir}"/><!--指定清单文件 --><manifest file="${build.dir}/MANIFEST.MF"><!--主类路径--><attribute name="Main-class" value="${main.class}"/><!-- 引入依赖jar-classpath --><attribute name="Class-Path" value="${relate.classpath}" /><attribute name="Built-Date" value="${TODAY}" /></manifest><jar destfile="${build.dir}/${jar.name}"basedir="${classes.dir}"manifest="${build.dir}/MANIFEST.MF"></jar><!--拷贝依赖jar到当前build目录 --><copy todir="${build.dir}/lib" ><fileset dir="${lib.dir}"></fileset></copy></target>
</project>
  • 添加ant.xml文件
    在这里插入图片描述
  • 选中buildJar、点击执行,而后便会在build目录下生成一个可执行的jar
    在这里插入图片描述
  • 执行效果如下
    在这里插入图片描述

此方式生成的jar需要和同级目录下的lib依赖引入才能运行成功,原因是在ant.xml文件中打包时已经在清单文件MANIFEST.MF里固定了lib路径。
在这里插入图片描述
如果想将外部的jar全部打入到jar中,需要在xml中做如下单独引入,最后jar可直接运行。xml配置及包结构如下:

 <target name="jar" depends="compile"><mkdir dir="${build.dir}"/><!--指定清单文件 --><manifest file="${build.dir}/MANIFEST.MF"><!--主类路径--><attribute name="Main-class" value="${main.class}"/></manifest><jar destfile="${build.dir}/${jar.name}"basedir="${classes.dir}"manifest="${build.dir}/MANIFEST.MF"><zipfileset src="${lib.dir}/hutool-all-5.3.7.jar"/></jar></target>

在这里插入图片描述

3.通过maven-assembly插件构建可执行jar

  • 新建Java-maven工程,通过pom引入hutool工具库依赖,此处新建工程名JavaPackage3
    在这里插入图片描述
    pom.xml配置
	<dependencies><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.3.7</version></dependency></dependencies>

如果hutool-all.jar依赖下载不了请检查IDEA的maven配置是否正确。
在这里插入图片描述

  • Pom中引入maven-assembly-plugin插件打包
	<build><plugins><!-- 使用maven-assembly-plugin插件打包 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>3.2.0</version><configuration><archive><manifest><!--主类 --><mainClass>com.xren.jpackage3.JPackage3</mainClass></manifest></archive><descriptorRefs><!-- 可执行jar名称结尾--><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins></build>
  • 执行maven-package,而后在target目录下会生成一个以jar-with-dependencies结尾的可直接执行jar,另外一个jar里面没有依赖不可执行
    在这里插入图片描述
    在这里插入图片描述
  • 该可执行jar的目录结构和清单文件MANIFEST.MF内容如下
    在这里插入图片描述
    在这里插入图片描述

通过Maven-assembly插件构建的jar和ant构建出来的jar中结构基本一致,将依赖jar以class方式加入内容部,同时在打包配置文件中指定清单文件MANIFEST.MF的主启动类Main-Class。

4.通过maven-shade插件构建可执行jar

  • 新建Java-maven工程,通过pom引入hutool工具库依赖,此处新建工程名JavaPackage4
    在这里插入图片描述
  • Pom文件中引入maven-shade-plugin插件
	<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><transformerimplementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass>com.xren.jpackage4.JPackage4</mainClass></transformer></transformers></configuration></execution></executions></plugin></plugins></build>
  • 执行maven package,而后会在target目录下生成一个可执行JavaPackage4-1.0-SNAPSHOT.jar
    在这里插入图片描述
  • 执行该jar,正常运行
    在这里插入图片描述

利用maven-shade-plugin构建除了会生成可执行jar,还会在target目录下生成一个以original-开头的原始jar,该jar不可执行内部没有依赖其他,其清单文件MANIFEST.MF如下:
在这里插入图片描述
而可执行jar清单文件如下,差别就是多了一个Main-Class
在这里插入图片描述

**总结:**综上几种构建可执行jar的方式可知,其都有一个共同点-jar里面有一个包含Main-Class的MANIFEST.MF文件,Main-Class配置指向main方法的主启动类。jar依赖的其他程序会以lib-jar或者class文件的方式包含其中(此文只验证依赖jar,没有验证配置文件依赖)。


http://www.ppmy.cn/news/67742.html

相关文章

docker数据卷volume详细配置案例讲解

docker数据卷 文章目录 docker数据卷1.docker挂载宿主机数据卷1.2.具体配置1.3.挂载命令1.3.1访问页面 2.多端口的容器nginx配置2.1.创建目录位置2.2.访问结果 3.数据卷volume持久化配置3.1.语法格式3.2.详细参数3.3.操作案例3.4.数据改动3.5.查看卷的详细属性 4.与某个容器使用…

Java10

Java10 &#xff08;一&#xff09;、配置文件&#xff08;二&#xff09;、多线程2.1 并发和并行2.2 多线程的实现方式2.3 常见成员方法2.3.1 线程的优先级2.3.2 守护线程&#xff08;备胎线程&#xff09;2.3.3 礼让线程和插入线程 2.4 线程生命周期2.5 线程安全问题2.6 锁2.…

JavaScript全解析-node介绍

node 的概念 ●什么是 node? ○官方原话: ■一个基于 Chrome V8 解析引擎的 JavaScript 运行时环境 ○换句话说: ■从前有一个人, 把浏览器内的 JS 解析引擎拿出来, 和其它内容进行了一个组装 ■变成了一个新的东西, 并起了个名字叫做: NodeJS ●前端 JS 和 NodeJS 的区别 1 …

如何用 ChatGPT 帮你自动分析数据?

前段时间&#xff0c;我在 ChatGPT 选单里看到了 Code Interpreter。但是它正在灰度测试中 —— 先给一部分用户试用&#xff0c;如果反响不错并做了一定改进&#xff0c;就能推广给更多用户。 可惜当时我没能正确理解它的含义&#xff0c;我以为 Code Interpreter 是指「代码解…

EIScopus检索 | 2023年智能交通与未来出行国际会议(CSTFM 2023)

会议简介 Brief Introduction 2023年智能交通与未来出行国际会议(CSTFM 2023) 会议时间&#xff1a;2023年7月28日-30日 召开地点&#xff1a;中国长沙 大会官网&#xff1a; CSTFM 2023-2023 International Conference on Smart Transportation and Future Mobility(CSTFM 202…

apple pencil一定要买吗?平价好用的电容笔合集

这些年来&#xff0c;iPad已经成为了很多人的首选。而iPad的使用者&#xff0c;更看重的是它的功能&#xff0c;很多人都会选择电容笔搭配来做笔记。实际上&#xff0c;Apple Pencil还有许多其他版本&#xff0c;如果只是为了记笔记&#xff0c;那么你不需要买一支价格不菲的苹…

【Python】ftfy 包的理解和使用

一、介绍 ftfy 是一个用于修复和清理 Unicode 文本的 Python 软件包。它的全称是 “fixes text for you”&#xff0c;意思是它可以自动检测和纠正常见的 Unicode 文本问题。 Unicode 是一种字符编码标准&#xff0c;用于表示文本中的字符。然而&#xff0c;有时文本中可能会…

【2021摆烂杯】web

文章目录 web签到一行代码登陆不了黑客网站 web签到 php和python中都是用**来表示幂 请输入三个整数A、B、C&#xff0c;使得&#xff1a; ABC114这里整数解不出来&#xff0c;尝试用开三次方的方法绕过整数限制 (5)**3(-1)**3(-10**(1/3))**3114.0方法二 计算方式为A3B3C31…