爪哇项目maven项目的打包方式

news2024/11/15 9:38:34

 大家好 ~

前言

        现在都是使用idea中maven插件来打包项目,出现了很多问题很多类或者方法、依赖没有打入到包中,发生了很多问题,因此此文章将基于idea中的maven插件打包。

概念

打包分为小包和大包两种概念:

        小包:只打包我们写的代码,不打包代码依赖的其他jar包。

        大包:打包项目本身的代码以及项目所依赖的其他jar包。

如果,如果我们的项目代码只需要被别的代码引用,也就是不需要启动类去运行,那么打包成小包即可,如果我们的项目需要独立的运行,需要启动类去运行,那么就需要打包成大包。

 

准备

我们先创建一个maven项目,创建一个启动类,随便引入一个其他依赖。

打包方式

idea自带的maven工具

        首先使用idea中自带的maven工具打包,idea的maven工具也能打大包和小包。

小包打包第一种方式

        小包打包直接运行maven中的package即可。

 可以看到target目录下生成了jar包

 查看生成的jar包

可以看到只有我们项目的代码,引入的依赖并没有被一起打包

 这里也就不测试能不能通过命令java -jar *.jar 去运行jar包了,因为这是小包,根据小包的作用,我们是并不需要去运行。这里我可以告诉你,并不能运行,因为我们打包的时候并没有去指定启动类的路径,也就是在META-INF目录下的MANIFEST.MF文件中指定启动类。

 

小包打包第二种方式

        大包打包我们是需要指定启动类并且将其他依赖一起打包的。

idea 中 Project Structure:

 配置打包信息

 配置完后,我们可以看到引入的依赖也在被打包的范围,同时如果我们不想打包某个jar包进来,可以在此面板选择删除,这样就不会一同被打包了。

然后去编译打包

 

 可以看到生成了out输出文件夹,并且引入的依赖也一同被打包到同个目录下了,但是还是没有合并成同一个jar,如果要运行的话,必须将依赖的jar放在同一个目录中才能正常运行。

 我们来查看以下生成的jar包

 我们发现,打包的jar貌似比小包更简洁 ,而且也只有我们本身的java代码,没有MANIFTEST文件,没有的话肯定是无法运行的,因为里面记录启动类的路径以及依赖jar包的存放路径。

 很奇怪,我们的MANIFEST文件跑到这里了,并没有被一同打包。

 可以看到MANIFEST中已经生成了jar的存放路径和启动类的路径。

原来,我们的这种打包方式必须要和打包插件共同使用,后面会介绍几种打包插件。

这样的打包方式也有解决方法,就是将我们打包的jar解压,将MANIFEST文件放进去再压缩,最后将压缩好的jar包和引入的jar包放在同一个目录中即可运行。

小包总结
从 上面的两种方式可以看出来,idea自带的打包方式,只能打包成小包,源码的部分只有项目本身的代码。这种 Jar 包就是所谓的 “小包”。


大包打包

从前面来看,打包打包需要使用到第三方插件,以下来介绍一些第三方的打包插件。

maven-compiler-plugin

maven-compiler-plugin是一个Maven插件,可以用来指定项目源码的 jdk 版本,编译后的 jdk 版本,以及编码格式。,单独的使用并不会打包成大包,还是会打成小包,因此一般用来与其他第三方的打包插件联合使用。

依赖配置

<build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <!-- 指定maven编译的jdk版本,如果不指定,maven3默认用jdk 1.5 maven2默认用jdk1.3 -->
                    <source>1.8</source> <!-- 源代码使用的JDK版本 -->
                    <target>1.8</target> <!-- 需要生成的目标class文件的编译版本 -->
                    <encoding>UTF-8</encoding><!-- 字符集编码 -->
                </configuration>
            </plugin>
        </plugins>
    </build>

打包测试

 效果

 可以看到只有源码被打包而已。

maven-jar-plugin 和 maven-dependency-plugin
这两个插件是一起使用的,首先是不推荐使用这种,此种打包方式有一个比较明显的缺点:打包后会在 target 目录下生成 lib 目录(存放依赖 Jar)和项目 Jar。也就是说由于依赖都存在于 lib 目录中,所以要想运行 Jar 包,必须将 Jar 包和 lib 目录放在同一个路径下。
 

