Рефакторинг операторов импорта с использованием перемещений Shade в Maven

Я использовал Shade для перемещения зависимости с com.package.x на com.package.y; когда я строю с помощью Maven, он жалуется на несовместимые типы, поэтому мне нужно изменить операторы импорта внутри моего кода, чтобы они соответствовали com.package.y.

Это действительно единственный способ сделать это? Изменение импорта заставляет IntelliJ жаловаться и в основном нарушает интеграцию с IDE. Шейд никак не может изменить импорт?


person whitfin    schedule 22.04.2015    source источник


Ответы (2)


Основной вариант использования теневого плагина — создание uber-jar при перемещении некоторых пакетов внутри него для предотвращения конфликтов. Как правило, вы не хотите развиваться против уберджара.

Если вы на самом деле хотите развиваться против своей затененной банки (или вы используете тень исключительно для перемещения существующей банки), то вам нужно указать свою затененную банку вместо исходной банки, что, как я полагаю, может нужно, чтобы вы очистили циклическую зависимость.

person Idcmp    schedule 22.04.2015
comment
да, я пытаюсь связать Джексона со своей банкой (долгая история). - person whitfin; 22.04.2015
comment
Ваш проект должен просто использовать jackson, как обычно, в com.fasterxml.jackson (или где бы он ни был в наши дни), шейд-плагин позаботится о том, чтобы указать весь код в вашем затененном uberjar на перемещенные пакеты. - person Idcmp; 22.04.2015
comment
Так вы говорите, что шейд должен автоматически обновлять импорт? Всякий раз, когда я запускаю свои тесты после этого, он жалуется на ошибки типа для моего пакета по сравнению с com.fasterxml - person whitfin; 23.04.2015
comment
Возможно, это связано с взаимозависимостью модулей? - person whitfin; 23.04.2015
comment
Похоже, ваша затененная банка появляется в пути к классам ваших тестов. Как правило, мне не нравится, чтобы экспортированная затененная банка была той же самой банкой, в которой есть тесты/и т.д./и т.д., поскольку она предлагает небольшую абстракцию на случай, если я изменю внутреннюю структуру пакета. Это действительно оптимальная вещь, но я понимаю, что вы можете быть не в тот момент; вы пробовали играть со свойством shadowdArtifactAttached; установить его в истину? - person Idcmp; 23.04.2015
comment
@ldcmp Я не совсем то, с чего я сделал неправильно; но я вернулся к тому, что у меня было изначально, и начал заново, следуя вашим инструкциям. Все хорошо :) - person whitfin; 23.04.2015

Эту проблему можно устранить, установив для shadedArtifactAttached значение true в теге configuration.

<shadedArtifactAttached>true</shadedArtifactAttached>

Полный пример и ссылка: https://maven.apache.org/plugins/maven-shade-plugin/examples/attached-artifact.html

У меня была такая же проблема, и я исправил ее, добавив указанное выше свойство. Я делюсь своим pom.xml моего затененного модуля на тот случай, если вы хотите увидеть какие-либо другие значения тегов.

пом.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
      <groupId>org.bitguiders.account.management</groupId>
      <artifactId>account-management</artifactId>
      <version>1.0.24-SNAPSHOT</version>
   </parent>
   <artifactId>account-management-metrics-lib</artifactId>
   <name>account-management-metrics-lib</name>
   <description>Bundled client library</description>
   <properties>
      <shaded.package>org.cas.osd.platform.ciam.shaded</shaded.package>
   </properties>
   <dependencies>
      <dependency>
         <groupId>org.cas.osd.platform.ciam.account.management</groupId>
         <artifactId>account-management-metrics</artifactId>
         <version>${project.parent.version}</version>
         <scope>compile</scope>
      </dependency>
   </dependencies>
   <build>
      <plugins>
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.1</version>
            <executions>
               <execution>
                  <phase>package</phase>
                  <goals>
                     <goal>shade</goal>
                  </goals>
                  <configuration>
                     <shadedArtifactAttached>true</shadedArtifactAttached>
                     <createDependencyReducedPom>true</createDependencyReducedPom>
                     <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
                     <createSourcesJar>true</createSourcesJar>
                     <relocations>
                        <!-- manually hide individual dependencies that a client might conflict with -->
                        <relocation>
                           <pattern>org.</pattern>
                           <shadedPattern>${shaded.package}.org.</shadedPattern>
                           <excludes>
                              <exclude>org.slf4j.**</exclude>
                              <exclude>org.xml.**</exclude>
                              <exclude>org.w3c.**</exclude>
                              <exclude>org.bitguiders.usagemetrics.**</exclude>
                              <exclude>org.bitguiders.**</exclude>
                              <exclude>org.bitguiders.**</exclude>
                              <exclude>org.apache.flume.**</exclude>
                              <exclude>org.apache.http.**</exclude>
                           </excludes>
                        </relocation>
                        <relocation>
                           <pattern>com.</pattern>
                           <shadedPattern>${shaded.package}.com.</shadedPattern>
                           <excludes>
                              <exclude>com.google.common.**</exclude>
                              <exclude>com.sun.xml.bind.xmlDeclaration</exclude>
                           </excludes>
                        </relocation>
                        <relocation>
                           <pattern>javassist</pattern>
                           <shadedPattern>${shaded.package}.javassist</shadedPattern>
                        </relocation>
                        <relocation>
                           <pattern>javax.ws.rs</pattern>
                           <shadedPattern>${shaded.package}.javax.ws.rs</shadedPattern>
                        </relocation>
                        <relocation>
                           <pattern>jersey.repackaged</pattern>
                           <shadedPattern>${shaded.package}.jersey.repackaged</shadedPattern>
                        </relocation>
                        <relocation>
                           <pattern>net.</pattern>
                           <shadedPattern>${shaded.package}.net.</shadedPattern>
                        </relocation>
                     </relocations>
                     <artifactSet>
                        <!-- these external dependencies should be exposed to clients -->
                        <excludes>
                           <exclude>org.slf4j:slf4j-api</exclude>
                           <exclude>org.bitguiders.cpp:cpp-product-usage-ingest-gateway-client</exclude>
                        </excludes>
                     </artifactSet>
                  </configuration>
               </execution>
            </executions>
         </plugin>
      </plugins>
   </build>
</project>
person Waqas Ahmed    schedule 19.07.2019