当前位置: 首页 > 编程日记 > 正文

maven-assembly-plugin和maven-shade-plugin打包区别及弊端

使用 maven 插件 maven-shade-plugin 对可执行 java 工程及其全部依赖 jar 进行打包
maven-shade-pluginmaven-assembly-pluginmavenjar打包

现在基本上都是采用 maven 来进行开发管理,我有一个需求是需要把通过 maven 管理的 java 工程打成可执行的 jar 包,这样也就是说必需把工程依赖的 jar 包也一起打包。而使用 maven 默认的 package 命令构建的 jar 包中只包括了工程自身的 class 文件,并没有包括依赖的 jar 包。我们可以通过配置插件来对工程进行打包,pom 具体配置如下:

maven-assembly-plugin (使用此插件会有一些问题)

Xml代码

maven-assembly-plugin false jar-with-dependencies com.chenzhou.examples.Main make-assembly package assembly

其中 的值表示此工程的入口类,也就是包含 main 方法的类,在我的例子中就是 com.chenzhou.examples.Main。配置完 pom 后可以通过执行 mvn assembly:assembly 命令来启动插件进行构建。构建成功后会生成 jar 包,这样我们就可以在命令行中通过 java -jar XXX.jar 来运行 jar 文件了。

不过使用此插件会有一些问题:我在工程中依赖了 spring 框架的 jar 包,我打包成功后使用命令来调用 jar 包时报错如下(内网环境):

Shell代码

org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document 'http://www.springframework.org/schema/beans/spring-beans-3.0.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.  

关于此问题报错的原因,我在网上找到一篇文章对此有比较详细的解释:http://blog.csdn.net/bluishglc/article/details/7596118 简单来说就是 spring 在启动时会加载 xsd 文件,它首先会到本地查找 xsd 文件(一般都会包含在 spring 的 jar 包中),如果找不到则会到 xml 头部定义的 url 指定路径下中去寻找 xsd,如果找不到则会报错。

附:在 spring jar 包下的 META-INF 文件夹中都会包含一个 spring.schemas 文件,其中就包含了对 xsd 文件的路径定义,具体如下图所示:
在这里插入图片描述

图:spring-aop.jar 包下 META-INF 文件夹下的内容
在这里插入图片描述

图:spring.schemas 文件内容

由于我的工程是在内网,所以通过 url 路径去寻找肯定是找不到的,但是比较奇怪的是既然 spring 的 jar 包中都会包含,那为什么还是找不到呢?

原来这是 assembly 插件的一个 bug,具体情况参见:http://jira.codehaus.org/browse/MASSEMBLY-360

该 bug 产生的原因如下:工程一般依赖了很多的 jar 包,而被依赖的 jar 又会依赖其他的 jar 包,这样,当工程中依赖到不同的版本的 spring 时,在使用 assembly 进行打包时,只能将某一个版本 jar 包下的 spring.schemas 文件放入最终打出的jar包里,这就有可能遗漏了一些版本的 xsd 的本地映射,所以会报错。

所以一般推荐使用另外的一个插件来进行打包,插件名称为:maven-shade-plugin,shade 插件打包时在对 spring.schemas 文件处理上,它能够将所有 jar 里的 spring.schemas 文件进行合并,在最终生成的单一 jar 包里,spring.schemas 包含了所有出现过的版本的集合,要使用 shade 插件,必须在 pom 进行如下配置:

Xml代码

<plugin>  <groupId>org.apache.maven.plugins</groupId>  <artifactId>maven-shade-plugin</artifactId>  <version>1.4</version>  <executions>  <execution>  <phase>package</phase>  <goals>  <goal>shade</goal>  </goals>  <configuration>  <transformers>  <transformer  implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">  <resource>META-INF/spring.handlers</resource>  </transformer> <transformer  implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">  <mainClass>com.chenzhou.examples.Main</mainClass>  </transformer>  <transformer  implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">  <resource>META-INF/spring.schemas</resource>  </transformer>  </transformers>  </configuration>  </execution>  </executions>  
</plugin>  

上面配置文件中有一段定义:

<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>

