过滤由 maven 的 copy:copy-dependencies 插件复制的测试依赖项
Filter test dependencies copied by maven's copy:copy-dependencies plugin
我的情况与 this issue 中的情况几乎相同,只是使用 -DincludeScope=runtime
的建议解决方案对我不起作用:
- 我构建 jar
- 我想将依赖项复制到 运行 应用程序的文件夹中。在此文件夹中,我不需要 classes/libraries.
相关的测试
- (但超出此处范围)我构建了一个存档文件 (.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,默认构建阶段流程如下:
- 清洁
- process-sources
- 编译
- process-test-sources
- test-compile
- 套餐
目标依赖项默认绑定到 process-sources
阶段,在我的第一次尝试中,我将它绑定到 compile
阶段。我认为我的问题来自于这样一个事实,即执行此目标时,测试 类 尚未编译,因此未编译 'flagged'。
运行 compile
之前的 test-compile
阶段(并将复制目标绑定到前者)允许识别测试 类 并因此识别值要有效使用的 -DincludeScope
参数。
也就是说,这几乎是纯粹的经验理解。如果有人有更多的理论解释或文档,我很乐意听到。
我的情况与 this issue 中的情况几乎相同,只是使用 -DincludeScope=runtime
的建议解决方案对我不起作用:
- 我构建 jar
- 我想将依赖项复制到 运行 应用程序的文件夹中。在此文件夹中,我不需要 classes/libraries. 相关的测试
- (但超出此处范围)我构建了一个存档文件 (.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,默认构建阶段流程如下:
- 清洁
- process-sources
- 编译
- process-test-sources
- test-compile
- 套餐
目标依赖项默认绑定到 process-sources
阶段,在我的第一次尝试中,我将它绑定到 compile
阶段。我认为我的问题来自于这样一个事实,即执行此目标时,测试 类 尚未编译,因此未编译 'flagged'。
运行 compile
之前的 test-compile
阶段(并将复制目标绑定到前者)允许识别测试 类 并因此识别值要有效使用的 -DincludeScope
参数。
也就是说,这几乎是纯粹的经验理解。如果有人有更多的理论解释或文档,我很乐意听到。