Запуск тени mvn на уже существующей банке uber

У меня есть банка uber, которая уже создана (не через Maven, у меня просто есть банка). Мне нужно использовать его вместе с другой банкой, у которой есть конфликты зависимостей. Я хотел бы затенить все библиотеки в первой банке uber, за исключением нескольких классов, которые должны быть общедоступными.

Какова настройка, чтобы взять существующую банку и использовать плагин Maven Shade для переименования большинства (кроме белого списка) своих классов, создавая новую банку uber?


person SRobertJames    schedule 07.07.2014    source источник


Ответы (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-файла.

Следующая трассировка стека (полученная при попытке запустить 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"
person dan.m was user2321368    schedule 08.07.2014
comment
Почему это будет непригодно? Пока к этому классу нет доступа за пределами Jar, не будет ли тень изменять байт-код для использования relocated.a.b.c? - person SRobertJames; 09.07.2014
comment
Если вы посмотрите на трассировку стека, то увидите, что перемещение «редактирует» ссылки на типы, которые не определены в банке. Таким образом, ссылка на java.lang.Object заменяется на relocated.java.lang.Object, которой нет в пути к классам. Я собираюсь отредактировать этот ответ, чтобы сделать его немного яснее. - person dan.m was user2321368; 09.07.2014