Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Maven打包之maven-shade-plugin

Maven打包之maven-shade-plugin

作者头像
zhangheng
发布于 2020-04-28 10:23:22
发布于 2020-04-28 10:23:22
17.3K00
代码可运行
举报
运行总次数:0
代码可运行

打包是一个比较头疼的事情,默认maven打包的结果只包含项目本身的代码,如果要执行代码,还得带上依赖。maven-shade-plugin插件就能够帮我们把项目依赖的包也打进最终文件。

shade打包过程

shade插件绑定在maven的package阶段,他会将项目依赖的jar包解压并融合到项目自身编译文件中。

举个例子:例如我们的项目结构是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
com.gavinzh.learn.shade
    Main

假设我们依赖了一个jar包,他的项目结构是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
com.fake.test
    A
    B

那么shade会将这两个结构融合为一个结构:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
com
    gavinzh.learn.shade
        Main
    fake.test
        A
        B

并将上述文件打成一个jar包。

如果shade只有这一个功能,那它并不能够满足开发者的需求。因此,它提供了ResourceTransformer的接口,处理扫描到的资源文件,修改最终的输出结果,这个功能正是大家所需要的。

shade配置

shade配置较多,结构也比较复杂,因此,我在这里写了一个比较全的demo,在demo中做注释。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.1.1</version>
            <configuration>
                <!-- put your configurations here -->
                <!--只包含该项目代码中用到的jar,在父项目中引入了,但在当前模块中没有用到就会被删掉-->
                <minimizeJar>true</minimizeJar>
                <!--重新定位类位置,就好像类是自己写的一样,修改别人jar包的package-->
                <relocations>
                    <relocation>
                        <pattern>com.alibaba.fastjson</pattern>
                        <shadedPattern>com.gavinzh.learn.fastjson</shadedPattern>
                        <excludes>
                            <!--这些类和包不会被改变-->
                            <exclude>com.alibaba.fastjson.not.Exists</exclude>
                            <exclude>com.alibaba.fastjson.not.exists.*</exclude>
                        </excludes>
                    </relocation>
                </relocations>
            </configuration>
            <executions>
                <execution>
                    <configuration>
                        <!--创建一个你自己的标识符,位置在原有名称之后-->
                        <shadedArtifactAttached>true</shadedArtifactAttached>
                        <shadedClassifierName>gavinzh</shadedClassifierName>
                        <!--在打包过程中对文件做一些处理工作-->
                        <transformers>
                            <!--META-INF/MANIFEST.MF文件中添加key: value 可以设置Main方法-->
                            <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <manifestEntries>
                                    <mainClass>com.gavinzh.learn.shade.Main</mainClass>
                                    <Build-Number>123</Build-Number>
                                    <Built-By>your name</Built-By>
                                    <X-Compile-Source-JDK>1.7</X-Compile-Source-JDK>
                                    <X-Compile-Target-JDK>1.7</X-Compile-Target-JDK>
                                </manifestEntries>
                            </transformer>
                            <!--阻止META-INF/LICENSEMETA-INF/LICENSE.txt-->
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer"/>
                            <!--合并所有notice文件-->
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ApacheNoticeResourceTransformer">
                                <addHeader>true</addHeader>
                            </transformer>
                            <!--如果多个jar包在META-INF文件夹下含有相同的文件,那么需要将他们合并到一个文件里-->
                            <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>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/spring.factories</resource>
                            </transformer>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/spring.tld</resource>
                            </transformer>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/spring-form.tld</resource>
                            </transformer>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/spring.tooling</resource>
                            </transformer>
                            <!--如果多个jar包在META-INF文件夹下含有相同的xml文件,则需要聚合他们-->
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ComponentsXmlResourceTransformer"/>
                            <!--排除掉指定资源文件-->
                            <transformer implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
                                <resource>.no_need</resource>
                            </transformer>
                            <!--将项目下的文件file额外加到resource中-->
                            <transformer implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">
                                <resource>META-INF/pom_test</resource>
                                <file>pom.xml</file>
                            </transformer>
                            <!--整合spi服务中META-INF/services/文件夹的相关配置-->
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                        </transformers>
                    </configuration>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

上边的配置基本上可以满足我们的需求,但需要注意的是像spring包比较分散,但每个包中的META-INF中有很相同名称的文件,需要通过特定的ResourceTransformer将他们融合到一个文件中。如果项目要求不能融合或者融合会出错,那么建议使用assembly插件打包。

参考

Apache Maven Shade Plugin

