在 Maven 中使用 Shade 重定位重构导入语句

Refactoring import statements using Shade relocations in Maven

我一直在使用 Shade 将依赖项从 com.package.x 重新定位到 com.package.y;当我使用 Maven 构建时,它会因不兼容的类型而抱怨 - 所以我必须更改代码中的导入语句以匹配 com.package.y.

这真的是解决这个问题的唯一方法吗?更改导入会使 IntelliJ 抱怨并基本上破坏 IDE 集成。 Shade 没有办法修改导入吗?

shade 插件的主要用例是生成一个 uber-jar,同时重新定位其中的一些包以防止冲突。通常,您不想针对 uberjar 进行开发。

如果您真的想针对着色的 jar 进行开发(或者您只是使用着色来重新定位现有的 jar),那么您需要将着色的 jar 列为原始 jar 的替代品,我想这可能需要你清理一个循环依赖。

这个问题可以通过在中将shadedArtifactAttached设置为true来解决]配置标签。

<shadedArtifactAttached>true</shadedArtifactAttached>

完整示例和参考:https://maven.apache.org/plugins/maven-shade-plugin/examples/attached-artifact.html

我遇到了同样的问题,我通过添加上面的 属性 解决了它。我正在分享我的 pom.xml 阴影模块,以防万一您想查看任何其他标签值。

pom.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>