- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
目录 。
common-resource-sdk 工程
依赖: nacos-client
依赖: http-client:4.5.3
bdp-business-data-integration-service 工程
依赖: common-resource-sdk
依赖: elasticsearch-rest-client
依赖: http-client:4.5.10
在 bdp-business-data-integration-service 工程中排除了 common-resource 的 http-client 包,但其打出的JAR包中依旧含有 http-client:4.5.3 .
为何排包失败了呢?
本质原因: common-resurce 打包方式是 jar-with-dependencies 。
maven-shade-plugin
Apache Maven : maven-shade-plugin This plugin provides the capability to package the artifact in an uber-jar, including its dependencies and to shade - i.e. rename - the packages of some of the dependencies.(该插件提供了将工件打包到uber jar中的功能,包括其依赖项,并对一些依赖项的包进行着色(即重命名)。) 。
The Shade Plugin has a single goal: (Shade插件只有一个目标:) shade:shade is bound to the package phase and is used to create a shaded jar. (shade:shade绑定到封装阶段,用于创建一个shaded jar。) 。
maven-plugin-shade 插件提供了2个能力: 把整个项目(包含它的依赖)都打包到一个 “uber-jar” 中 shade - 即重命名某些依赖的包。也由此引出了两个问题: + 什么是 uber-jar ? + 这中 打包后带依赖的 Jar 包 一般称为 uber-jar 或 fat-jar 或者 jar-with-dependencies ;意思就是包含依赖的 jar。 + 什么是 shade ? + shade 意为遮挡,在此处可理解为:对依赖的 jar 包的重定向(主要通过重命名的方式).
shade
n. 灯罩;阴凉处;(树)荫;色度;痕迹,影子,遗风;一点;差别;背阴;暗部;阴魂;浓淡深浅
vt. 给…遮挡(光线);画阴影;加灯罩;把…涂暗;险胜
uber
adj.超级的;极其的;最好的;
If you like to use minimizeJar this means you have to use JDK8+. This is based on a required upgrade of dependencies. 如果你喜欢使用minimizeJar,这意味着你必须使用JDK8+。这是基于所需的依赖项升级.
Latest version(最新版本) = 3.5.0 。
https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-shade-plugin 。
Official Document/官方文档 。
General instructions on how to use the Shade Plugin can be found on the usage page. Some more specific use cases are described in the examples given below.
有关如何使用Shade插件的一般说明可以在使用页面上找到。下面给出的示例中描述了一些更具体的用例。
In case you still have questions regarding the plugin's usage, please feel free to contact the user mailing list. The posts to the mailing list are archived and could already contain the answer to your question as part of an older thread. Hence, it is also worth browsing/searching the mail archive.
如果您对插件的使用仍有疑问,请随时联系用户邮件列表。邮件列表中的帖子已存档,可能已经包含了您问题的答案,作为旧线程的一部分。因此,浏览/搜索邮件档案也是值得的。
If you feel like the plugin is missing a feature or has a defect, you can fill a feature request or bug report in our issue tracker. When creating a new issue, please provide a comprehensive description of your concern. Especially for fixing bugs it is crucial that the developers can reproduce your problem. For this reason, entire debug logs, POMs or most preferably little demo projects attached to the issue are very much appreciated. Of course, patches are welcome, too. Contributors can check out the project from our source repository and will find supplementary information in the guide to helping with Maven.
如果你觉得插件缺少功能或有缺陷,你可以在我们的问题跟踪器中填写功能请求或错误报告。创建新问题时,请对您关心的问题进行全面描述。特别是对于修复错误,开发人员能够重现您的问题是至关重要的。出于这个原因,非常感谢整个调试日志、POM,或者最好是附加到该问题的小演示项目。当然,补丁也是受欢迎的。参与者可以从我们的源代码库中查看该项目,并在帮助使用Maven的指南中找到补充信息。
也就是说,当执行 mvn package 时会自动触发 shade .
maven-shade-plugin
,只需要在 pom.xml
的 <plugins>
标签下添加它的配置即可,示例如下:
<project>
//...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<configuration>
<!-- 此处按需编写更具体的配置 -->
</configuration>
<executions>
<execution>
<!-- 和 package 阶段绑定 -->
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
// ...
</project>
默认情况下,会把 项目所有的依赖 都包含进最终的 jar 包中。当然,我们也可在 <configuration> 标签内配置更具体的规则.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!--
<parent>
<artifactId>johnny-webapp-quickstart</artifactId>
<groupId>cn.johnnyzen</groupId>
<version>1.0.0-SNAPSHOT</version>
</parent>
-->
<modelVersion>4.0.0</modelVersion>
<version>1.0.0-SNAPSHOT</version>
<groupId>cn.johnnyzen</groupId>
<artifactId>study-maven</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven-shade-plugin.version>3.5.0</maven-shade-plugin.version>
<fastjson.version>2.0.3</fastjson.version>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>${maven-shade-plugin.version}</version>
<configuration>
<!-- 此处按需编写更具体的配置 -->
</configuration>
<executions>
<execution>
<!-- 和 package 阶段绑定 -->
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
mvn clean install
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!--
<parent>
<artifactId>johnny-webapp-quickstart</artifactId>
<groupId>cn.johnnyzen</groupId>
<version>1.0.0-SNAPSHOT</version>
</parent>
-->
<modelVersion>4.0.0</modelVersion>
<version>1.0.0-SNAPSHOT</version>
<groupId>cn.johnnyzen</groupId>
<artifactId>study-maven</artifactId>
<properties>
<java.jdk.version>1.8</java.jdk.version>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven-shade-plugin.version>3.5.0</maven-shade-plugin.version>
<maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version>
<fastjson.version>2.0.3</fastjson.version>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<source>${java.jdk.version}</source>
<target>${java.jdk.version}</target>
<!--<encoding>${project.build.outputEncoding}</encoding>-->
<!-- <skipTests>true</skipTests> --><!-- 跳过测试 -->
<!--<verbose>true</verbose>--> <!--<showWarnings>true</showWarnings>--> <!--<fork>true</fork>--><!-- 要使compilerVersion标签生效,还需要将fork设为true,用于明确表示编译版本配置的可用 -->
<!--<executable>--><!-- path-to-javac --><!--</executable>--><!-- 使用指定的javac命令,例如:<executable>${JAVA_1_4_HOME}/bin/javac</executable> -->
<!--<compilerVersion>${java.version}</compilerVersion>--><!-- 指定插件将使用的编译器的版本 -->
<!--<meminitial>128m</meminitial>--><!-- 编译器使用的初始内存 -->
<!--<maxmem>512m</maxmem>--><!-- 编译器使用的最大内存 -->
<!--<compilerArgument>-verbose -bootclasspath ${java.home}\lib\rt.jar</compilerArgument>--><!-- 这个选项用来传递编译器自身不包含但是却支持的参数选项 -->
</configuration>
</plugin>
</plugins>
</build>
</project>
mvn clean install
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!--
<parent>
<artifactId>johnny-webapp-quickstart</artifactId>
<groupId>cn.johnnyzen</groupId>
<version>1.0.0-SNAPSHOT</version>
</parent>
-->
<modelVersion>4.0.0</modelVersion>
<version>1.0.0-SNAPSHOT</version>
<groupId>cn.johnnyzen</groupId>
<artifactId>study-maven</artifactId>
<properties>
<java.jdk.version>1.8</java.jdk.version>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven-shade-plugin.version>3.5.0</maven-shade-plugin.version>
<maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version>
<fastjson.version>2.0.3</fastjson.version>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
</dependencies>
<build>
</build>
</project>
mvn clean install
include/exclude
2 种操作 '*
' 、 '?'
groupId:artifactId[[:type]:classfier]
<configuration>
<artifactSet>
<excludes>
<exclude>classworlds:classworlds</exclude>
<exclude>junit:junit</exclude>
<exclude>jmock:*</exclude>
<exclude>*:xml-apis</exclude>
<exclude>org.apache.maven:lib:tests</exclude>
<exclude>log4j:log4j:jar:</exclude>
</excludes>
</artifactSet>
</configuration>
<filters>
结合 <includes>
& <excludes>
标签可实现更灵活的依赖选择。
<configuration>
<filters>
<filter>
<artifact>junit:junit</artifact>
<includes>
<include>junit/framework/**</include>
<include>org/junit/**</include>
</includes>
<excludes>
<exclude>org/junit/experimental/**</exclude>
<exclude>org/junit/runners/**</exclude>
</excludes>
</filter>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
<configuration>
<minimizeJar>true</minimizeJar>
</configuration>
如果最终的 jar 包被其他的项目所依赖的话,直接地引用此 jar 包中的类可能会导致类加载冲突,这是因为 classpath 中可能存在重复的 class 文件。为了解决这个问题,我们可以使用 shade 提供的 重定位功能 ,把部分类 移动到一个全新的包 中。示例如下:
<configuration>
<relocations>
<relocation>
<pattern>org.codehaus.plexus.util</pattern>
<shadedPattern>org.shaded.plexus.util</shadedPattern>
<excludes>
<exclude>org.codehaus.plexus.util.xml.Xpp3Dom</exclude>
<exclude>org.codehaus.plexus.util.xml.pull.*</exclude>
</excludes>
</relocation>
</relocations>
</configuration>
涉及标签:
<pattern>:原始包名
<shadedPattern>:重命名后的包名
<excludes>:原始包内不需要重定位的类,类名支持通配符
例如,在上述示例中,我们把 org.codehaus.plexus.util 包内的所有子包及 class 文件(除了 ~.xml.Xpp3Dom 和 ~.xml.pull 包下的所有 class 文件)重定位到了 org.shaded.plexus.util 包内。
当然,如果包内的大部分类我们都不需要,一个个排除就显得很繁琐了。 此时我们也可以使用 <includes> 标签来指定我们仅需要的类,示例如下:
<project>
...
<relocation>
<pattern>org.codehaus.plexus.util</pattern>
<shadedPattern>org.shaded.plexus.util</shadedPattern>
<includes>
<include>org.codehaud.plexus.util.io.*</include>
</includes>
</relocation>
...
</project>
<mainClass>
启动类就可以了。
<project>
...
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>org.sonatype.haven.HavenCli</mainClass>
</transformer>
</transformers>
</configuration>
...
</project>
熟悉 jar 包的朋友们都知道, jar 包中默认会包含一个 MANIFEST.MF 文件 ,里面描述了一些 jar 包的信息 。 使用 java 自带的 jar 命令打包的时候可以指定 MANIFEST.MF,其中也可以指定 Main-Class 来使得 jar 包可运行。 那么使用 shade 来指定和直接在 MANIFEST.MF 文件中指定有什么区别呢?
答案是 没有区别 ,细心的读者会发现 <mainClass> 标签的父标签是 <transformer> 有一个 implementation 属性,其值为 “~.ManifestResourceTransformer”,意思是 Manifest 资源文件转换器。 上述示例只自指定了启动类,因此 shade 会为我们自动生成一个包含 Main-Class 的 MANIFEST.MF 文件 ,然后在打 jar 包时指定这个文件.
那如果我们想要完全定制 MANIFEST.MF 文件内容怎么办呢?我们可以使用 <manifestEntries> 标签,示例如下:
<project>
...
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Main-Class>org.sonatype.haven.ExodusCli</Main-Class>
<Build-Number>123</Build-Number>
</manifestEntries>
</transformer>
</transformers>
</configuration>
...
</project>
可执行jar包通过 java -jar 命令启动 。
项目中涉及到的依赖可能会有它们所必需的资源文件,使用 shade 可以把它们聚合在同一个 jar 包中。 默认地,shade 为我们提供了 12 个 ResourceTransformer 类:
类名 | 作用 |
---|---|
ApacheLicenseResourceTransformer | 防止 LICENSE 文件重复 |
ApacheNoticeResourceTransformer | 准备合并的 NOTICE |
AppendingTransformer | 为某个资源文件附加内容 |
ComponentsXmlResourceTransformer | 聚合 Plexus components.xml |
DontIncludeResourceTransformer | 防止包含指定的资源 |
GroovyResourceTransformer | 合并 Apache Groovy 的扩展模块 |
IncludeResourceTransformer | 添加项目中的文件为资源文件 |
ManifestResourceTransformer | 自定义 MANIFEST 文件 |
PluginXmlResourceTransformer | 聚合 Maven 的 plugin.xml 配置 |
ResourceBundleAppendingTransformer | 合并 ResourceBundles |
ServicesResourceTransformer | 重定位且合并 META-INF/services 资源文件中的 class 文件 |
XmlAppendingTransformer | 为 XML 资源文件附加内容 |
如果上述 12 个类都不能够满足我们的需求,我们可以实现 shade 提供的接口,按需自定义一个 ResourceTransformer ,实现方法详见官网 Using your own Shader implementation.
最后此篇关于[Maven]maven插件系列之maven-shade-plugin的文章就讲到这里了,如果你想了解更多关于[Maven]maven插件系列之maven-shade-plugin的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在寻找一种方法来解析字符串以获取 int,然后偶然发现: NumberUtils.toInt("blah",99); 我将它输入到我的 IDE 中,它会自动为我导入它: import autova
我是一名 CS 学生,在我们的期末考试中,我们被告知要通过光线追踪在多个球体上构建反射。这几乎就是我们得到的指导,除了完成后的外观图片。所以我需要球体,它们是反射(使用光线追踪)映射到它们上的,并带有
我正在使用 maven 来配置由多个小型服务组成的应用程序。大多数用 java 开发的服务共享相同的 maven 配置,如在相同的构建生命周期中,一些共享资源(如 spring AMQP)。 所以我在
我正在尝试使用 HBaseTestingUtility 1.2 与 hbase-shaded-client & hbase-shaded-server .它向我抛出了以下异常。谁能告诉我如何避免这种情
当使用 m2eclipse 工具为为 Maven Shade Plugin 配置的项目在 eclipse 中运行 Maven 构建时,构建失败并显示以下错误消息: 无法执行目标 org.apache.
我直接从 apache maven 文档中复制了 maven shade 插件的配置 https://maven.apache.org/plugins/maven-shade-plugin/examp
我试图从 Spring Boot 运行 Hello World 示例。当我在模块上运行“mvn package”时,出现以下错误:- [ERROR] Failed to execute goal or
在尝试构建旧版本的 Apache CXF 2.2.2 时,我一直收到 maven-shade-plugin 使用的 XmlAppendingTransformer 产生的错误:无法连接以获取 ht
我正在尝试使用 maven-shade-plugin 来区分 Java 6 和 Java 7 Artifact 。我的理解来自this link就是原来的神器会被阴影的神器代替 [INFO] Repl
我正在尝试遮阳 aws-java-sdk为了按照提到的建议解决库冲突 here .但我看到 maven-shade-plugin ,资源文件(文本)中的条目没有得到更新。例如 request.hand
我正在寻找一个“神奇”的功能,它可以拍摄图像并返回副本,但将一组色调替换为另一组色调。 例如我有一张红色鱼的照片:它有各种灰度和黑色和白色,但本质上是各种深浅不一的红色。我想将它传递给这个“魔术”函数
开心一刻 有一天螃蟹出门,不小心撞倒了泥鳅泥鳅很生气地说:你是不是瞎啊!螃蟹说:不是啊,我是螃蟹 概述 maven-shade-plugin 官网已经介绍的很详细了,我给大家简单翻译一
开心一刻 有一天螃蟹出门,不小心撞倒了泥鳅泥鳅很生气地说:你是不是瞎啊!螃蟹说:不是啊,我是螃蟹 概述 maven-shade-plugin 官网已经介绍的很详细了,我给大家简单翻译一
我在我的项目中使用 commons-io 并想对其进行着色。我遇到了一个我似乎无法弄清楚的警告: [WARNING] commons-io-2.7.jar, murder-1.0-SNAPSHOT.j
我正在使用 shade 插件创建一个包含所有依赖项的 jar。在我的 pom.xml 中应用此配置相对简单: org.apache.maven.plugins maven-shade-plugin
上下文 我有一个包含多个模块的 IntelliJ 项目。我正在使用 maven-shade-plugin 来压缩依赖项,同时减少 jar 大小。项目结构如下; 顶级父级 (pom)(聚合 api 和
我有一个同时包含Java和Scala组件的maven项目,但是当我使用maven-shade-plugin时,它会同时为Java和Scala文件定位软件包名称,但是仅重命名Java文件中的软件包,Sc
到目前为止,我一直在使用 Maven 程序集插件为每个 Artifact 生成两个 JAR - 已编译的源代码和依赖项 - 原因很简单 - 通过网络仅部署已编译的源代码比部署一体化 JAR 快得多具有
我试图使用Maven Shade并包装ElasticSearch jar。 之所以这样做,是因为我的项目中Lucene版本之间存在冲突。 但是当我使用Shade时发现了问题。它不会更改META-INF
我正在使用 maven-shade-plugin 创建一个可执行 jar,其中包含项目的所有依赖项。有时,这些依赖项会带来自己的依赖项,这些依赖项会与其他库的依赖项发生冲突,并且 maven-shad
我是一名优秀的程序员,十分优秀!