分析版本 17 时“未找到依赖项”

Nam*_*man 6 java maven maven-dependency-plugin java-17

我正在研究的项目之一具有以下相关配置:

<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>

<plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>3.2.0</version>
    <configuration>
        <failOnWarning>true</failOnWarning>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>analyze-only</goal>
            </goals>
        </execution>
    </executions>
</plugin>


<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest</artifactId>
    <version>2.2</version>
    <!-- not scoped to test -->
</dependency>
Run Code Online (Sandbox Code Playgroud)

执行mvn clean verify(apache-maven-3.6.3,java:17-ea)时,构建按预期成功。我现在对属性进行了更改,将 源和目标替换为发布:

<maven.compiler.release>17</maven.compiler.release>
Run Code Online (Sandbox Code Playgroud)

终端上的日志显示

[INFO] --- maven-dependency-plugin:3.2.0:analyze-only (default) @ java-8-matchers ---
[WARNING] Non-test scoped test only dependencies found:
[WARNING]    org.hamcrest:hamcrest:jar:2.2:compile
Run Code Online (Sandbox Code Playgroud)

导致失败(因为警告)!为什么/如何在 Java 版本中升级时对依赖关系进行不同的处理?有任何解决这个问题的方法吗?


如果可能有帮助,此目标的调试日志如下:

[DEBUG] Configuring mojo org.apache.maven.plugins:maven-dependency-plugin:3.2.0:analyze-only from plugin realm ClassRealm[plugin>org.apache.maven.plugins:maven-dependency-plugin:3.2.0, parent: jdk.internal.loader.ClassLoaders$AppClassLoader@579bb367]
[DEBUG] Configuring mojo 'org.apache.maven.plugins:maven-dependency-plugin:3.2.0:analyze-only' with basic configurator -->
[DEBUG]   (f) analyzer = default
[DEBUG]   (f) baseDir = .../java-8-matchers
[DEBUG]   (f) failOnWarning = true
[DEBUG]   (f) ignoreNonCompile = false
[DEBUG]   (f) ignoreUnusedRuntime = false
[DEBUG]   (f) outputDirectory = .../java-8-matchers/target
[DEBUG]   (f) outputXML = false
[DEBUG]   (f) project = MavenProject: uk.co.probablyfine:java-8-matchers:2.0.0-SNAPSHOT @ .../java-8-matchers/pom.xml
[DEBUG]   (f) scriptableFlag = $$%%%
[DEBUG]   (f) scriptableOutput = false
[DEBUG]   (f) skip = false
[DEBUG]   (f) verbose = false
[DEBUG] -- end configuration --
[WARNING] Non-test scoped test only dependencies found:
[WARNING]    org.hamcrest:hamcrest:jar:2.2:compile

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-dependency-plugin:3.2.0:analyze-only (default) on project java-8-matchers: Dependency problems found -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-dependency-plugin:3.2.0:analyze-only (default) on project java-8-matchers: Dependency problems found
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:215)
Run Code Online (Sandbox Code Playgroud)

重现使用:

  1. Git checkout这个分支
  2. 配置 Maven 以使用 Java-17。
  3. 将属性编辑failOnWarningtrue.
  4. 执行mvn clean verify

sav*_*ver 9

经过调查,我发现问题出在maven-dependency-plugin从版本 3.1.2 升级到 3.2.0 时,因为在新版本的插件中添加了新的属性用于分析: testArtifactsWithNonTestScope您可以比较下面代码的屏幕截图: 版本 3.1.2:

在此输入图像描述

3.2.0版本: 在此输入图像描述

我在插件中调试了完整的分析器依赖项过程,发现了该依赖项:

<dependency>
   <groupId>org.hamcrest</groupId>
   <artifactId>hamcrest</artifactId>
   <version>2.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

被传递到testArtifactsWithNonTestScope工件集,因为类org.hamcrest.MatcherAssert仅在测试类中使用。当然,这种行为是不正确的,因为来自hamcrest依赖的其他类存在于非测试类中 - 肯定存在缺陷maven-dependency-plugin

聚苯乙烯

就像我的想法的证明一样,您可以通过以下方式更改非测试类之一:

...
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
...

public final class Java8Matchers {

    public static void customAssert(String reason, boolean assertion) {
        assertThat(reason, assertion);
    }
    
    ...
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我添加了使用org.hamcrest.MatcherAssertin的新方法Java8Matchers,之后构建过程将成功完成。


经过以上几个方面,您可以通过以下方式解决问题:

  • 使用插件3.1.2支持的最新版本的java,并且在错误修复之前不要更新插件
  • 关闭构建的分析器并等待分析器修复