0

既に生成されている uber jar があります (Maven 経由ではなく、jar を持っているだけです)。依存関係の競合がある別の jar と一緒に使用する必要があります。公開する必要があるいくつかのクラスを除いて、最初の uber jar のすべてのライブラリをシェーディングしたいと思います。

既存の jar を取得し、Maven シェード プラグインを使用してそのクラスのほとんど (ホワイトリストを除く) の名前を変更し、新しい 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.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"
于 2014-07-08T16:11:55.030 に答える