maven-jar-plugin
首先说 maven-jar-plugin 插件,它的思想就是:指定启动类、指定依赖包相对于项目最终 Jar 包所在的路径、给 MANIFEST.MF 文件添加 Class-Path 属性(运行项目 Jar 包时会根据 Class-Path 属性来找到其他依赖 Jar 包的路径),因此这个插件就是个配置 MANIFEST.MF 文件的插件
 

maven-dependency-plugin

这个插件才是打包项目的其他依赖,因此这个必须配合上面的插件使用,两者缺一不可。

 

<build>
    <!-- 项目最终打包成的名字 -->
    <finalName>community</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <!-- 会在 MANIFEST.MF 中生成 Class-Path 项 -->
                        <!-- 系统会根据 Class-Path 项配置的路径加载依赖 -->
                        <addClasspath>true</addClasspath>
                        <!-- 指定依赖包所在目录,相对于项目最终 Jar 包的路径 -->
                        <classpathPrefix>lib/</classpathPrefix>
                        <!-- 指定 MainClass -->
                        <mainClass>com.ronz.community.CommunityApplication</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
 
        <!-- 配置依赖包 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <!-- 相当于执行 mvn 命令,将依赖打包到指定目录 -->
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <!--将依赖打包至 target 下的 lib 目录-->
                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

效果

 所以说想要运行项目,必须将lib和源码jar包放在同一个目录下才行,这样显然是不太方便的。

maven-assembly-plugin
使用 maven-assembly-plugin 插件打出来的包只有一个 Jar 包,这个 Jar 包中包含了项目代码以及依赖的代码。也就意味着此种方式打出来的 Jar 包可以直接通过 java -jar xxx.jar 的命令来运行。而且我们可以联合maven-compiler-plugin插件来使用。
 

缺点

maven-assembly-plugin 同名类覆盖时会出现问题。

依赖配置

    <build>
        <!-- 项目最终打包成的名字 -->
        <finalName>test</finalName>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <!-- 指定maven编译的jdk版本,如果不指定,maven3默认用jdk 1.5 maven2默认用jdk1.3 -->
                    <source>1.8</source> <!-- 源代码使用的JDK版本 -->
                    <target>1.8</target> <!-- 需要生成的目标class文件的编译版本 -->
                    <encoding>UTF-8</encoding><!-- 字符集编码 -->
                </configuration>
            </plugin>
 
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <archive>
                        <!-- 指定启动类 -->
                        <manifest>
                            <mainClass>com.cw.HelloStart</mainClass>
                        </manifest>
                    </archive>
                    <!-- 描述后缀 -->
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <!-- 相当于在执行 package 打包时,在后面加上 assembly:single  -->
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

 效果

 

 两者的区别

test-jar-with-dependencies.jar

 

test.jar

  明显可以看到test-jar-with-dependencies.jar才是我们需要的。

 

maven-shade-plugin

根据 Maven 的官方文档介绍,maven-shade-plugin 是一个强大的打包插件。它同样可以将项目的依赖以及项目的源码打包成一个可执行 Jar 包。

依赖配置 

    <build>
        <!-- 项目最终打包成的名字 -->
        <finalName>test</finalName>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <!-- 指定maven编译的jdk版本,如果不指定,maven3默认用jdk 1.5 maven2默认用jdk1.3 -->
                    <source>1.8</source> <!-- 源代码使用的JDK版本 -->
                    <target>1.8</target> <!-- 需要生成的目标class文件的编译版本 -->
                    <encoding>UTF-8</encoding><!-- 字符集编码 -->
                </configuration>
            </plugin>
 
            <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.cw.HelloStart</mainClass>
                                </transformer>
 
                                <!-- 下面的配置仅针对存在同名资源文件的情况,如没有则不用配置-->
                                <!-- 有些项目包可能会包含同文件名的资源文件(例如属性文件)-->
                                <!-- 为避免覆盖,可以将它们的内容合并到一个文件中 -->
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                    <resource>META-INF/spring.handlers</resource>
                                </transformer>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                    <resource>META-INF/spring.schemas</resource>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

