maven-dependency-plugin 不能排除测试范围的依赖

问题描述

我正在使用 maven-dependency-plugin:copy-dependencies 将所有依赖项复制到 target/dependency 目录中。我的 pom.xml 是:

          <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>
              </execution>
            </executions>
          </plugin>

插件版本是最新的:3.1.2(在父 pom 中定义)。

这个定义工作正常,但有一个例外:它将所有测试依赖项复制到 target 目录中,我只需要运行目标 jar 所需的运行时依赖项。

我尝试使用 the documentation 中描述的 <excludeScope> 配置排除它:

<configuration>
    <excludeScope>test</excludeScope>
</configuration>

但它使构建失败并显示消息:

[INFO] --- maven-dependency-plugin:2.10:copy-dependencies (copy-dependencies) @ app ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  7.006 s
[INFO] Finished at: 2021-02-15T10:32:26+03:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-dependency-plugin:2.10:copy-dependencies (copy-dependencies) on project app:  Can't exclude Test scope,this will exclude everything. -> [Help 1]

我真的不明白为什么排除测试范围会排除所有内容,因为如果不排除 test 范围,目标目录也包含所有运行时依赖项(以及测试 deps)。

排除测试依赖可能有什么问题?如何正确操作?

PS:请不要建议我在这里使用程序集或其他 fat-jar 插件,因为我有意复制依赖 jar 以进行 Docker 镜像构建优化:一层用于依赖​​,另一层用于 jar,其中依赖层始终缓存,直到任何依赖项更改:

copY target/dependency  /usr/lib/app/lib
copY target/${JAR_FILE} /usr/lib/app/target.jar

解决方法

解决方案可能在 includeScope 描述中:

要包含的范围。空字符串表示所有范围(默认)。被解释的范围是 Maven 看到的范围,而不是 pom.xml 中指定的范围。总结:

  • runtime 作用域提供运行时和编译依赖项,
  • compile 范围提供编译、提供和系统依赖项,
  • test(默认)范围给出所有依赖项,
  • provided 范围仅提供提供的依赖项,
  • system 范围仅提供系统依赖项。

这意味着我会尝试使用 <includeScope>runtime</includeScope>

,

要排除在测试范围内的依赖项是使用 includeScope 运行时而不是 excludeScope 作为测试的插件文档意味着“一切”

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...