记一次将spring-boot应用发布到weblogic的步骤以及遇到的问题

说明

环境
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应用程序。

应用发布到weblogic的步骤

第一步:在应用的src/main新建webapp,新建web.xml和weblogic.xml。

  1. web.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
        /
    


  1. weblogic代码如下:




    /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文

  1. packaing元素的修改为war
war
  1. 在pom中添加maven-war-plugin和spring-boot-maven-plugin插件,用于在执行mvn package默认执行者两个插件的目标。


	
		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。

javax.validation.*
validation-api-2.0.0.Final.jar也通过Maven传递性依赖引出的。如果你没有用ijcf框架,可以显示在pom中制定对此java的依赖。
记一次将spring-boot应用发布到weblogic的步骤以及遇到的问题_第1张图片
——————————————————————————————————
第三个问题:

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。

javax.el.*

——————————————————————————————————

第四个问题:
[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控制台部署时选择如图中的选项即可解决。
记一次将spring-boot应用发布到weblogic的步骤以及遇到的问题_第2张图片
——————————————————————————————————
第五个问题:

([Ljava/lang/Object;)V. java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder.([Ljava/lang/Object;)V
原因: org.springframework.boot.legacy.context.web.SpringBootContextLoaderListener在spring-boot-legacy-2.0.0.RELEASE.jar中,缺少此包。
解决方案: 在pom只添加对此包的依赖

org.springframework.boot spring-boot-legacy 2.0.0.RELEASE

——————————————————————————————————
第六个问题:

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即可。

你可能感兴趣的:(Java语言基础)