效果

 

两种第三方插件打包方式的总结
使用第二种方式的 assembly 打包出来的 Jar 包多多少少有些问题,但是使用第三种方式打包出来的 Jar 包一般都是可用的。所以在将项目打包为大包时,还是推荐使用第三种打包的方式。

如果是大数据项目中,我们日常使用比较多的是maven-assembly-plugin插件,例如:大数据项目中往往有很多shell脚本、SQL脚本、.properties及.xml配置项等,采用assembly插件可以让输出的结构清晰而标准化。
 

 

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

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

相关文章

Conda虚拟环境的复制和迁移

Conda虚拟环境的复制和迁移 在本机复制Conda虚拟环境 conda create --name snapshot --clone myenv相同操作系统之间复制环境 方法一&#xff1a;requirements.txt 这个方法不推荐&#xff0c;因为只会导出你使用pip安装的依赖包&#xff0c;不会导出虚拟环境所依赖的包&am…

SQL应用题分析

SQL应用题的一般考点&#xff1a; 基本表的查询&#xff08;单表、多表、嵌入、分组、排序&#xff09;、向表中插入数据、更新数据、建立视图 关系代数替换sql&#xff0c;使用关系代数来进行查询 基本上就这几点 SQL基本表的插入、更新和建立视图都是死板的&#xff0c;只…

前端开发:CSS中@import指令详解

前言 在前端开发过程中&#xff0c;关于CSS的使用也是非常的&#xff0c;尤其是样式相关的设置等操作。作为前端开发者关于import指令都会有所了解&#xff0c;尤其是在导入CSS样式的时候会用到&#xff0c;但是刚入行不久的前端开发者对应import指令会有所陌生。那么本文就来分…

项目管理:我该怎么安排下属的工作

在刚开始做项目经理的时候&#xff0c;分配任务时会局限于这样的心理&#xff1a;以前我们都是平级的同事&#xff0c;现在我比他们高一个级别了&#xff0c;我说的话他们会不会听啊。 在这个阶段&#xff0c;大部分项目经理都缺乏自信&#xff0c;觉得在项目成员心中威望不足…

Linux shell编程 条件语句if case

条件测试 test命令 测试表达式是否成立&#xff0c;若成立返回0&#xff0c;否则返回其他数值 格式1: test 条件表达式 格式2: [ 条件表达式 ]文件测试 [ 操作符 文件或者目录 ][ -e 1.txt ]#查看1.txt是否存在&#xff0c;存在返回0 echo $? #查看是上一步命令执行结果 0成…

15天学习MySQL计划-存储过程变量判断循环游标函数触发器(进阶篇)-第九天

15天学习MySQL计划-存储过程/变量/判断/循环/游标/函数/触发器&#xff08;进阶篇&#xff09;-第九天 存储过程 1.介绍 ​ 存储过程是事先经过编译并存储是数据库中的一段SQL语句的集合&#xff0c;调用存储过程可以简化应用开发人员的很多工作&#xff0c;减少数据在数据库…

SR常用数据集介绍

1.Download Link&#xff1a; 1.DIV2K: DIV2K Dataset 2.Set5:【实践与问题解决28】最全超分辨率&#xff08;SR&#xff09;数据集介绍以及多方法下载链接_超分辨率数据集_呆呆象呆呆的博客-CSDN博客 3.Set14:【实践与问题解决28】最全超分辨率&#xff08;SR&#xff09;数…

Java --- springboot2的静态资源配置原理

目录 一、静态资源配置原理 1.1、配置类只有一个有参构造器 1.2、资源处理的默认规则 1.3、欢迎页的处理规则 一、静态资源配置原理 springboot启动默认加载xxxAutoConfiguration(自动配置) springmvc功能的自动配置类&#xff0c;生效 Configuration(proxyBeanMethods …

Find My资讯|苹果iOS 17将增强Health应用、引入情绪追踪器

