过滤由 maven 的 copy:copy-dependencies 插件复制的测试依赖项

Filter test dependencies copied by maven's copy:copy-dependencies plugin

我的情况与 this issue 中的情况几乎相同,只是使用 -DincludeScope=runtime 的建议解决方案对我不起作用:

  1. 我构建 jar
  2. 我想将依赖项复制到 运行 应用程序的文件夹中。在此文件夹中,我不需要 classes/libraries.
  3. 相关的测试
  4. (但超出此处范围)我构建了一个存档文件 (.war) 用于部署目的。此存档不包含测试库。

我的 pom 看起来像:

<dependencies>
  <dependency>
    <groupId>my.company.group</groupId>
    <artifactId>common</artifactId>
    <version>4.0.0-SNAPSHOT</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>my.company.group</groupId>
    <artifactId>common</artifactId>
    <version>4.0.0-SNAPSHOT</version>
    <type>test-jar</type>
    <scope>test</scope>
  </dependency>
</dependencies>

您可能会注意到,我们使用的是一个为该项目(以及其他项目)提供通用 类 的通用项目。 最近在这个项目中放置通用测试 类 时出现了这个问题,因此需要创建第二个 jar 存档用于测试目的。在我看来,它应该很有魅力:两个 jar 文件都有不同的名称和范围。

通过 mvn clean compile 创建 .war 存档没问题:创建的 war 存档不包含测试库。

但是使用 mvn clean compile dependency:copy-dependencies -DoutputDirectory=./libPath -DincludeScope=runtime jar:jar 复制依赖项似乎没有考虑范围。正如在其他一些帖子中指出的那样,参数 -DexcludeScope=test 是无用的,因为它排除了每个范围。

我还尝试在依赖声明上使用 classifier 属性,在 运行 maven 上使用 -DexcludeClassifiers=test 没有显着效果。

我的 mave 调用或我的 pom 配置中是否缺少某些内容?

(仅供参考:maven 版本是 3.0.5,运行 on java 7)

最终,经过多方查找,解决方案在对maven生命周期的正确理解上。

长话短说:我修改了 maven 调用,而不是 pom 配置(使用 compile 之前的 test-compile 阶段):

mvn clean test-compile dependency:copy-dependencies -DoutputDirectory=./libPath -includeScope=runtime compile jar:jar

阅读 maven documentation,默认构建阶段流程如下:

  1. 清洁
  2. process-sources
  3. 编译
  4. process-test-sources
  5. test-compile
  6. 套餐

目标依赖项默认绑定到 process-sources 阶段,在我的第一次尝试中,我将它绑定到 compile 阶段。我认为我的问题来自于这样一个事实,即执行此目标时,测试 类 尚未编译,因此未编译 'flagged'。

运行 compile 之前的 test-compile 阶段(并将复制目标绑定到前者)允许识别测试 类 并因此识别值要有效使用的 -DincludeScope 参数。

也就是说,这几乎是纯粹的经验理解。如果有人有更多的理论解释或文档,我很乐意听到。