上面这段配置意思是把 spring.handlers 和 spring.schemas 文件以 append 方式加入到构建的 jar 包中,这样就不会出现 xsd 找不到的情况。

配置完 pom 后,调用 mvn clean install 命令进行构建,构建成功后打开工程 target 目录,发现生成了 2 个 jar 包,一个为:original-XXX-0.0.1-SNAPSHOT.jar,另一个为:XXX-0.0.1-SNAPSHOT.jar,其中 original…jar 里只包含了工程自己的 class 文件,而另外的一个 jar 包则包含了工程本身以及所有依赖的 jar 包的 class 文件。我们只需要使用第二个 jar 包就可以了。

相关文章:

【Spark】Spark基础练习题(一)

题目&#xff1a; 1、创建一个1-10数组的RDD&#xff0c;将所有元素*2形成新的RDD 2、创建一个10-20数组的RDD&#xff0c;使用mapPartitions将所有元素*2形成新的RDD 3、创建一个元素为 1-5 的RDD&#xff0c;运用 flatMap创建一个新的 RDD&#xff0c;新的 RDD 为原 RDD 每…

Python(27)_字符串的常用的方法2

#-*-coding:utf-8-*-字符串操作s " bowen " # 从右边删 s1 s.rstrip() print(len(s1)) s2 s1.lstrip() print(len(s2)) 从右边删除元素&#xff0c;从左边删除元素&#xff0c;这个在以后项目中经常用到 二、计算个数 #-*-coding:utf-8-*-字符串操作s " bo…

tensorflow1

1、什么是tensorflow tensorflow是一个开源软件库&#xff0c;使用data flow graphs进行数值计算&#xff0c;最初由Google大脑团队开发&#xff0c;用于机器学习和深度卷积网络的研究&#xff0c;同样适用于其他广泛的领域。 2、访问tensorflow官网&#xff1a;在Windows的hos…

大型企业门户网站设计开发一般性原则和建议

[适用范围] 本文所述的原则、建议适用于大型企业信息门户网站的设计和开发&#xff0c;注意不是小型企业网站、一般企业电子商务网站、企业级Web应用系统。 [一般性原则] 一、网站设计原则 第一原则&#xff1a;内容丰富、明确 网站主要是为浏览着提供信息服务的&#xff0c;作…

8月第3周回顾:四巨头发三大新闻 一报告引多家争议

8月15日是51CTO.com成立两周年的日子&#xff0c;网站举办了多种活动进行了庆祝&#xff1b;凑巧的是&#xff0c;IT界在本周也热闹非凡&#xff1a;微软、甲骨文、IBM和Sun联手送上三份重要新闻&#xff1b;国内一份个人安全的报告引起一场小小的风波——这些都足以让关注IT技…

车辆匹配和平均车速计算

数据测试内容以及详情见 https://github.com/xueyeyu/avgsp /* 作者&#xff1a;雪夜羽 平均车速计算&#xff08;sqlserver&#xff09;基于电警 QQ&#xff1a;1412900482 */ import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement…

为何 Map接口不继承Collection接口

1.首先Map提供的是键值对映射&#xff08;即Key和value的映射&#xff09;&#xff0c;而collection提供的是一组数据&#xff08;并不是键值对映射&#xff09;。 如果map继承了collection接口&#xff0c;那么所有实现了map接口的类到底是用map的键值对映射数据还是用collec…

Linux 开机网络无法自动连接配置、网络开机自动连接

第一步&#xff1a;查看开机后网络是否正常连接&#xff1f; 1、图形界面开机后直接看右上角的网络是否连接正常&#xff08;如图一&#xff09;。 图一&#xff08;表示未正常连接↑↑↑↑↑↑↑↑↑&#xff09; 2、如果是命令页面的&#xff0c;可以使用命令查看网络连接情况…

sql中将分隔字符串转为临时表的方法

问题: 要求将 一字符串 0,1,2,3,4,5 &#xff1b;将,分隔后的每一内容转为一行记录到数据库表中declare table_串转数组 table( adapt_object int default 0) declare tmp_str varchar(100) declare tmp_index int select tmp_index 1 select tmp_str 0,1,12,03,4,5,a,…

每天学一点flash(15) xml的一些常见写法

