获得maven依赖关系的最佳方式

时间:2010-08-06 15:12:16

标签: maven-2

我只需要使用这个类org.apache.commons.io.FileUtils,但我正在下载所有公共类我实际上不需要的类,有没有办法说maven下载只是FileUtils类?不是整个公共场所,如下面的依赖

<dependency>
   <groupId>commons-io</groupId>
   <artifactId>commons-io</artifactId>
   <version>1.4</version>
</dependency>

4 个答案:

答案 0 :(得分:4)

  

有没有办法说maven下载只是FileUtils类?

没有。但是根据您的确切用例,您可以使用Maven Shade Plugin创建一个超级jar并过滤包含的依赖项的内容:

  

Selecting Contents for Uber JAR

     

...

     

用于细粒度控制   来自所选依赖项的类   包含,神器过滤器可以   使用:

<project>
  ... 
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>1.3.3</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <filters>
                <filter>
                  <artifact>junit:junit</artifact>
                  <includes>
                    <include>junit/framework/**</include>
                    <include>org/junit/**</include>
                  </includes>
                  <excludes>
                    <exclude>org/junit/experimental/**</exclude>
                    <exclude>org/junit/runners/**</exclude>
                  </excludes>
                </filter>
                <filter>
                  <artifact>*:*</artifact>
                  <excludes>
                    <exclude>META-INF/*.SF</exclude>
                    <exclude>META-INF/*.DSA</exclude>
                    <exclude>META-INF/*.RSA</exclude>
                  </excludes>
                </filter>
              </filters>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>
     

这里,使用类似Ant的模式   从依赖项中指定   junit:junit只是肯定的   应包括类/资源   在超级JAR。第二个过滤器   演示了使用通配符   这是人工制品的身份   在插件版本1.3中介绍。它   排除所有签名相关文件   来自每件工件,无论其如何   组或工件ID。

但请注意,FileUtils依赖于其他类:

import org.apache.commons.io.filefilter.DirectoryFileFilter;
import org.apache.commons.io.filefilter.FalseFileFilter;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.commons.io.filefilter.SuffixFileFilter; // depends on org.apache.commons.io.IOCase
import org.apache.commons.io.filefilter.TrueFileFilter;
import org.apache.commons.io.output.NullOutputStream;

你显然也需要包含它。

答案 1 :(得分:1)

Apache commons io与其他apache commons项目没有依赖关系。你只得到公共,没有其他公共图书馆。这是一个有大约100个课程的罐子,不是很多。

您的项目只能获得一个课程 - 这可能也违反了许可证!

看看FileUtils源也会显示很多其他公共io类的导入。没有罐子的其余部分它就行不通了!

答案 2 :(得分:1)

使用依赖项<exclusion>元素

    <dependency>
      <groupId>sample.ProjectA</groupId>
      <artifactId>Project-A</artifactId>
      <version>1.0</version>
      <scope>compile</scope>
      <exclusions>
        <exclusion>  <!-- declare the exclusion here -->
          <groupId>sample.ProjectB</groupId>
          <artifactId>Project-B</artifactId>
        </exclusion>
      </exclusions> 
    </dependency>

排除那些您不需要的传递依赖项。

使用mvn dependency:analyze-onlymvn dependecy:tree来理解您的依赖关系图的实际结构以及您实际使用的依赖关系以及未声明和/或声明和不使用依赖关系图也是一种很好的做法。

问候。

答案 3 :(得分:0)

我不这么认为。工件打包为jar文件;你无法单独获取它们(也就是说,逐个文件)。至少,不是我的知识。

另外,再考虑一下 - FileUtils类完全有可能依赖于其他类。但是如果不检查来源,你无法真正说出它们是什么。这是包的用户不需要知道的信息。您不希望弄清楚FileUtils使用的每个其他类(或FileUtils的依赖关系使用的其他类等等)。这就是整个工件作为一个独立的自包含实体分发的原因。整个工件,如果是mavenized,将知道需要什么依赖,maven也将为你抓住那些。