26

我需要基本上完成以下工作:

  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>
4

3 回答 3

37

为了防止插件收集提供的依赖项,您可以使用 @Raghuram 解决方案(为此 +1)。我还尝试跳过测试范围的依赖项,并发现它不能那么简单地完成的问题- 因为测试意味着插件语义中的“一切”。

所以排除提供测试范围的解决方案是 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

于 2011-05-02T11:52:34.173 回答
9

如此处所述,您可以尝试设置excludeScope参数以排除具有provided范围的依赖项。

<excludeScope>provided</excludeScope>

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

于 2011-05-02T04:59:42.550 回答
0

加上我的两分钱。

将其<excludeScope>provided</excludeScope>放入执行中不起作用。

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

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

命令:mvn dependency:copy-dependencies

罐子被复制到target/dependency.

于 2017-06-04T13:47:21.857 回答