对maven罐子的依赖太多了

时间:2017-07-28 11:55:59

标签: java maven

我将一个Spark项目打包到一个只有一个jar文件中但是当我用maven编译时它包含了很多jar(100mb,太多大小!!)但不是org / log4j / *依赖项(它在执行时会产生错误)时间),但它将其他人添加为jar中的jboss / netty / *。

我认为所有依赖项都是相互包含的,我必须假设那些100 mb?但是它不包含依赖项org / log4j / *

¿有没有办法只将我指定的10个罐子包含在我的maven xml文件中? :

 <dependencies>
      <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.12</version>
          <scope>test</scope>
      </dependency>
      <dependency>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
          <version>1.2.17</version>
    </dependency>
      <dependency>
          <groupId>org.apache.commons</groupId>
          <artifactId>commons-io</artifactId>
          <version>1.3.2</version>
      </dependency>
      <dependency>
          <groupId>org.apache.commons</groupId>
          <artifactId>commons-lang3</artifactId>
          <version>3.5</version>
    </dependency>
    <dependency>
      <groupId>commons-codec</groupId>
      <artifactId>commons-codec</artifactId>
      <version>1.9</version>
    </dependency>
      <dependency>
          <groupId>com.google.code.gson</groupId>
          <artifactId>gson</artifactId>
          <version>2.6.2</version>
      </dependency>
      <dependency>
          <groupId>org.json</groupId>
          <artifactId>json</artifactId>
          <version>20170516</version>
      </dependency>
      <dependency>
          <groupId>org.apache.hadoop</groupId>
          <artifactId>hadoop-common</artifactId>
          <version>2.8.1</version>
      </dependency>
      <dependency>
          <groupId>org.apache.spark</groupId>
          <artifactId>spark-sql_2.10</artifactId>
          <version>${spark.version}</version>
      </dependency>
      <dependency>
          <groupId>org.apache.spark</groupId>
          <artifactId>spark-core_2.10</artifactId>
          <version>${spark.version}</version>
      </dependency>
      <dependency>
          <groupId>com.databricks</groupId>
          <artifactId>spark-csv_2.10</artifactId>
          <version>${spark.version}</version>
      </dependency>
  </dependencies>

创建'jar-with-dependencies'我使用这个插件:

   <plugin>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>process-sources</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${targetdirectory}</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

由于

3 个答案:

答案 0 :(得分:0)

有一个依赖关系树,即你所有的依赖关系都在引入它们自己的依赖关系等等。

显示您的树使用

mvn dependency:tree

请参阅https://maven.apache.org/plugins/maven-dependency-plugin/tree-mojo.html

答案 1 :(得分:0)

首先,我们为依赖项提取的许多库将调用他们自己依赖的其他库。有时,这可能会让所有相互冲突的事情变得非常有效。

使用依赖关系树来查看哪些冲突以及哪个库带来了什么。

mvn dependency:tree -Dverbose

详细信息为您提供了更多信息。如果您正在寻找冲突,请使用:

mvn dependency:tree -Dverbose | grep 'omitted for conflict'

找到要排除的内容后,请检查Dependency Exclusions:

[进入依赖关系标签]

<exclusions>
    <exclusion>  <!-- declare the exclusion here -->
      <groupId>sample.ProjectB</groupId>
      <artifactId>Project-B</artifactId>
    </exclusion>
  </exclusions> 

答案 2 :(得分:0)

如果您真的只想包含在pom中明确列出的依赖项,则可以对所有依赖项使用* -exclusions的概念。

中对此进行了解释

https://stackoverflow.com/a/7556707/927493

请注意,您的程序可能无法再编译。更有可能是&#34; ClassNotFound&#34;运行时的异常,因为您的某个依赖项尝试从其中一个依赖项调用方法,但您排除了所有传递依赖项。