Почему перемещение с помощью плагина maven shadow не работает?

У меня возникли некоторые проблемы при выполнении задания Hadoop, которое включает более новую версию Гуавы, чем та, что входит в дистрибутив Hadoop (CDH 5.2). Это известная проблема. Я пытаюсь решить эту проблему затенением библиотек с помощью плагина Maven Shade. Поэтому я добавил в свой pom.xml следующие строки:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.3</version>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>shade</goal>
        </goals>
        <configuration>
          <relocations>
            <relocation>
              <pattern>com.google</pattern>
              <shadedPattern>thirdparty.com.google</shadedPattern>
            </relocation>
          </relocations>
        </configuration>
      </execution>
    </executions>
  </plugin>

К сожалению, затенение, кажется, не работает. Когда я извлекаю uber-JAR, папки thirdparty/com/google нет, но остается папка com/google.

Кто-нибудь знает, что происходит не так?


person Robert    schedule 17.12.2014    source источник
comment
Вы нашли решение для этого? Спасибо!   -  person Zongjun    schedule 02.11.2016
comment
это доступно для меня, вы можете попробовать еще раз, а затем проверить сгенерированную банку, подействует ли она. ‹br/› ‹configuration› ‹relocations› ‹relocation› ‹pattern›com.google‹/pattern› ‹shadedPattern›shade.com.google‹/shadedPattern› ‹/relocation› ‹/relocations› ‹/configuration›   -  person Jiayu Wang    schedule 07.05.2020


Ответы (3)


Это сработало для меня:

<relocations>
   <relocation>
     <pattern>com.google.</pattern>
     <shadedPattern>thirdparty.com.google.</shadedPattern>
   </relocation>
 </relocations>

обратите внимание на точку в конце шаблона.

person wcolen    schedule 12.04.2017
comment
Как можно импортировать это в файл .scala? импортировать файл ThirdParty.com.google. не работает для меня. - person Rorschach; 29.12.2020

Возможно, вам потребуется явно указать ArtifactSet::includes в разделе <configuration>:

    <configuration>
        <artifactSet>
            <includes>
                <include>com.google.guava:*</include>
                ...
            </includes>
        </artifactSet>
        <relocations>
        ...
person Dennis Huo    schedule 18.12.2014
comment
Для этого вам потребуется указать каждое включение. Это также не решило проблему с затенением. - person AaronM; 07.10.2016

Похоже, вам нужно ссылаться на имя пакета в правиле перемещения, а не на maven groupId, я использую rx v1 в своей библиотеке и не хочу загрязнять им пространство имен пользователя, раздел pom.xml ниже переписывает байт-код, поэтому окончательный uberjar будет иметь rx, но переименованный (shaded.rx).

документ о перемещении тени

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-shade-plugin</artifactId>
  <version>3.0.0</version>
  <executions>
    <execution>
      <phase>package</phase>
        <goals>
          <goal>shade</goal>
        </goals>
        <configuration>
          <relocations>
            <relocation>
              <pattern>rx</pattern>
              <shadedPattern>shaded.rx</shadedPattern>
            </relocation>
          </relocations>
        </configuration>
      </execution>
    </executions>
  </plugin>
person Allenaz    schedule 26.05.2017