筛选由Maven的复制依赖项复制的依赖项?

时间:2011-05-01 19:32:01

标签: maven maven-dependency-plugin

我需要基本上完成以下任务:

  1. 将我的库构建为JAR。 (很简单,已经完成了。)
  2. 将我的库的依赖项复制到本地文件夹,包括主项目JAR,不包括标记为provided的依赖项。
  3. 我似乎无法完成第二部分。有没有更好的方法来做到这一点,而不是我在下面这样做?我实际上是将这些JAR部署到服务器上的lib目录中。不幸的是,下面的代码包括所有JAR,甚至包括provided个JAR,但不包括项目输出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>
    

3 个答案:

答案 0 :(得分:34)

为防止插件收集提供的依赖关系,您可以使用@Raghuram解决方案(+1为此)。我还尝试跳过 test 范围内的依赖关系,发现issue无法做到这一点很简单 - 因为 test 意味着'一切'在插件语义中。

因此,排除提供测试范围的解决方案是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 执行

答案 1 :(得分:9)

根据记录here,您可以尝试设置excludeScope参数,以排除provided范围内的家属。

<excludeScope>provided</excludeScope>

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

答案 2 :(得分:0)

加我的两分钱。

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

要排除提供的jar,请将元素放在执行之外:

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

命令:mvn dependency:copy-dependencies

将罐子复制到target/dependency