首页 > 其他分享 >Maven项目在不同 JDK 版本下的兼容性问题及解决方案

Maven项目在不同 JDK 版本下的兼容性问题及解决方案

时间:2024-12-17 18:42:09浏览次数:4  
标签:INFO maven JDK surefire Maven 兼容性问题 apache 2.12

Maven 项目在不同 JDK 版本下的兼容性问题及解决方案


引言

在日常开发中,Maven 是 Java 项目构建和管理的核心工具。然而,随着 JDK 版本的不断更新,开发者可能会遇到一些兼容性问题。例如,某些 Maven 插件在特定 JDK 版本下无法正常工作,或者依赖下载失败。本文将通过一个实际案例,分析 Maven 项目在不同 JDK 版本下的兼容性问题,并提供解决方案。


问题描述

最近,我在开发一个 Maven 项目时遇到了一个奇怪的问题:同样的项目,在 OpenJDK 9 下运行 mvn test 时失败,而在 OracleJDK 8 下却能成功运行。以下是问题的详细日志:

OpenJDK 9 的失败日志

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test (default-test) on project maven-app: Unable to generate classpath: org.apache.maven.artifact.resolver.ArtifactResolutionException: Unable to get dependency information for org.apache.maven.surefire:surefire-junit4:jar:2.12.4: Failed to retrieve POM for org.apache.maven.surefire:surefire-junit4:jar:2.12.4: Could not transfer artifact org.apache.maven.surefire:surefire-junit4:pom:2.12.4 from/to alimaven (http://maven.aliyun.com/nexus/content/groups/public/): java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty

OracleJDK 8 的成功日志

[INFO] BUILD SUCCESS

从日志中可以看出,问题出在 OpenJDK 9 下无法下载依赖,而 OracleJDK 8 下则一切正常。


问题分析

1. OpenJDK 9 的 SSL/TLS 问题

OpenJDK 9 引入了模块化系统(Jigsaw),并对 SSL/TLS 的默认配置进行了一些更改。具体来说,OpenJDK 9 的信任库(cacerts)可能为空或损坏,导致无法验证远程 Maven 仓库的 SSL 证书。

错误日志中的关键信息:

java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty

这表明 OpenJDK 9 的 SSL/TLS 配置与 Maven 插件不兼容。

2. OracleJDK 8 的兼容性

OracleJDK 8 的 SSL/TLS 实现更稳定,且与 Maven 插件(如 maven-surefire-plugin)兼容性更好。因此,切换到 OracleJDK 8 后,问题得到解决。

3. Maven 插件版本

你使用的 maven-surefire-plugin 版本是 2.12.4,这个版本在 OpenJDK 9 下可能存在兼容性问题。虽然最终是 JDK 8 解决了问题,但插件版本也是一个值得关注的因素。


解决方案

1. 切换到 OracleJDK 8 或更高版本的 JDK

如果你不需要使用 OpenJDK 9 的特定功能,建议继续使用 OracleJDK 8 或更高版本的 JDK(如 OpenJDK 11 或 OpenJDK 17)。确保 Maven 和项目的 JDK 版本一致,避免兼容性问题。

2. 修复 OpenJDK 9 的信任库

如果你仍然需要使用 OpenJDK 9,可以尝试修复其信任库(cacerts)。

  • 使用以下命令检查信任库是否为空:
    keytool -list -keystore $JAVA_HOME/lib/security/cacerts
    
  • 如果为空,可以从 OracleJDK 8 或其他可靠来源复制 cacerts 文件。

3. 升级 Maven 插件

保持 Maven 插件(如 maven-surefire-plugin)的最新版本,以确保与 JDK 的兼容性。例如,将 maven-surefire-plugin 升级到 3.0.0-M5

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>3.0.0-M5</version>
        </plugin>
    </plugins>
</build>

4. 使用 HTTPS 仓库

如果问题出在 SSL 证书验证上,可以尝试修复 JDK 的信任库,而不是将仓库地址改为 HTTP。


总结

本文通过一个实际案例,分析了 Maven 项目在不同 JDK 版本下的兼容性问题。问题的根本原因是 OpenJDK 9 的 SSL/TLS 配置与 Maven 插件不兼容。通过切换到 OracleJDK 8、修复信任库或升级 Maven 插件,可以有效解决此类问题。

在开发过程中,保持 JDK 版本和 Maven 插件的兼容性非常重要。如果遇到类似问题,可以参考本文的解决方案进行排查和修复。


参考资料


希望这篇博客能帮助到遇到类似问题的开发者!如果你有任何疑问或建议,欢迎在评论区留言。

D:\JavaDevelopmentKit\OpenJDK\jdk-9\bin\java.exe -Dmaven.multiModuleProjectDirectory=D:\DevProjects\IDEA2018\maven-app -Dmaven.home=D:\Apache\Maven\apache-maven-3.6.0 -Dclassworlds.conf=D:\Apache\Maven\apache-maven-3.6.0\bin\m2.conf "-javaagent:D:\JetBrains\IntelliJ IDEA\IntelliJ IDEA 2018.1.8\lib\idea_rt.jar=50147:D:\JetBrains\IntelliJ IDEA\IntelliJ IDEA 2018.1.8\bin" -Dfile.encoding=UTF-8 -classpath D:\Apache\Maven\apache-maven-3.6.0\boot\plexus-classworlds-2.5.2.jar org.codehaus.classworlds.Launcher -Didea.version=2018.1.8 -s D:\Apache\Maven\apache-maven-3.6.0\conf\settings.xml -Dmaven.repo.local=D:\Apache\Maven\apache-maven-3.6.0\maven_repository test -f pom.xml
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------< com.ithero:maven-app >------------------------
[INFO] Building maven-app 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maven-app ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 1 resource
[INFO] 
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ maven-app ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ maven-app ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\DevProjects\IDEA2018\maven-app\src\test\resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ maven-app ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ maven-app ---
[INFO] Surefire report directory: D:\DevProjects\IDEA2018\maven-app\target\surefire-reports
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/surefire/surefire-junit4/2.12.4/surefire-junit4-2.12.4.pom
[INFO] Failure detected.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.106 s
[INFO] Finished at: 2024-12-17T18:26:29+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test (default-test) on project maven-app: Unable to generate classpath: org.apache.maven.artifact.resolver.ArtifactResolutionException: Unable to get dependency information for org.apache.maven.surefire:surefire-junit4:jar:2.12.4: Failed to retrieve POM for org.apache.maven.surefire:surefire-junit4:jar:2.12.4: Could not transfer artifact org.apache.maven.surefire:surefire-junit4:pom:2.12.4 from/to alimaven (http://maven.aliyun.com/nexus/content/groups/public/): java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
[ERROR]   org.apache.maven.surefire:surefire-junit4:jar:2.12.4
[ERROR] 
[ERROR] from the specified remote repositories:
[ERROR]   alimaven (http://maven.aliyun.com/nexus/content/groups/public/, releases=true, snapshots=false)
[ERROR] Path to dependency: 
[ERROR] 	1) dummy:dummy:jar:1.0
[ERROR] 
[ERROR] 
[ERROR] -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

Process finished with exit code 1




D:\JavaDevelopmentKit\OracleJDK\Java8\jdk-1.8\bin\java.exe -Dmaven.multiModuleProjectDirectory=D:\DevProjects\IDEA2018\maven-app -Dmaven.home=D:\Apache\Maven\apache-maven-3.6.0 -Dclassworlds.conf=D:\Apache\Maven\apache-maven-3.6.0\bin\m2.conf "-javaagent:D:\JetBrains\IntelliJ IDEA\IntelliJ IDEA 2018.1.8\lib\idea_rt.jar=50160:D:\JetBrains\IntelliJ IDEA\IntelliJ IDEA 2018.1.8\bin" -Dfile.encoding=UTF-8 -classpath D:\Apache\Maven\apache-maven-3.6.0\boot\plexus-classworlds-2.5.2.jar org.codehaus.classworlds.Launcher -Didea.version=2018.1.8 -s D:\Apache\Maven\apache-maven-3.6.0\conf\settings.xml -Dmaven.repo.local=D:\Apache\Maven\apache-maven-3.6.0\maven_repository test -f pom.xml
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------< com.ithero:maven-app >------------------------
[INFO] Building maven-app 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maven-app ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 1 resource
[INFO] 
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ maven-app ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ maven-app ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\DevProjects\IDEA2018\maven-app\src\test\resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ maven-app ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ maven-app ---
[INFO] Surefire report directory: D:\DevProjects\IDEA2018\maven-app\target\surefire-reports
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/surefire/surefire-junit4/2.12.4/surefire-junit4-2.12.4.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/surefire/surefire-junit4/2.12.4/surefire-junit4-2.12.4.pom (2.4 kB at 2.2 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/surefire/surefire-providers/2.12.4/surefire-providers-2.12.4.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/surefire/surefire-providers/2.12.4/surefire-providers-2.12.4.pom (2.3 kB at 8.4 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/surefire/surefire-junit4/2.12.4/surefire-junit4-2.12.4.jar
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/surefire/surefire-junit4/2.12.4/surefire-junit4-2.12.4.jar (37 kB at 98 kB/s)

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.ithero.test.MavenAppTest
Hello Maven~~~
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.11 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  4.044 s
[INFO] Finished at: 2024-12-17T18:27:57+08:00
[INFO] ------------------------------------------------------------------------

Process finished with exit code 0

标签:INFO,maven,JDK,surefire,Maven,兼容性问题,apache,2.12
From: https://www.cnblogs.com/itcq1024/p/18613225

相关文章

  • 不同操作系统中安装Maven的详细步骤
    一、在Windows系统中安装Maven下载Maven访问Maven官方网站(https://maven.apache.org/)。在官网的“Download”部分,找到适合Windows的二进制压缩包(通常是apache-maven-[version]-bin.zip格式),例如,截至2023年7月是apache-maven-3.9.3-bin.zip,点击下载链接将其下载到......
  • Windows和Linux系统中安装JDK(Java Development Kit)
    一、在Windows系统中安装JDK下载JDK访问Oracle官方网站(https://www.oracle.com/java/technologies/javase-downloads.html)。根据你的操作系统(32位或64位)和需求,选择合适的JDK版本进行下载。例如,对于大多数普通开发,选择JavaSE(StandardEdition)的JDK安装包。运行安装程序......
  • JDK的常用java命令有哪些?
    java命令功能:用于运行已编译的Java程序(.class文件)。它通过加载Java虚拟机(JVM),然后执行字节码。示例:假设你有一个名为HelloWorld.class的文件,在命令行中进入该文件所在目录,然后输入javaHelloWorld(这里HelloWorld是主类名),就可以运行这个Java程序。如果程序有命令行参数,还可以在......
  • Maven简单使用说明(在IDEA中创建一个基于POI的处理Excel文件的Maven项目)
    目录Maven简介(AI生成的内容)一、环境变量设置二、设置Maven的本地jar仓库位置三、设置maven配置文件settings.xml3.1配置本地仓库3.2配置镜像仓库URL3.3配置JDK版本四、在IDEA中配置maven并创建maven项目4.1设置IDEA的全局配置4.2在IDEA中创建maven项目4.3创建一个使用POI处......
  • Windows 10 下编译 64 位 OpenJDK 8 并单步调试
    Windows10下编译64位OpenJDK8软件版本操作系统:Windows10Cygwin:3.5.4-1VisualStudio:2010英文版freetype:2.7BootJDK:7编译的OpenJDK版本:8安装bootJDK从下载链接下载JDK,然后在Windows上安装。安装完成后配置JAVE_HOME环境变量,如下......
  • maven
    Maven的作用1.依赖管理:方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题2.统一项目结构:提供标准,统一的项目结构3.项目构建:标准跨平台(Linux、Windows、MacOS)的自动化项目构建方式Maven项目的目录结构:maven-project01|---src(源代码目录和测试代码目录)|---main......
  • 【数据结构与算法】Java描述:JDK17新增常用特性
    前言:从springboot3.0开始,已经不支持JDK8了。参考资料,来自官方博客:https://spring.io/blog/2022/01/20/spring-boot-3-0-0-m1-is-nowavailable?spm=a2c6h.12873639.article-detail.24.766d46b40LM1IV从3.0开始,转变为JDK17。JDK17是LTS(长期支持版),可以免费商用到2029......
  • 从零开始搭建基于 Maven 和 MyBatis 的 Java 项目
    从零开始搭建基于Maven和MyBatis的Java项目1.修改IDEA中Maven的配置(安转目录本地仓库)2.创建Maven工程3.修改pom.xml文件中的配置信息主要是Maven编译器插件(maven-compiler-plugin)4.导入相关依赖坐标5.创建pojoJavaBean书写实体类6.根据实体类编写SQL语句建......
  • maven - archetype - quickstart 和maven - archetype - archetype 和maven - archety
    maven-archetype-quickstart和maven-archetype-archetype区别功能重点不同maven-archetype-quickstart:主要功能是快速搭建一个简单的、可运行的Java应用程序框架。它的重点在于让开发者能够迅速开始编写Java代码,构建一个基本的、能够独立运行的程序,例如一个......
  • maven docker-maven-plugin 发布docker 20241214
    1、docker开启远程访问 端口 2375  docker主机:192.168.177.128vi/usr/lib/systemd/system/docker.service#修改ExecStart这行ExecStart=/usr/bin/dockerd-Htcp://0.0.0.0:2375 #重新加载配置文件[root@localhost~]#systemctldaemon-reload#重启服务[......