从svn拉的ssm项目,写完代码准备发测试;结果用maven打war包的时候报错了
这个时候在控制台找到报错信息如下图
说“在类路径或引导类路径中找不到程序包 java.lang”;
我寻思着,java.lang不是jdk中基础的包吗?不应该有问题啊,于是上网搜,网上说:
是因为有多个JDK版本或者JDK版本引入混乱导致的
解决方法是在报错模块下的pom.xml中,把
<bootclasspath>${java.home}/lib/rt.jar:${java.home}/lib/jce.jar</bootclasspath>
这一行注掉。
我照做了,但是打包还是报错,如下
于是,我又搜“程序包javax.crypto不存在”,这回找到的回答比较靠谱(原文)。
他说, maven项目如果用到JDK内部的一些类、接口(例如:javax.crypto.SecretKey)尤其是做加密的时候,用maven编译可能会出现“程序包javax.crypto不存在”的错误。
这时候需要在编译的时候引入jdk的rt.jar包(就是前面让注掉的那行)。
这个时候,重点来了:如果引用多个jar需要使用;(windows环境)或者:(macos与linux环境)来分割;这就是打包报错的原因,我是在windows环境,而代码中用:分隔,所有打包报错。
总结一下就是:
1、因为项目用到JDK内部的一些类、接口(例如:javax.crypto.SecretKey)尤其是做加密的时候,用这些jdk内部类导致maven编译可能会出现“程序包javax.crypto不存在”的错误。
2、于是为了解决这个问题,需要在pom文件中引入jdk的rt.jar,而且可能需要引入多个。
<bootclasspath>${java.home}/lib/rt.jar:${java.home}/lib/jce.jar</bootclasspath>
3、当引入多的时候,它们之间需要分隔符,但是不同环境下分隔符不一样,于是就可能导致有的环境可以正常编译,有点环境就会报错。
解决方式就是
1)根据自己的环境选择对应的分隔符;
2)或者一劳永逸,各位共同开发的同事都省事,就是使用变量path.separator代替
<bootclasspath>${java.home}/lib/rt.jar${path.separator}${java.home}/lib/jce.jar</bootclasspath>