环境
linux:Red Hat 4.8.3-9
weblogic:weblogic 12.1.3
JDK:JDK1.8
程序环境
构建构建:Apache Maven 3.6.1
框架:ijcf 3.2.0(啊,使我们公司的一个内部框架,你可以理解为Spring、Spring-boot、Spring-web、Spring-MVC等对Spring开源框架的二次封装)
应用程序本身是一个后台java应用程序,用户要求必须运行在weblogic中。故将应用改造成web应用程序。
第一步:在应用的src/main新建webapp,新建web.xml和weblogic.xml。
contextConfigLocation
com.sitech.crmmci.lsms2.app.SpringBootWebLogicApplication
org.springframework.web.context.ContextLoaderListener
metricFilter
org.springframework.web.filter.DelegatingFilterProxy
metricFilter
/*
appServlet
org.springframework.web.servlet.DispatcherServlet
contextAttribute
org.springframework.web.context.WebApplicationContext.ROOT
1
appServlet
/
/spring-boot-weblogic-app
true
false
true
org.slf4j
javax.validation.*
org.hibernate.*
javax.el.*
org.springframework.*
org.springframework.web.*
org.springframework.boot.*
org.springframework.boot.legacy*
com.google.*
第二步:配置pom文
war
org.apache.maven.plugins
maven-war-plugin
true
${project.version}
true
lib/
${project.basedir}/src/main/webapp
${project.artifactId}
org.springframework.boot
spring-boot-maven-plugin
BOOT
repackage
第三步: 添加启动类
package com.sitech.crmmci.lsms2.app;
import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.WebApplicationInitializer;
/**
* @author zhangxy
* @credte 2019-06-26 9:00
*/
@SpringBootApplication
@EnableAutoConfiguration
@Configuration
@ComponentScan
public class SpringBootWebLogicApplication extends SpringBootServletInitializer implements WebApplicationInitializer {
public static void main(String[] args) {
SpringApplication.run(SpringBootWebLogicApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(SpringBootWebLogicApplication.class).bannerMode(Banner.Mode.OFF);//.showBanner(false);
}
}
第四步:执行mvn clean package
命令打成war上传服务器,使用weblogic控制台部署此war。
本来通过在启动类上添加@SpringBootApplication,运行在使用Maven的tomcat插件中是一点问题都没有,但是将程序改造成web应用,达成war部署到weblogic中出现了各种问题。
不要问我这些问题的底层原理?我TM也很惆怅,事情搞完了后不知其然,也不知其所然,好TM自闭。
第一个错误:
**原因:**没有导入tomcat-embed-websocket-9.0.14.jar
解决方案:
在pom中添加依赖
org.springframework.boot
spring-boot-starter-tomcat
Maven会根据传递性依赖间接导入tomcat-embed-websocket jar。依赖关系如图:
——————————————————————————————————
第二个问题:
java.lang.NoSuchMethodError: javax.validation.Configuration.getDefaultParameterNameProvider()Ljavax/validation/ParameterNameProvider;
原因: javax/validation/ParameterNameProvider是validation-api-2.0.0.Final.jar中的类。weblogic应该也自带validation-api包,所有冲突了。
解决方案: 在weblogic.xml添加如下配置表示优先使用应用中的jar。
validation-api-2.0.0.Final.jar也通过Maven传递性依赖引出的。如果你没有用ijcf框架,可以显示在pom中制定对此java的依赖。
——————————————————————————————————
第三个问题:
java.lang.IllegalAccessError: tried to access class javax.el.ELUtil from class javax.el.ELManager tried to access class javax.el.ELUtil from class javax.el.ELManager
原因: javax.el.ELManager在javax.el-api-3.0.0.jar中,应用依赖的javax.el-api-3.0.0.ja与web中自带的javax.el-api冲突。
解决方案: 在weblogic.xml添加如下配置表示优先使用应用中的jar。
——————————————————————————————————
第四个问题:
[J2EE:160144]Failed to register library Extension-Name: lsms2-app, Implementation-Version: 0.0.1: Library cannot have Implementation-Version set, without also specifying its Specification-Version
**原因:**部署的时候选择错误。
**解决方案:**在weblogic控制台部署时选择如图中的选项即可解决。
——————————————————————————————————
第五个问题:
原因: org.springframework.boot.legacy.context.web.SpringBootContextLoaderListener在spring-boot-legacy-2.0.0.RELEASE.jar中,缺少此包。
解决方案: 在pom只添加对此包的依赖
——————————————————————————————————
第六个问题:
java.lang.IllegalStateException: No WebApplicationContext found: initializer not registered? No WebApplicationContext found: initializer not registered?
原因::web.xml中的listener.listener-class没有配置或配置不正确。
解决方案: 在web.xml中添加正确的监听。我的项目一开始使用了SpringBootContextLoaderListener监听类,后来改成ContextLoaderListener就不报这个错误了。
org.springframework.web.context.ContextLoaderListener
——————————————————————————————————
总结一下无非是两类错误:一类是缺少jar,另一类是jar冲突。前者看缺少的那个类在那个jar中(可能在高版本的jar中,不在低版本的jar中),导入对应的jar即可。后者在weblogic.xml中添加相关的配置,来表明优先使用应用中jar即可。