Java 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

我们需要使用Maven构建一个jar,其方式包括所有依赖项,但也要重命名(重新定位)所有这些依赖项

假设我们自己的包都以
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