mvn package javax.crypto does not exist
问题现象
有一次同事提交了代码Jenkins平台自动打包失败,而同事在本地是Eclipse开发环境使用mvn tomcat7:run 是可以成功运行项目的。
区别是Jenkins平台使用mvn clean package打包。错误说明是挺明显的package javax.crypto does not exist,但是在开发环境中没有任何问题,build path中包含了jre目录自然能够引用到jce.jar中的类。
[INFO] 49 errors
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] services-consumer .......................... SUCCESS [ 0.874 s]
[INFO] services-consumer-rest ..................... FAILURE [ 2.240 s]
[INFO] job-consumer ............................... SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 34.749 s
[INFO] Finished at: 2017-09-22T15:39:10+08:00
[INFO] Final Memory: 127M/430M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project services-consumer-rest: Compilation failure: Compilation failure:
[ERROR] /Users/ervices-consumer-rest/src/main/java/com/test/portal/utils/RSAUtils.java:[18,19] error: package javax.crypto does not exist
[ERROR] /Users/services/services-consumer-rest/src/main/java/com/test/portal/utils/DesUtil.java:[11,19] error: package javax.crypto does not exist
报错的RSAUtils.java文件内容,包引用部分
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
问题分析
-
怀疑Jenkins平台问题 为了验证这个怀疑,我同步了最新的代码在本地使用
mvn clean package得到同样的错误信息,证明这个怀疑不成立。 -
Maven编译环境JDK问题 既然IDE开发环境中编译时没有问题的,而使用
mvn compilepackageinstall都报错很容易联想到mvn的运行时环境中没有引用到jce.jar。
那么问题就变成了Maven是如何指定编译环境的?
请参见官方文档 http://maven.apache.org/plugins/maven-compiler-plugin/index.html
解决方法
maven 是通过插件来管理编译的,所以在pom.xml的maven-compiler-plugin可以设定编译器的lib包路径,
添加上${java.home}/lib/jce.jar
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven_compiler_plugin_version}</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<compilerArguments>
<bootclasspath>${java.home}/lib/rt.jar:${java.home}/lib/jce.jar</bootclasspath>
</compilerArguments>
</configuration>
</plugin>
</plugins>
</build>
