Java Maven-有没有一种方法可以轻松创建';优步';重新定位所有依赖项的jar?
我们需要使用Maven构建一个jar,其方式包括所有依赖项,但也要重命名(重新定位)所有这些依赖项 假设我们自己的包都以Java Maven-有没有一种方法可以轻松创建';优步';重新定位所有依赖项的jar?,java,maven,jar,maven-shade-plugin,Java,Maven,Jar,Maven Shade Plugin,我们需要使用Maven构建一个jar,其方式包括所有依赖项,但也要重命名(重新定位)所有这些依赖项 假设我们自己的包都以com.mycompagny.projectx.*”开头。我们希望将项目依赖项的包重命名为以“embedded”开头,而不是我们自己的类 例如,我无法实现以下目标: <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shad
com.mycompagny.projectx.*
”开头。我们希望将项目依赖项的包重命名为以“embedded
”开头,而不是我们自己的类
例如,我无法实现以下目标:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<configuration>
<shadedArtifactAttached>true</shadedArtifactAttached>
<createDependencyReducedPom>true</createDependencyReducedPom>
<artifactSet>
<includes>
<include>*.*</include>
</includes>
</artifactSet>
<relocations>
<relocation>
<pattern>*</pattern>
<shadedPattern>embedded.</shadedPattern>
<excludes>
<exclude>com.mycompagny.projectx.*</exclude>
</excludes>
</relocation>
</relocations>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
org.apache.maven.plugins
maven阴影插件
2.3
真的
真的
*.*
*
嵌入的
com.mycompagny.projectx*
包裹
阴凉处
这里的*
无效。另外,如果我使用
(空字符串),那么所有内容都会重新定位到“嵌入式”包,甚至资源(也包括“META-INF”目录)!当然我们希望资源保留在jar的根目录
我想我们可以创建多个
元素,每个依赖项包对应一个元素,但这需要大量的工作:com
,net
,javax
,等等
关于如何在不涉及我们自己的类、资源和“META-INF”目录的情况下轻松地重新定位uber jar中的所有依赖项,您有什么想法吗?更新:此解决方案实际上不起作用,请通读到底。
我通过查看maven shade plugin
的源代码找到了一个解决方案!它似乎没有任何文档记录,但是有一个
参数可以添加到
元素中,因此它将
和
视为正则表达式模式,而不是包/文件名
maven shade插件
code然后使用如下内容:
path.replaceAll(pattern, shadedPattern)
处理这些模式
例如:
<relocation>
<pattern>^([^/]*\.properties)$</pattern>
<shadedPattern>embedded/$1</shadedPattern>
<rawString>true</rawString>
</relocation>
虽然这并没有解决您的问题…这是一个非常有用的未记录功能。我有一些资源需要移动到其他文件夹(不是源代码,也不是在包结构中)。感谢您的撰写。
<relocation>
<pattern>^(?!(com/mycompagny/|META-INF))(.*/.*)$</pattern>
<shadedPattern>embedded/$2</shadedPattern>
<rawString>true</rawString>
</relocation>
java.lang.ClassNotFoundException: embedded.java.lang.Object