で「すべての名前を変更」タイプのアクティビティを実行できます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 の構築に使用される依存関係内で定義されているかどうかに関係なく、そのパターンに一致するクラスへのすべての参照を移動するようです。
次のスタック トレース (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"