1

在我的 POM.xml 中,我使用了 maven-shade 插件并重新定位了 httpClient 依赖项。但是当我使用 mvn dependency:tree 打印依赖树时,我仍然在树中看到 httpClient 库,如下所示。为什么会这样。任何帮助将不胜感激。

[INFO]    +- org.apache.httpcomponents:httpclient:jar:4.3.5:provided

我的 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>

  <groupId>com.example</groupId>
  <version>1.0-SNAPSHOT</version>
 <artifactId>parser</artifactId>
  <packaging>jar</packaging>

 <!-- change these to the appropriate values -->
  <name>Parser Apps</name>
  <description>Applications to showcase different parsers</description>

  <properties>
<!-- change this if you desire to use a different version of Apex Core -->
<apex.version>3.4.0</apex.version>
    <apex.apppackage.classpath>lib/*.jar</apex.apppackage.classpath>
   <malhar.version>3.4.0</malhar.version>
 </properties>

  <build>
<plugins>
   <plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-eclipse-plugin</artifactId>
     <version>2.9</version>
     <configuration>
       <downloadSources>true</downloadSources>
     </configuration>
   </plugin>
   <plugin>
     <artifactId>maven-compiler-plugin</artifactId>
     <version>3.3</version>
     <configuration>
       <encoding>UTF-8</encoding>
       <source>1.7</source>
       <target>1.7</target>
       <debug>true</debug>
       <optimize>false</optimize>
       <showDeprecation>true</showDeprecation>
       <showWarnings>true</showWarnings>
     </configuration>
   </plugin>
   <plugin>
     <artifactId>maven-dependency-plugin</artifactId>
     <version>2.8</version>
     <executions>
       <execution>
         <id>copy-dependencies</id>
         <phase>prepare-package</phase>
         <goals>
           <goal>copy-dependencies</goal>
         </goals>
         <configuration>
           <outputDirectory>target/deps</outputDirectory>
           <includeScope>runtime</includeScope>
         </configuration>
       </execution>
     </executions>
   </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.4.3</version>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>shade</goal>
        </goals>
        <configuration>
          <artifactSet>
            <includes>
              <include>org.apache.httpcomponents.*</include>
            </includes>
          </artifactSet>
          <relocations>
            <relocation>
              <pattern>org.apache.httpcomponents</pattern>
              <shadedPattern>org.shaded.httpcomponents</shadedPattern>
            </relocation>
          </relocations>
        </configuration>
      </execution>
    </executions>
  </plugin>
   <plugin>
     <artifactId>maven-assembly-plugin</artifactId>
     <executions>
       <execution>
         <id>app-package-assembly</id>
         <phase>package</phase>
         <goals>
           <goal>single</goal>
         </goals>
         <configuration>
           <finalName>${project.artifactId}-${project.version}-apexapp</finalName>
           <appendAssemblyId>false</appendAssemblyId>
           <descriptors>
             <descriptor>src/assemble/appPackage.xml</descriptor>
           </descriptors>
           <archiverConfig>
             <defaultDirectoryMode>0755</defaultDirectoryMode>
           </archiverConfig>
           <archive>
             <manifestEntries>
               <Class-Path>${apex.apppackage.classpath}</Class-Path>
               <DT-Engine-Version>${apex.version}</DT-Engine-Version>
               <DT-App-Package-Group-Id>${project.groupId}</DT-App-Package-Group-Id>
               <DT-App-Package-Name>${project.artifactId}</DT-App-Package-Name>
               <DT-App-Package-Version>${project.version}</DT-App-Package-Version>
               <DT-App-Package-Display-Name>${project.name}</DT-App-Package-Display-Name>
               <DT-App-Package-Description>${project.description}</DT-App-Package-Description>
             </manifestEntries>
           </archive>
         </configuration>
       </execution>
     </executions>
   </plugin>

   <plugin>
     <artifactId>maven-antrun-plugin</artifactId>
     <version>1.7</version>
     <executions>
       <execution>
         <phase>package</phase>
         <configuration>
           <target>
             <move file="${project.build.directory}/${project.artifactId}-${project.version}-apexapp.jar"
                   tofile="${project.build.directory}/${project.artifactId}-${project.version}.apa" />
           </target>
         </configuration>
         <goals>
           <goal>run</goal>
         </goals>
       </execution>
       <execution>
         <!-- create resource directory for xml javadoc-->
         <id>createJavadocDirectory</id>
         <phase>generate-resources</phase>
         <configuration>
           <tasks>
             <delete dir="${project.build.directory}/generated-resources/xml-javadoc"/>
             <mkdir dir="${project.build.directory}/generated-resources/xml-javadoc"/>
           </tasks>
         </configuration>
         <goals>
           <goal>run</goal>
         </goals>
       </execution>
     </executions>
   </plugin>

   <plugin>
     <groupId>org.codehaus.mojo</groupId>
     <artifactId>build-helper-maven-plugin</artifactId>
     <version>1.9.1</version>
     <executions>
       <execution>
         <id>attach-artifacts</id>
         <phase>package</phase>
         <goals>
           <goal>attach-artifact</goal>
         </goals>
         <configuration>
           <artifacts>
             <artifact>
               <file>target/${project.artifactId}-${project.version}.apa</file>
               <type>apa</type>
             </artifact>
           </artifacts>
           <skipAttach>false</skipAttach>
         </configuration>
       </execution>
     </executions>
   </plugin>

  <!-- generate javdoc -->
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <executions>
      <!-- generate xml javadoc -->
      <execution>
        <id>xml-doclet</id>
        <phase>generate-resources</phase>
        <goals>
          <goal>javadoc</goal>
        </goals>
        <configuration>
          <doclet>com.github.markusbernhardt.xmldoclet.XmlDoclet</doclet>
          <additionalparam>-d ${project.build.directory}/generated-resources/xml-javadoc -filename ${project.artifactId}-${project.version}-javadoc.xml</additionalparam>
          <useStandardDocletOptions>false</useStandardDocletOptions>
          <docletArtifact>
            <groupId>com.github.markusbernhardt</groupId>
            <artifactId>xml-doclet</artifactId>
            <version>1.0.4</version>
          </docletArtifact>
        </configuration>
      </execution>
    </executions>
  </plugin>
  <!-- Transform xml javadoc to stripped down version containing only class/interface comments and tags-->
  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>xml-maven-plugin</artifactId>
    <version>1.0</version>
    <executions>
      <execution>
        <id>transform-xmljavadoc</id>
        <phase>generate-resources</phase>
        <goals>
          <goal>transform</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <transformationSets>
        <transformationSet>
          <dir>${project.build.directory}/generated-resources/xml-javadoc</dir>
          <includes>
            <include>${pmalhar.versioroject.artifactId}-${project.version}-javadoc.xml</include>
          </includes>
          <stylesheet>XmlJavadocCommentsExtractor.xsl</stylesheet>
          <outputDir>${project.build.directory}/generated-resources/xml-javadoc</outputDir>
        </transformationSet>
      </transformationSets>
    </configuration>
  </plugin>
  <!-- copy xml javadoc to class jar -->
  <plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.6</version>
    <executions>
      <execution>
        <id>copy-resources</id>
        <phase>process-resources</phase>
        <goals>
          <goal>copy-resources</goal>
        </goals>
        <configuration>
          <outputDirectory>${basedir}/target/classes</outputDirectory>
          <resources>
            <resource>
              <directory>${project.build.directory}/generated-resources/xml-javadoc</directory>
              <includes>
                <include>${project.artifactId}-${project.version}-javadoc.xml</include>
              </includes>
              <filtering>true</filtering>
            </resource>
          </resources>
        </configuration>
      </execution>
    </executions>
  </plugin>

</plugins>

 </build>

  <dependencies>
<!-- add your dependencies here -->
<dependency>
  <groupId>org.apache.apex</groupId>
  <artifactId>malhar-library</artifactId>
  <version>${malhar.version}</version>
  <!--
       If you know that your application does not need transitive dependencies pulled in by malhar-library,
       uncomment the following to reduce the size of your app package.
  -->
  <!--
  <exclusions>
    <exclusion>
      <groupId>*</groupId>
      <artifactId>*</artifactId>
    </exclusion>
  </exclusions>
  -->
</dependency>
<dependency>
  <groupId>org.apache.apex</groupId>
  <artifactId>malhar-contrib</artifactId>
  <version>${malhar.version}</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.5.4</version>
</dependency>
<dependency>
  <groupId>com.github.fge</groupId>
  <artifactId>json-schema-validator</artifactId>
  <version>2.0.1</version>
  <optional>true</optional>
</dependency>
<dependency>
  <groupId>net.sf.supercsv</groupId>
  <artifactId>super-csv</artifactId>
  <version>2.4.0</version>
  <optional>true</optional>
</dependency>
<dependency>
  <groupId>org.apache.apex</groupId>
  <artifactId>apex-common</artifactId>
  <version>${apex.version}</version>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.10</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.apache.apex</groupId>
  <artifactId>apex-engine</artifactId>
  <version>${apex.version}</version>
  <scope>provided</scope>
</dependency>

4

2 回答 2

1

依赖项并未从原始 POM 中删除,因此 的行为dependency:tree是正确的。

Shade 插件还将生成一个新的 POM ( dependency-reduced-pom.xml),其中从该<dependencies>部分中删除了阴影依赖项。这看起来像你所追求的。

于 2017-06-17T15:06:25.663 回答
1

两件事情 -

  1. 您应该知道重定位的作用不是“...重新定位 httpClient 依赖项”,而是正如消息来源所暗示的那样 -

    如果 uber JAR 被重用为某个其他项目的依赖项,则直接在 uber JAR 中包含来自工件的依赖项的类可能会由于类路径上的重复类而导致类加载冲突。为了解决这个问题,可以重新定位包含在阴影工件中的类,以便创建其字节码的私有副本

  2. 当您执行时,mvn dependency:tree它将显示项目中包含的所有依赖项(直接和传递)。相反,maven shade 插件

shade:shade 绑定到包阶段,用于创建阴影 jar。

进一步重命名或优化依赖项。这是Maven Shade 插件的详细信息-

这个插件提供了将工件打包到 uber-jar 中的能力,包括它的依赖项和遮蔽 - 即重命名 - 一些依赖项的包。

于 2017-01-06T04:18:16.923 回答