我有一个已经生成的超级罐子(不是通过Maven;我只是有罐子)。我需要将它与另一个具有依赖冲突的jar一起使用。我希望遮盖第一个超级罐中的所有库,除了一些需要公开的类。
采用现有jar的设置是什么,并使用Maven shade插件重命名其类的大部分(白名单除外),生成一个新的超级jar?
答案 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"