2011-05-01 85 views
24

我需要基本完成以下任务:由Maven的复制依赖项复制的过滤器依赖关系?

  1. 将我的库构建到JAR中。 (简单,已完成)
  2. 将我的库的依赖项复制到本地文件夹,包括主项目JAR,不包括标记为provided的依赖项。

我似乎无法完成第二部分。有没有更好的方法来做到这一点,而不是我如何在下面做?我基本上将这些JAR部署到服务器上的lib目录。不幸的是,下面的代码包含所有JAR,即使是provided,但不包括项目输出JAR。我应该使用不同的插件吗?

<?xml version="1.0"?> 
<project> 
    ... 

    <dependencies> 
     <dependency> 
      <groupId>com.provided</groupId> 
      <artifactId>provided-lib</artifactId> 
      <version>1.2.3</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-api</artifactId> 
      <version>1.6.1</version> 
     </dependency> 

     ... 

    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-dependency-plugin</artifactId> 
       <executions> 
        <execution> 
         <id>copy-dependencies</id> 
         <phase>package</phase> 
         <goals> 
          <goal>copy-dependencies</goal> 
         </goals> 
         <configuration> 
          <outputDirectory>/hello</outputDirectory> 
          <excludeTransitive>true</excludeTransitive> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
</project> 
+0

另请参阅:http://stackoverflow.com/questions/8310539/how-to-copy-dependencies-jarswithout-test-jars-to-a-directory-using-maven – 2013-12-02 05:54:04

回答

32

为防止pluging收集提供的依赖关系,您可以使用@Raghuram解决方案(+1)。我也试着跳过测试作用域依赖关系,并发现issue它不能做到那么简单 - 因为测试意味着'所有内容'在插件语义中。

所以溶液排除提供测试范围是includeScope 运行时

<includeScope>runtime</includeScope> 

收集的依赖后,你可以用maven-antrun-plugin项目的jar复制到目标目录,如:

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <version>2.2</version> 
      <executions> 
       <execution> 
        <id>copy-dependencies</id> 
        <phase>package</phase> 
        <goals> 
         <goal>copy-dependencies</goal> 
        </goals> 
        <configuration> 
         <outputDirectory>${java.io.tmpdir}/test</outputDirectory> 
         <includeScope>runtime</includeScope>       
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-antrun-plugin</artifactId> 
      <version>1.6</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <configuration> 
         <tasks> 
         <copy 
          file="${build.directory}/${project.artifactId}-${project.version}.jar" 
          todir="${java.io.tmpdir}/test" /> 
         </tasks> 
        </configuration> 
        <goals> 
         <goal>run</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

我不知道任何其他解决方案 - 旁边创建一个新的POM-DIST .xml(也许是<packaging>pom</packaging>),它只是将依赖关系保存到您的库中,并收集所有传递依赖项的独占测试/提供范围。如果你不想提供一个全新的项目,你可以执行这与mvn -f pom-dist.xml package

9

如记录here,你可以尝试设置excludeScope参数排除家属与provided范围。

<excludeScope>provided</excludeScope> 

至于不包括当前项目jar的插件,我猜这是通过设计。
你可以创建一个单独的maven项目来完成这项工作。

0

加我两毛钱。

<excludeScope>provided</excludeScope>置于执行不起作用。

要排除提供罐子把元素的执行之外:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <configuration> 
     <excludeScope>provided</excludeScope> 
    </configuration> 
</plugin> 

命令:mvn dependency:copy-dependencies

罐子被复制到target/dependency