0

我有一个已经生成的 uber jar(不是通过 Maven;我只有 jar)。我需要将它与另一个存在依赖冲突的 jar 一起使用。我想遮蔽第一个 uber jar 中的所有库,除了一些需要公开的类。

获取现有 jar 并使用 Maven shade 插件重命名其类的大部分(白名单除外),生成一个新的 uber jar 的设置是什么?

4

1 回答 1

2

您可以使用 进行“重命名”类型的活动maven-shade-plugin。例如:

<relocations>
  <relocation>
    <pattern></pattern>
    <shadedPattern>relocated.</shadedPattern>
    <excludes>
      <exclude>com.myfirm.level1.level2.*</exclude>                   
    </excludes>
  </relocation>
</relocations>

基本上会将每个包移动a.b.crelocated.a.b.c(我排除的显式模式除外)。

似乎重定位过程将所有对匹配该模式的类的引用移动,无论该类是否在用于构造 jar 的依赖项中定义。

以下堆栈跟踪(通过尝试运行main()使用上述重定位构造的 jar 中定义的)显示对的引用java.lang.Object已重命名为relocated.java.lang.Object,并且(显然)relocated.找不到版本。

java.lang.NoClassDefFoundError: relocated/java/lang/Object
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)
Caused by: java.lang.ClassNotFoundException: relocated.java.lang.Object
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    ... 13 more
Exception in thread "main"
于 2014-07-08T16:11:55.030 回答