在预先存在的超级罐上运行mvn shade

时间:2014-07-07 14:38:00

标签: maven jar maven-shade-plugin uberjar

我有一个已经生成的超级罐子(不是通过Maven;我只是有罐子)。我需要将它与另一个具有依赖冲突的jar一起使用。我希望遮盖第一个超级罐中的所有库,除了一些需要公开的类。

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

1 个答案:

答案 0 :(得分:1)

你可以做一个"重命名 - 全部" maven-shade-plugin的活动类型。例如:

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

基本上将每个包a.b.c移动到relocated.a.b.c(除了我排除的显式模式)。

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

以下堆栈跟踪(从尝试运行使用上面的重定位构建的jar中定义的main()获得)显示对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"