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

news2025/1/21 6:35:57

开发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>
                                <transformer
                                        implementation="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.coloradmin.cn/o/527454.html

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

相关文章

命令行下载谷歌云盘超大文件

在这申请API&#xff1a;https://developers.google.com/oauthplayground/

GL绘制自定义线条3_自定义线帽

安卓Path搭配Paint可以设置线帽&#xff0c;我想能不能把我自己的线条绘制Demo也加上类似的功能。 线头规则描述&#xff1a; 1、设一个线宽一半的线段&#xff0c;坐标为(0, 0)到(-lineWidth / 2, 0)。 2、设步骤1的线段有一垂直于它的向量(0&#xff0c;1)&#xff0c;然后传…

成功的项目管理的关键之一——时间计划

在现实的项目管理中&#xff0c;由于时间管理控制不力&#xff0c;导致项目拖期交付使用而使各相关方蒙受损失的案例屡见不鲜&#xff0c;究其原因&#xff0c;不完善的项目时间计划安排是一个重要的方面。成功的项目管理的关键之一就是成功的时间管理&#xff0c;而成功的时间…

Docker中如何限制容器可用的 CPU

默认情况下容器可以使用的主机 CPU 资源是不受限制的。和内存资源的使用一样&#xff0c;如果不对容器可以使用的 CPU 资源进行限制&#xff0c;一旦发生容器内程序异常使用 CPU 的情况&#xff0c;很可能把整个主机的 CPU 资源耗尽&#xff0c;从而导致更大的灾难。本文将介绍…

FileInputFormat的实现类

FileINputFormat的切片机制 FileInputFormat是MapReduce中用于处理文件输入的基类&#xff0c;它定义了输入文件的切片规则&#xff0c;并提供了默认的切片实现。具体来说&#xff0c;FileInputFormat会根据输入文件的大小和块大小等因素计算出每个切片的起始位置和长度&#…

【机器学习】多元线性回归详解和特征压缩

注意⚠️阅读本文前&#xff0c;你应该需要掌握&#xff1a;机器学习线性回归模型、高等数学微积分部分内容、线性代数矩阵部分内容 前情提要&#xff1a;https://blog.csdn.net/weixin_45434953/article/details/130593910 一、多元线性回归的假设函数 首先我们考虑以下的例…

linux Ubuntu Python 3.10 环境报错与解决方案集合

环境配置参考文章&#xff1a;使用Alpaca-Lora基于LLaMA(7B)二十分钟完成微调 1.报错.nvidia/cublas/lib/libcublas.so.11: undefined symbol: cublasLtHSHMatmulAlgoInit, version libcublasLt.so.11 解决方法&#xff1a; pip uninstall nvidia_cublas_cu112.CUDA版本对应…

Guitar Pro8优秀的自动扒谱软件

对于一些技术娴熟的音乐人来说&#xff0c;不仅需要演奏已有的乐谱&#xff0c;有时还需要从听到的其他音乐中将谱子扒下来。扒谱时可以借助扒谱软件&#xff0c;比如Guitar Pro&#xff0c;就是一款优秀的扒谱软件。下面就和大家分享一下guitar pro能自动扒谱吗&#xff0c;gu…

基于Java+SpringBoot+Vue餐厅点餐管理系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

spring boot与asp.net core区别联系

之前一直使用C#编写网站&#xff0c;最近也在了解学习java&#xff0c;根据目前我了解的和学习到的做一个总结分析&#xff0c;写的不好&#xff0c;大家见谅。 联系 名称javac#DIspringasp.net core、Autofac、UnityAOPspringasp.net coreORMmubatis、HibernateEntityFramew…

【MySQL】MySQL索引之最左前缀优化

文章目录 一、联合索引联合索引执行示例 二、索引的 order by优化MySQL中的排序方式数据准备无索引有索引where子句索引字段顺序不一致order by索引字段顺序不一致索引字段升降序不一致 三、总结 一、联合索引 对主键建立的索引叫做聚簇索引, 对普通字段建立的索引叫做二级索引…

