gpt4 book ai didi

java - Maven - 有没有办法轻松创建一个 'uber' jar 并重新定位所有依赖项?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:21:31 26 4
gpt4 key购买 nike

我们需要使用 Maven 构建一个 jar,以包含所有依赖项的方式,而且所有这些依赖项都被重命名(重新定位)。

假设我们自己的包都以com.mycompagny.projectx.*开头“。我们希望项目依赖项将其包重命名为以“embedded 开头",但不是我们自己的类(class)。

使用 maven-shade-plugin例如,我无法做到这一点:

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

在这里<pattern>*</pattern>无效。另外,如果我使用 <pattern></pattern> (空字符串),然后所有内容都被重新定位到“嵌入式”包,甚至是资源(“META-INF”目录也是如此)!当然,我们希望资源保留在 jar 的根目录中。

我想我们可以创建多个 <relocation>元素,每个依赖包一个,但这将是很多工作:<relocation>com</relocation> , <relocation>net</relocation> , <relocation>javax</relocation>

关于如何在不触及我们自己的类、资源和“META-INF”目录的情况下轻松地将 所有 依赖项重新定位到 uber jar 中的任何想法?

最佳答案

更新:此解决方案实际上不起作用,请阅读到最后。

我通过查看maven-shade-plugin的源代码找到了解决方案!它似乎没有在任何地方记录,但有一个 <rawString> 可以添加到 <relocation> 的参数元素,所以它认为 <pattern><shadedPattern>作为正则表达式模式而不是包/文件名。

maven-shade-plugin然后代码使用类似的东西:

path.replaceAll(pattern, shadedPattern)

处理这些模式。

示例:

<relocation>
<pattern>^([^/]*\.properties)$</pattern>
<shadedPattern>embedded/$1</shadedPattern>
<rawString>true</rawString>
</relocation>

这是一个虚拟示例,它重新定位了根目录中的所有 .properties 文件。使用这种技术,可以准确控制重定位的内容和方式,我很确定。

这是一个更好的例子,它满足了我的需要(尽管还需要做一些测试):

<relocation>
<pattern>^(?!(com/mycompagny/|META-INF))(.*/.*)$</pattern>
<shadedPattern>embedded/$2</shadedPattern>
<rawString>true</rawString>
</relocation>

更新:遗憾的是,最后一个模式意味着所有使用的东西都将被重命名,除了“com.mycompagny”和 META-INF 文件夹。问题是,像 java.lang.Object 这样的东西将更名!当代码运行时,会抛出这样的异常:

java.lang.ClassNotFoundException: embedded.java.lang.Object

关于java - Maven - 有没有办法轻松创建一个 'uber' jar 并重新定位所有依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28241764/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com