今天下了大雨来了&#xff0c;什么地方去不了&#xff0c;只好将想写的东西都记载下来。 一些常见的一些xml写法&#xff0c;收集目的就是为了代码调试方便&#xff1a; 一&#xff0e;简单数组单值形 <?xml version"1.0" encoding"UTF-8"?> <i…

spark为什么比hive速度快?

spark是什么&#xff1f; spark是针对于大规模数据处理的统一分析引擎&#xff0c;通俗点说就是基于内存计算的框架 spark和hive的区别&#xff1f; spark的job输出结果可保存在内存中&#xff0c;而MapReduce的job输出结果只能保存在磁盘中&#xff0c;io读取速度要比内存中…

kotlin 练习

kotlin基础语法 samychen 关注 2017.05.28 17:07* 字数 1224 阅读 2434评论 0喜欢 6每种编程语言都有一定的语法、语义和执行顺序(同步)&#xff0c;学习一种新语言也都是从这三者出发&#xff0c;下面我们就只针对kotlin的语法来做简单的介绍。 Kotlin有自己的特性不该被Java的…

软件设计之 数据库设计

[按语&#xff1a;在软件设计或是动态网站开发中&#xff0c;数据库设计时很重要&#xff0c;我觉得可以说是开发工作的核心部分&#xff0c;所以学好数据库设计&#xff0c;是很重要的&#xff0c;也是大有前途的。。。]◆&#xff0e;概念首先要搞清楚容易混淆的两个概念&…

css结构思维导图

以下的图是根据css基础&#xff0c;样式&#xff0c;框模型&#xff0c;定位以及选择器这几个方面总结出来的思维导图&#xff0c;方便记忆以及查询。 转载于:https://www.cnblogs.com/yuexiuyi/p/7352516.html

C#类的修饰符

访问修饰符:public&#xff1a;访问不受限制。protected&#xff1a;访问仅限于包含类或从包含类派生的类型。只有包含该成员的类以及继承的类可以存取.Internal&#xff1a;访问仅限于当前程序集。只有当前工程可以存取.protected internal&#xff1a;访问仅限于当前程序集或…

Appium+Python 自动化测试一之:环境安装(Android篇)

目前网上有大量AppiumPython的APP自动化测试的资料&#xff0c;这里我只是记录一下自己安装的过程&#xff0c;好让自己以后忘记的时候再翻起来看看&#xff0c;快速上手&#xff0c;不想再像之前那样踩坑。 注&#xff1a;因为之前玩过Robot FrameworkSelenium2&#xff0c;所…

sql server 2005 T-SQL @@TOTAL_READ (Transact-SQL)

返回 SQL Server 自上次启动后由 SQL Server 读取&#xff08;非缓存读取&#xff09;的磁盘的数目。 Transact-SQL 语法约定 语法 TOTAL_READ 返回类型 integer 备注 若要显示包含多项 SQL Server 统计信息&#xff08;包括读写活动&#xff09;的报表&#xff0c;请运行 sp_m…

存储结构分四类:顺序存储、链接存储、索引存储 和 散列存储

存储结构分四类&#xff1a;顺序存储、链接存储、索引存储 和 散列存储。 顺序结构和链接结构适用在内存结构中。 顺序表每个单元都是按物理顺序排列的&#xff0c;如果你想访问那个单元你可以根据提供的指针等直接访问到需要的东西&#xff0c;但是链表是逻辑连续不是物理连续…

[luoguP2618] 数字工程(DP)

传送门 离线处理。。。 先线性筛一遍。 直接预处理出所有答案。 注意要用push&#xff0c;用乘法&#xff0c;常数小。 #include <cstdio> #include <cstring> #define N 1000001 #define min(x, y) ((x) < (y) ? (x) : (y))int n, cnt; int f[N], prime[N]; b…

QOS的qmtoken 1

在有拥塞的时候高层协议如TCP可能自己可以控制下拥塞&#xff0c;因此你的队列效果可能不明显了&#xff0c;这个时候TCP就是&#xff0c;网络拥塞丢包增加&#xff0c;重传增加。此时可以定义波特率修改接口带宽&#xff0c;从而从底层截掉带宽制作拥塞或使用LR&#xff0c;LR…

关于SQL的基础知识点

文章目录一 了解SQL二 检索数据三 排序检索数据四 过滤数据五 高级数据过滤六 用通配符进行过滤七 创建计算字段八 使用数据处理函数九 汇总数据十 分组数据十一、 子查询十二、 联结表十三、 创建高级联结十四 组合查询十五 插入数据十六 更新和删除数据十七 创建和操纵表十八…

DB-MySQL:MySQL 事务

ylbtech-DB-MySQL&#xff1a;MySQL 事务1.返回顶部 1、MySQL 事务 MySQL 事务主要用于处理操作量大&#xff0c;复杂度高的数据。比如说&#xff0c;在人员管理系统中&#xff0c;你删除一个人员&#xff0c;你即需要删除人员的基本资料&#xff0c;也要删除和该人员相关的信息…

asp.net程序性能优化的七个方面

asp.net程序性能优化的七个方面 一、数据库操作 1、用完马上关闭数据库连接 访问数据库资源需要创建连接、打开连接和关闭连接几个操作。这些过程需要多次与数据库交换信息以通过身份验证&#xff0c;比较耗费服务器资 源。ASP.NET中提供了连接池&#xff08;Connection Pool&a…

如何在Windows Server 2008 Core里面添加Role~~~

SERVER CORE 中添加服务器添加AD&#xff1a;在SERVER CORE 下安装AD必须使用UNATTEND文件来进行安装以下是一个UNATTED文件的实例; DCPROMO unattend file (automatically generated by dcpromo); Usage:; dcpromo.exe /unattend:F:\LONGHORN.txt;[DCInstall]; New forest p…

关于MySQL的四种事务隔离级别!

本文实验的测试环境&#xff1a;Windows 10cmdMySQL5.6.36InnoDB 一、事务的基本要素&#xff08;ACID&#xff09; 原子性&#xff08;Atomicity&#xff09;&#xff1a;事务开始后所有操作&#xff0c;要么全部做完&#xff0c;要么全部不做&#xff0c;不可能停滞在中间环…

[PKUWC2018]随机算法

题意&#xff1a;https://loj.ac/problem/2540 给定一个图(n<20)&#xff0c;定义一个求最大独立集的随机化算法 产生一个排列&#xff0c;依次加入&#xff0c;能加入就加入 求得到最大独立集的概率 loj2540 「PKUWC 2018」随机算法 本质就是计数题 每个点有三种状态&#…

angular4 note

纪录作为新手&#xff0c;用新版angular遇到的一些细节点 1. .angular-cli.json文件 一开始没注意这个文件干啥的&#xff0c;直到我发现有个第三方js&#xff0c;我既没有在index.html里看到引用&#xff0c;也没看到在js代码里有import&#xff0c;找了好久&#xff0c;在这…

初学 Delphi 嵌入汇编[3] - 第一个 Delphi 与汇编的例子

前面知道了一个汇编的赋值指令(MOV), 再了解一个加法指令(ADD), 就可以做个例子了.譬如: ADD AX,BX; 这相当于 Delphi 中的 AX : AX BX;另外提前来个列表 - Delphi 可以用汇编管理以下寄存器:32 位寄存器: EAX EBX ECX EDX ESP EBP ESI EDI16 位寄存器: AX BX CX DX SP BP SI …

通过应用程序域AppDomain加载和卸载程序集之后,如何再返回原来的主程序域

实现目的&#xff1a;动态加载dll&#xff0c;执行完毕之后可以随时卸载掉&#xff0c;并可以替换这些dll&#xff0c;以在运行中更新dll中的类。 其实就是通过应用程序域AppDomain加载和卸载程序集。 在这方面微软有篇文章http://www.microsoft.com/china/msdn/archives/libra…

Sql语法---DDL

1.SQL的定义 结构化查询语言(Structured Query Language)简称SQL,SQL语句就是对数据库进行操作的一种语言。 2.SQL的作用 通过SQL语句我们可以方便的操作数据库中的数据、表、数据库等。 3.SQL的分类 1. DDL(Data Definition Language)数据定义语言用来定义数据库对象&#xff…