彭博社的马克・古尔曼表示&#xff0c;苹果计划在 iOS / iPadOS 17 系统中&#xff0c;为 iPhone / iPad 用户引入几项和健康相关的新功能。其中最值得关注的一款新应用&#xff0c;可以追踪用户的情绪。 苹果计划进一步增强 Health 应用&#xff0c;引入视力状况相关的功能。…

Python小姿势 - # Python网络爬虫之如何通过selenium模拟浏览器登录微博

Python网络爬虫之如何通过selenium模拟浏览器登录微博 微博登录接口很混乱&#xff0c;需要我们通过selenium来模拟浏览器登录。 首先我们需要安装selenium&#xff0c;通过pip安装&#xff1a; pip install selenium 然后我们需要下载一个浏览器驱动&#xff0c;推荐使用Ch…

【翻译一下官方文档】认识uniCloud云数据库(基础篇)

我将用图文的形式&#xff0c;把市面上优质的课程加以自己的理解&#xff0c;详细的把&#xff1a;创建一个uniCloud的应用&#xff0c;其中的每一步记录出来&#xff0c;方便大家写项目中&#xff0c;做到哪一步不会了&#xff0c;可以轻松翻看文章进行查阅。&#xff08;此文…

虹科活动丨2023第十三届药品质量安全大会精彩回顾

由中国社会科学院食品药品产业发展与监管研究中心、北京中培科检信息技术中心联合主办的2023第十三届&#xff08;春季&#xff09;全国药品质量安全大会暨展览会圆满结束&#xff0c;会上众多优秀企业齐聚一堂&#xff0c;分享独家产品&#xff0c;交流行业知识。 在生物科学…

vCenter(PSC)正常更改或重置administrator@vsphere.local用户的密码方法

1. 正常更改administratorvsphere.local用户密码 在vCenter界面中选择“菜单”下的“系统管理”&#xff0c;如下图所示&#xff1a; 然后在Single Sign On下的用户和组中&#xff0c;选择“vsphere.local”域&#xff0c;再对Administrator用户进行编辑&#xff0c;即可进行…

一图看懂 certifi 模块:证书路径, 资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 certifi 模块&#xff1a;证书路径, 资料整理笔记&#xff08;大全&#xff09; 摘要模块图及类关系图类关系图模块全展开【certifi】统计常量模块1 certifi.core 函数2 co…

【c语言】详解宏定义#define 各种使用方法

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…

vue+Nodejs+Koa搭建前后端系统(三)--koa-generator项目优化修改

前言 计算机系统为Windows 10 专业版 修改package.json配置 原package.json文件中scripts字段的配置字段为&#xff1a; 在终端运行 npm run dev可能会报错 ‘.’ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 解决方法就是修改package.json文件中dev…

Apache Zeppelin系列教程第一篇——安装和使用

一、Apache Zeppelin 介绍 Apache Zeppelin是一种开源的Web笔记本类型交互式数据分析工具&#xff0c;它提供了基于浏览器的界面&#xff0c;允许数据工程师和科学家通过各种语言和工具&#xff0c;如Scala, Python, SQL, R,等等&#xff0c;交互式地进行数据分析、可视化以及…

Word控件Spire.Doc 【脚注】字体(2): 在C#, VB.NET中设置Word字体

Spire.Doc for .NET 是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

执行kubectl命令失败server was refused问题解决

在宿主机上执行kubectl 命令时&#xff0c;出现如下错误 [rootroot ~] kubectl get namespaces The connection to the server xxx.xx.xx.xx:6443 was refused - did you specify the right host or port? 然后再网上找寻解决方案&#xff0c;发现各种各样的解决方案都存在。…

API淘宝数据接口

如果你想在自己的应用中使用淘宝的数据&#xff0c;那么对接淘宝数据接口是必不可少的一步。本文将介绍如何对接API淘宝数据接口&#xff0c;以便你能够顺利获取和使用淘宝的数据。 步骤一&#xff1a;​​获取App Key和App Secret​​ 首先&#xff0c;在淘宝开放平台申请AP…