Linux实操篇---常用的基本命令1(跟文件操作相关的命令)

一、常用的基本命令 1.常用的shell命令 Shell可以看作是一个命令解释器&#xff0c;为我们提供了交互式的文本控制台界面。 目前的发行版本&#xff1a;在bin/sh 最早的版本Unix&#xff1a;Bourne shell—>Bourne Again Shell 取了 B A Sh。因此目前Linux的发行版大多数…

PieCloudDB Database 与多家基础架构软件厂商完成产品兼容性认证

数据库作为数字经济建设的重要基础&#xff0c;扮演着产业数字化和数据价值释放的基石角色。然而&#xff0c;数据库的发展不能仅仅依赖于自身的技术和创新&#xff0c;也需要建立一个良好的生态系统&#xff0c;与各方合作共同推进数据库技术的进步与创新。 拓数派&#xff08…

港联证券|受两大消息刺激,美最大太阳能公司股价创十年最大日涨幅

因两大利好消息&#xff0c;美国第一太阳能公司&#xff08;FirstSolar&#xff0c;下称第一太阳能&#xff09;股价大涨。 5月12日&#xff0c;第一太阳能宣布&#xff0c;拟最高支付8000万美元收购瑞典钙钛矿企业Evolar AB。其中包括交易完成时支付3800万美元&#xff0c;以及…

SpringSecurity-从入门到精通学习笔记

SpringSecurity从入门到精通 课程介绍 0. 简介 ​ Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro&#xff0c;它提供了更丰富的功能&#xff0c;社区资源也比Shiro丰富。 ​ 一般来说中大型的项目都是使用SpringSecurity 来做安全框架。…

基于qt5的应用程序在windows和linux环境下修改图标及制定后缀关联

基于qt5的应用程序在windows和linux环境下修改图标及制定后缀关联 1、windows 1.1 修改应用程序图标 方式一&#xff1a; 使用qmake来生成makefile文件&#xff0c;只需要在.pro中添加&#xff1a; RC_ICONS logo.ico 然后&#xff0c;重新生成makefile文件和应用程序&…

MySQL学习---15、流程控制、游标

1、流程控制 解决复杂问题不可能是通过一个SQL语句完成&#xff0c;我们需要执行多个SQL操作。流程控制语句的作用就是控制存储过程中SQL语句的执行顺序&#xff0c;是我们完成复杂操作必不可少的一部分。只要是执行的程序&#xff0c;流程就分为三大类&#xff1a; 1、顺序结…

MMM(Master-Master replication manager for MySQL)

MMM&#xff08;Master-Master replication manager for MySQL&#xff0c;MySQL主主复制管理器&#xff09; 是一套支持双主故障切换和双主日常管理的脚本程序。MMM 使用 Perl 语言开发&#xff0c;主要用来监控和管理 MySQL Master-Master &#xff08;双主&#xff09;复制&…

【计算机视觉】CLIP:连接文本和图像(关于CLIP的一些补充说明)

文章目录 一、前言二、背景及相关工作三、方法3.1 Costly datasets3.2 Narrow3.3 Poor real-world performance 四、要点4.1 CLIP is highly efficient4.2 CLIP is flexible and general 五、限制六、更广泛的影响七、结论 一、前言 我们推出了一个名为CLIP的神经网络&#xf…

原神服务端搭建架设教程win系统(附客户端+服务端+环境配置)

原神服务端搭建架设教程win系统(附客户端服务端环境配置) 大家好&#xff0c;我是艾西原神一款开放世界冒险3D游戏以七种元素&#xff08;分别为风、雷、岩、火、水、草、冰&#xff09;交汇的幻想世界“提瓦特”创造的游戏世界&#xff0c;以角色扮演的RPG游戏还是有非常多的玩…