ERROR[org.springframework.web.context.ContextLoader] Context initialization failed
java.lang.NoSuchMethodError:org.springframework.web.context.ConfigurableWebApplicationContext.setId(Ljava/lang/String;)V
一般出现这个错误,主要原因是Spring的版本冲突。在JBoss和web应用中存在了Spring不同版本的jar包。
解决方案:
在web应用中的WEB-INF目录下添加jboss-web.xml。
该文件内容如下:
<!DOCTYPE jboss-web PUBLIC
"-//JBoss//DTD Web Application 5.0//EN"
"jboss-web_5_0.dtd">
<jboss-web>
<class-loading java2ClassLoadingCompliance="false">
<loader-repository>
com.example:archive=UpopConsole
<loader-repository-config>
java2ParentDelegaton=false
</loader-repository-config>
</loader-repository>
</class-loading>
</jboss-web>
其中:
java2ClassLoadingCompliance设置成false
java2ParentDelegaton设置成false
com.example:archive=UpopConsole,其中:archive前的内容可以根据您的喜好自由配置,:archive后面的内容请使用war包的名字,此处我部署的是UpopConsole.war, 故配置类UpopConsole
- Java2ClassLoadingCompliance:该配置项主要是告诉Jboss在进行classload时是否采取parent first的加载策略;除了jbossweb*.sar/META-INFO/jboss-service.xml之外,还可以在应用*ar包下面的jboss-web.xml中设置<class-loading java2ClassLoadingCompliance="true">;若设置为true,则表示优先让父级classloader加载相关class,如果无法加载再利用当前classloader加载;若设置为false,即采取child first的加载策略,表示优先让当前classloader加载相关class,如果无法加载再委托给父级classloader加载;
- UseJBossWebLoader:该配置表明是否使用Jboss自身的classloader来加载webApp相关的资源;因为Jboss是通过集成Tomcat来实现Web Container的,而两者都有自己独立的classloader;
若设置为true,则表示Web应用加载时都将使用Jboss统一的classloader,即此时采用共享的扁平的UnifiedClassLoader;
若设置为false,则表示Web应用采用自己独立的WebAppClassLoader进行加载,此时Web应用和Jboss之间是完全隔离的,这也是该配置项的默认值;