前序文章在本地验证成功后,在一台Windows服务器上重新部署了一遍,开放给同事使用。
以下为相关问题记录。实际总结下来,是因为项目使用的是JDK8及相关组件,与这次使用的SonarQube版本配套的JDK21不兼容导致。
所以建议选用与自己项目JDK版本一致的SonarQube。不用踩后面的坑。
Q1:JDK版本不一致(太旧)问题
问题如下(期间有很多信息,SonarQube最后会有一个总结,一般看最后即可)。
解决方法:
同事本地开发环境是JDK1.8,而我部署的SonarQube是JDK21.
所以换了一台有JDK21环境的机器重新扫描,解决了上述报错问题。
Q2:Lombok版本过低导致
出现如下两个图的错误时,都是因为Lombok低版本不支持JDK21导致。
解决方法:
在POM文件中,
<!--lombak-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</atifactId>
<version>1.16.10</version>
</dependency>
当前版本是1.16.10,调整为较新版本的1.18.32
重新执行扫描即可。
该处调整仅为扫描,原始代码可不用修改
Q3:Java语言特性变化导致
解决方法:
其本质原因,是因为
在Java中,
java.lang.reflect.InaccessibleObjectException
异常通常发生在尝试通过反射机制访问一个无法访问的对象或字段时。从Java 9开始,Java平台增强了模块系统的安全性,引入了对反射访问的控制,特别是对封装私有字段的访问进行了更严格的限制。如果你的代码运行在Java 9或更高版本上,并试图访问一个模块外的私有字段,可能会遇到这个异常。
用于本项目使用的JDK8,而本次用的SonaQube使用的是JDK21,所以出现了此问题。
在不修改代码的前提下,使用参数可以绕过这个限制
java --add-opens java.base/java.lang=ALL-UNNAMED -jar your-application.jar
而此时是使用mvn进行编译,需配置mvn参数
window(大坑,不能用双引号):
set MAVEN_OPTS=-Djava.awt.headless=true --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED --add-opens jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED --add-opens jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED --add-opens jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED --add-opens jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED --add-opens jdk.compiler/com.sun.tools.javac.jvm=ALL-UNNAMED --add-opens jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED --add-opens java.base/java.text=ALL-UNNAMED --add-opens java.desktop/java.awt.font=ALL-UNNAMED
linux:(大坑,必须要用单引号):
export MAVEN_OPTS='-Djava.awt.headless=true --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED --add-opens jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED --add-opens jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED --add-opens jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED --add-opens jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED --add-opens jdk.compiler/com.sun.tools.javac.jvm=ALL-UNNAMED --add-opens jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED --add-opens java.base/java.text=ALL-UNNAMED --add-opens java.desktop/java.awt.font=ALL-UNNAMED'
参考自:https://blog.csdn.net/laiyangwen1120/article/details/141615880
Windows环境下,在cmd输入第一段set命令,再执行mvn段,即可正常编译扫描。
评论区