整個生產環境采用JDK1.8 + Tomcat 7.0.65
代碼重構后,啟動報錯,主要異常如下:
嚴重: Unable to process Jar entry [module-info.class] from Jar [jar:file:/home/unisound/private_cloud_platform/device_center/apache-tomcat-7.0.65/webapps/device-center/WEB-INF/lib/lombok-1.18.2.jar!/] for annotations org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 19
ERROR localhost-startStop-1 (FrameworkServlet.java:502) - Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean#0': Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: javax/el/ELManager
根據提示,明確是由於lombok 和 validatation校驗框架引起的;
查看當前引入的jar包版本:
<version.lombok>1.18.2</version.lombok> <version.validation-api>2.0.1.Final</version.validation-api> <version.hibernate-validator>6.0.9.Final</version.hibernate-validator> <!-- Bean Validator,驗證參數 --> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>${version.hibernate-validator}</version> </dependency> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>${version.validation-api}</version> </dependency> <!-- lombok 自動生成 Setter/Getter 方法 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${version.lombok}</version> </dependency>
原來是因為lombok 和 hibernate-validator引起的,當前版本Tomcaat7是不支持滴。
解決方案:
1、lombok 和 hibernate-validator版本降級
<version.lombok>1.14.8</version.lombok> <version.validation-api>2.0.0.Final</version.validation-api> <version.hibernate-validator>5.4.3.Final</version.hibernate-validator>
2、升級tomcat8
強烈建議使用第二種方案!tomcat7的bug也可以解決掉,當然代價就是所有功能的回歸測試。。。