目录
- 使用mvn命令打包并指定jdk路径
- IDEA
- 不打开IDEA,直接使用命令进行打包
- MVN打包报错:在类路径或引导类路径中找不到程序包 Java.lang
- 现象
- 报错日志
- 原因分析
- 解决办法
- 最优解
- 总结
使用mvn命令打包并指定jdk路径
使用背景:我本机安装配置的是jdk17,从网上拉取下来的项目使用的是jdk1.8,直接运行或者打包的话会报错。
IDEA
idea中可以切换jdk,setting -> project structure -> project中 配置好新下载安装好的jdk1.8的安装路径即可。
不打开IDEA,直接使用命令进行打包
新建一个txt文件,编写以下内容
set JAVA_HOME=xxx 仅仅是设置临时环境变量,不修改实际的。
set JAVA_HOME=C:\Users\kekePang\.jdks\corretto-1.8.0_322 mvn clean package
保存文件,重命名为 package.BAT
最后将该执行文件拷贝到要打包的maven项目根目录下,双击运行bat文件即可实现在jdk1.8环境下的正常打包。
我们Ctrl+R打开命令窗口,输入java -version,当前java版本还是17.
MVN打包报错:在类路径或引导类路径中找不到程序包 java.lang
现象
同一个Springboot项目在Windows下mvn打包正常,在linux下打包就失败了。
打包命令如下 :
mvn clean package -Dmaven.test.skip=true
然后Linux中的其他项目打包也正常,就是这个项目不正常。
报错日志
key/.m2/repository/com/google/j2objc/j2objc-annotations/1.1/j2objc-annotations-1.1.jar,/home/itkey/.m2/repository/org/codehaus/mojo/animal-sniffer-annotations/1.14/animal-sniffer-annotations-1.14.jar,.]
致命错误: 在类路径或引导类路径中找不到程序包 java.lang[INFO] ---编程----------------------------------------------------------[ERROR] COMPILATION ERROR : [INFO] -------------------------------------------------------------[ERROR] An unknown compilation problem occurred[INFO] 1 error[INFO] -------------------------------------------------------------[INFO] ------------------------------------------------------------------------[INFO] Reactor Summary for wsdm 1.0.0:[INFO] [INFO] wsdm ............................................... SUCCESS [ 0.201 s][INFO] wsdm-common ........................................ FAILURE [ 2.113 s][INFO] wsdm-liantong ...................................... SKIPPED[INFO] wsdm-system ........................................ SKIPPED[INFO] wsdm-framework ..................................... SKIPPED[INFO] wsdm-generator ..................................... SKIPPED[INFO] wsdm-rongcloud ..................................... SKIPPED[INFO] wsdm-admin ......................................... SKIPPED[INFOjavascript] ------------------------------------------------------------------------[INFO] BUILD FAILURE[INFO] ------------------------------------------------------------------------[INFO] Total time: 2.647 s[INFO] Finished at: 2022-04-21T14:58:23+08:00[INFO] ------------------------------------------------------------------------[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on proiDDvijCIMject wsdm-common: Compilation failure[ERROR] An unknown compilation problem occurred[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/MojoFailureException[ERROR] [ERROR] After correcting the problems, you can resume the build wit编程h the command[ERROR] mvn <args> -rf :wsdm-common
原因分析
关键信息致命错误: 在类路径或引导类路径中找不到程序包开发者_JAVA教程 java.lang人这里就可以看出应该是编译的时候环境变量有问题。
我就开始怀疑是不是JDK配置的问题。
检查了一下JDK1.8配置正常,我还专门把多余的JDK11删除以防混淆。
结果还是没有作用。
因为其他项目编译打包是正常的,只是这个项目不正常。我在考虑会不会MVN的某个配置文件不兼容LINUX导致的?
于是我就对比了一下pom.XML文件的区别发现如下一段
<configuration> <source>${java.version}</source> <target>${java.version}</target> <encoding>${project.build.sourceEncoding}</encoding> <compilerArguments> <verbose/> <bootclasspath>${java.home}/lib/rt.jar;${java.home}/lib/jce.jar</bootclasspath> </compilerArguments> </configuration>
在编译正常的项目中没有这段配置<bootclasspath>${java.home}/lib/rt.jar;${java.home}/lib/jce.jar</bootclasspath>
最终证明真的是这么配置导致的问题的发生。
解决办法
配置问题:pom.xml中以下标签中的标签中间配置的jdk的分隔符是不是改错了,
- window下是英文符号;
- linux下是英文符号:
windows
<compilerArguments> <verbose /> <bootclasspath>${java.home}\jre\lib\rt.jar;${java.home}\jre\lib\jce.jar</bootclasspath> </compilerArguments>
linux
<compilerArguments> <verbose /> <bootclasspath>${java.home}\jre\libjsrt.jar:${java.home}\jre\lib\jce.jar</bootclasspath> </compilerArguments>
修改完成以后,linux下打包也就正常啦。
这样处理有一个非常明显的缺点,在不同的环境下打包,打包前要编辑一下这个文件太麻烦了。这样版本管理也难。那么有没有一劳永逸的办法,使一套配置同时支持两个平台呢?
最优解
<bootclasspath>${java.home}/lib/rt.jar${path.separator}${java.home}/lib/jce.jar</bootclasspath>
我把;替换成变量${path.separator}了。
${path.separator}在windows下就是英文符号;
${path.separator}在linux下就是英文符号:
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。
精彩评论