maven-shade-plugin 简书

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-05-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
maven 插件之 maven-shade-plugin,解决同包同名 class 共存问题的神器
maven-shade-plugin 官网已经介绍的很详细了,我给大家简单翻译一下
青石路
2024/08/31
3740
maven 插件之 maven-shade-plugin,解决同包同名 class 共存问题的神器
Idea+maven+scala构建包并在spark on yarn 运行
在pom.xml配置文件中配置spark开发所需要的包,根据你Spark版本找对应的包,Maven中央仓库
笨兔儿
2019/05/26
7010
聊聊如何避免多个jar通过maven打包成一个jar,多个同名配置文件发生覆盖问题
不知道大家在开发的过程中,有没有遇到这种场景,外部的项目想访问内部nexus私仓的jar,因为私仓不对外开放,导致外部的项目没法下载到私仓的jar,导致项目因缺少jar而无法运行。
lyb-geek
2023/02/28
1.9K0
聊聊如何避免多个jar通过maven打包成一个jar,多个同名配置文件发生覆盖问题
maven常用插件
http://maven.apache.org/plugins/maven-assembly-plugin/
编程随笔
2019/09/11
1.7K0
Maven打包三种方法 转
Maven可以使用mvn package指令对项目进行打包,如果使用Java -jar xxx.jar执行运行jar文件,会出现"no main manifest attribute, in xxx.jar"(没有设置Main-Class)、ClassNotFoundException(找不到依赖包)等错误。
stys35
2019/03/05
2.9K0
Maven打包三种方法和常用命令大全
1 方法一:使用maven-jar-plugin和maven-dependency-plugin插件打包
全栈程序员站长
2022/09/01
7.8K0
如何利用Maven将代码打包成第三方公共jar包?
在项目开发过程中,我们经常需要将一些公共方法提取出来,然后单独封装成一个第三方公共jar包,采用普通的方式打包后的jar,依赖的工程执行编译时,却提示找不到对应的依赖包,那么如何将工程打包为可执行jar包呢?
Java极客技术
2022/12/04
1.9K0
如何利用Maven将代码打包成第三方公共jar包?
Maven - 打包之争:Jar vs. Shade vs. Assembly
Maven 提供了多种打包方式,其中常见的包括三种:jar、shade、assembly。下面是它们的详细比较:
小小工匠
2023/11/25
1.7K0
Maven - 打包之争:Jar vs. Shade vs. Assembly
maven项目配置框架
任何一个maven项目都会继承一个默认的父pom配置:Super POM,详见:https://maven.apache.org/guides/introduction/introduction-to-the-pom.html 。 在pom.xml中可以直接使用一些变量值,如:
编程随笔
2019/09/11
5210
maven 基础 maven-shade-pluginMaven Scopepom.xml 样例
Dependency Scope 在POM 4中,<dependency>中还引入了<scope>,它主要管理依赖的部署。目前<scope>可以使用5个值: * compile,缺省值,适用于所有阶段,会随着项目一起发布。 * provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。 * runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。 * test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。 * system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。
WindWant
2020/09/11
1.1K0
springboot项目使用IDEA远程Debug「建议收藏」
项目上线之后,如果日志打印的很模糊或者业务逻辑比较复杂,有时候无法定位具体的错误原因,因此可以通过IDEA远程代理进行Debug。
全栈程序员站长
2022/09/30
1.2K0
springboot项目使用IDEA远程Debug「建议收藏」
springboot开发spark-submit的java代码
习惯使用spark-submit提交python写的pyspark脚本,突然想开发基于springboot开发java spark代码。在实际开发工程中,由于对springboot不熟,遇到了很多问题,好在最终都解决了。以下记录了一些问题及其解决方法。
mikeLiu
2020/08/02
2.9K0
Dubbo服务治理篇——低版本Dubbo与高版本Spring集成
使用低版本Dubbo时,因为要与4.x与5.x版本的Spring集成,所以,我们需要做如下修改。
冰河
2020/10/29
9330
maven打包配置
对于第三方引入的jar包,如果通过 ${project.basedir} 加载项目中的第三方jar包,可以编译运行,但是第三方jar包打不进去,具体可以看 下一篇 <?xml version="1.
kiki.
2022/09/29
4730
这样优化Spring Boot,启动速度快到飞起!
微服务用到一时爽,没用好就呵呵啦,特别是对于服务拆分没有把控好业务边界、拆分粒度过大等问题,某些 Spring Boot 启动速度太慢了,可能你也会有这种体验,这里将探索一下关于 Spring Boot 启动速度优化的一些方方面面。
艾小仙
2022/12/05
3K0
这样优化Spring Boot,启动速度快到飞起!
spring-namespace实现自己的自定义标签类
5、编写spring.handlers和spring.schemas供spring读取
Java架构师必看
2021/05/14
5230
spring-namespace实现自己的自定义标签类
spring-boot-starter大力出奇迹
​  上篇文章我们已经聊了SpringBoot的启动过程中的各类扩展点,那么从http://start.spring.io上我们生成的demo项目中,到目前就剩下了maven工程的pom.xml还没有进行探索了,那么本文我们就来看看这里面到底都有啥,把大力出奇迹的常见spring-boot-starter来聊一聊,以便更好地使用SpringBoot.
阿豪聊干货
2018/08/09
9990
Maven - 统一构建规范:Maven 插件管理最佳实践
https://maven.apache.org/plugins/index.html
小小工匠
2023/08/16
1.7K0
Maven - 统一构建规范:Maven 插件管理最佳实践
2021年大数据常用语言Scala(二十八):scala面向对象 MAVEN依赖和类
添加一个main方法,并创建Customer类的对象,并给对象赋值,打印对象中的成员,调用成员方法
Lansonli
2021/10/11
4010
聊聊springboot项目如何利用jmh来进行基准测试
JMH(Java Microbenchmark Harness)是由OpenJDK团队开发的一个用于Java微基准测试工具套件,主要是基于方法层面的基准测试,精度可以达到纳秒级。它提供了一种标准、可靠且可重复的方式来衡量Java代码的性能,包括方法调用、对象创建以及其他类型的 JVM 级别的操作。JMH 通过生成优化过的字节码来确保基准测试不受常见陷阱的影响,如热身不足、垃圾回收干扰、编译器优化等,从而产生更准确的性能指标
lyb-geek
2024/07/09
2300
聊聊springboot项目如何利用jmh来进行基准测试
推荐阅读
相关推荐
maven 插件之 maven-shade-plugin,解决同包同名 class 共存问题的神器
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档