java.lang.NoClassDefFoundError:org/apache/struts2/views/jsp/ui/AbstractUITag

java.lang.NoClassDefFoundError: org/apache/struts2/views/jsp/ui/AbstractUITag

简述:

java web 项目
老项目部署到新的环境,灾备演练。
服务器是weblogic

部署过程中果不其然的碰到很多问题,但都解决了,但是上述的异常着实搞了半天,没有头绪,网上相关资料也很少。

解决问题过程:

项目部署发现此异常,打开日志,一场信息如下:

weblogic.application.ModuleException: Failed to load webapp: jwsd because of DeploymentException: java.lang.NoClassDefFoundError: org/apache/struts2/views/jsp/ui/AbstractUITag
	at weblogic.servlet.internal.WebAppModule.prepare(WebAppModule.java:397)
	at weblogic.application.internal.flow.ScopedModuleDriver.prepare(ScopedModuleDriver.java:180)
	at weblogic.application.internal.flow.ModuleListenerInvoker.prepare(ModuleListenerInvoker.java:199)
	at weblogic.application.internal.flow.DeploymentCallbackFlow$1.next(DeploymentCallbackFlow.java:518)
	at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:52)
	at weblogic.application.internal.flow.DeploymentCallbackFlow.prepare(DeploymentCallbackFlow.java:159)
	at weblogic.application.internal.flow.DeploymentCallbackFlow.prepare(DeploymentCallbackFlow.java:47)
	at weblogic.application.internal.BaseDeployment$1.next(BaseDeployment.java:649)
	at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:52)
	at weblogic.application.internal.BaseDeployment.prepare(BaseDeployment.java:191)
	at weblogic.application.internal.SingleModuleDeployment.prepare(SingleModuleDeployment.java:44)
	at weblogic.application.internal.DeploymentStateChecker.prepare(DeploymentStateChecker.java:154)
	at weblogic.deploy.internal.targetserver.AppContainerInvoker.prepare(AppContainerInvoker.java:61)
	at weblogic.deploy.internal.targetserver.operations.ActivateOperation.createAndPrepareContainer(ActivateOperation.java:209)
	at weblogic.deploy.internal.targetserver.operations.ActivateOperation.doPrepare(ActivateOperation.java:98)
	at weblogic.deploy.internal.targetserver.operations.AbstractOperation.prepare(AbstractOperation.java:221)
	at weblogic.deploy.internal.targetserver.DeploymentManager.handleDeploymentPrepare(DeploymentManager.java:749)
	at weblogic.deploy.internal.targetserver.DeploymentManager.prepareDeploymentList(DeploymentManager.java:1216)
	at weblogic.deploy.internal.targetserver.DeploymentManager.handlePrepare(DeploymentManager.java:250)
	at weblogic.deploy.internal.targetserver.DeploymentServiceDispatcher.prepare(DeploymentServiceDispatcher.java:160)
	at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer.doPrepareCallback(DeploymentReceiverCallbackDeliverer.java:171)
	at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer.access$000(DeploymentReceiverCallbackDeliverer.java:13)
	at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer$1.run(DeploymentReceiverCallbackDeliverer.java:47)
	at weblogic.work.SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:550)
	at weblogic.work.ExecuteThread.execute(ExecuteThread.java:263)
	at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)
Caused By: java.lang.NoClassDefFoundError: org/apache/struts2/views/jsp/ui/AbstractUITag
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
	at weblogic.utils.classloaders.GenericClassLoader.defineClass(GenericClassLoader.java:343)
	at weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:302)
	at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:270)
	at weblogic.utils.classloaders.ChangeAwareClassLoader.findClass(ChangeAwareClassLoader.java:64)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
	at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:179)
	at weblogic.utils.classloaders.ChangeAwareClassLoader.loadClass(ChangeAwareClassLoader.java:43)
	at weblogic.servlet.internal.WebComponentContributor.containsAssignableClass(WebComponentContributor.java:193)
	at weblogic.servlet.internal.WebComponentContributor.contribute(WebComponentContributor.java:160)
	at com.oracle.pitchfork.server.Bootstrap.deploy(Bootstrap.java:154)
	at com.oracle.pitchfork.spi.WLSBootstrap.deploy(WLSBootstrap.java:111)
	at com.oracle.pitchfork.server.Bootstrap.deploy(Bootstrap.java:114)
	at com.oracle.pitchfork.spi.bean.internal.AbstractBeanManager.initialize(AbstractBeanManager.java:52)
	at com.oracle.pitchfork.spi.WebComponentContributorBrokerImpl.initialize(WebComponentContributorBrokerImpl.java:69)
	at weblogic.servlet.internal.WebComponentContributor.initialize(WebComponentContributor.java:98)
	at weblogic.servlet.internal.WebAppServletContext.processAnnotations(WebAppServletContext.java:1391)
	at weblogic.servlet.internal.WebAppServletContext.<init>(WebAppServletContext.java:452)
	at weblogic.servlet.internal.WebAppServletContext.<init>(WebAppServletContext.java:496)
	at weblogic.servlet.internal.HttpServer.loadWebApp(HttpServer.java:419)
	at weblogic.servlet.internal.WebAppModule.registerWebApp(WebAppModule.java:987)
	at weblogic.servlet.internal.WebAppModule.prepare(WebAppModule.java:387)
	at weblogic.application.internal.flow.ScopedModuleDriver.prepare(ScopedModuleDriver.java:176)
	at weblogic.application.internal.flow.ModuleListenerInvoker.prepare(ModuleListenerInvoker.java:199)
	at weblogic.application.internal.flow.DeploymentCallbackFlow$1.next(DeploymentCallbackFlow.java:517)
	at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:52)
	at weblogic.application.internal.flow.DeploymentCallbackFlow.prepare(DeploymentCallbackFlow.java:159)
	at weblogic.application.internal.flow.DeploymentCallbackFlow.prepare(DeploymentCallbackFlow.java:45)
	at weblogic.application.internal.BaseDeployment$1.next(BaseDeployment.java:648)
	at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:52)
	at weblogic.application.internal.BaseDeployment.prepare(BaseDeployment.java:191)
	at weblogic.application.internal.SingleModuleDeployment.prepare(SingleModuleDeployment.java:44)
	at weblogic.application.internal.DeploymentStateChecker.prepare(DeploymentStateChecker.java:154)
	at weblogic.deploy.internal.targetserver.AppContainerInvoker.prepare(AppContainerInvoker.java:61)
	at weblogic.deploy.internal.targetserver.operations.ActivateOperation.createAndPrepareContainer(ActivateOperation.java:208)
	at weblogic.deploy.internal.targetserver.operations.ActivateOperation.doPrepare(ActivateOperation.java:98)
	at weblogic.deploy.internal.targetserver.operations.AbstractOperation.prepare(AbstractOperation.java:221)
	at weblogic.deploy.internal.targetserver.DeploymentManager.handleDeploymentPrepare(DeploymentManager.java:747)
	at weblogic.deploy.internal.targetserver.DeploymentManager.prepareDeploymentList(DeploymentManager.java:1216)
	at weblogic.deploy.internal.targetserver.DeploymentManager.handlePrepare(DeploymentManager.java:250)
	at weblogic.deploy.internal.targetserver.DeploymentServiceDispatcher.prepare(DeploymentServiceDispatcher.java:159)
	at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer.doPrepareCallback(DeploymentReceiverCallbackDeliverer.java:171)
	at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer.access$000(DeploymentReceiverCallbackDeliverer.java:13)
	at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer$1.run(DeploymentReceiverCallbackDeliverer.java:46)
	at weblogic.work.SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:550)
	at weblogic.work.ExecuteThread.execute(ExecuteThread.java:263)
	at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)

日志位置: 举个例子 D:\Oracle\Middleware\user_projects\domains\xwcb_domain\servers\AdminServer\logs
一般在weblogic域下边的logs文件夹。

首先想到的是jar包问题, 然后去应用的lib下去找,发现并没有这个jar包,但是在生产环境启动是没有问题的,这就奇怪了。。。
然后查资料半天也没查个所以然。。
突然灵光一闪会不会在weblogic本身自带的jar (后来查了查,叫做“域库”)

然后去生产环境看了看,果然有所发现!
在这里插入图片描述
生产环境的weblogic 域下边lib里边是有这些jar的,又去新环境看了看是没有的!

然后,新环境加上这些jar,程序正常。

疑问

由于我也是接了几手的项目,当时开发人员早已离职
为什么不把这些jar放到应用本身的lib下边呢, 我尝试了,又爆出了其他的异常(果然放weblogic里边是有原因的,至于为什么等我搞清楚了,继续追加)至少程序是跑起来了。

续 解答疑问:

ui/AbstractUITag 是开发人员对jsp标签的增强,而且根据上述的异常显示 也是在weblogic在对项目进行部署(编译校验依赖)的时候(DeploymentException)曝出的异常(对此AbstractUITag 无法识别,这个程序员自己对jsp加强的内容,当然无法识别了,所以曝出该异常),所以要在weblogic的域库里边加上这些jar,然后weblogic才可以对改语法进行识别。
那么问题来了, 我部署项目时放的直接是.class 文件,这种的weblogic会对其依赖进行校验。而编译不同过是因为 jsp页面
这里涉及项目中jsp页面的流程,附上jsp执行流程:
在这里插入图片描述
所以 部署项目的时候,weblogic会将jsp按上述进行编译校验。
在这里插入图片描述

  1. .class 不需要在编译,只是对其依赖关系等进行校验,所需jar包当然也在其应用本身查找了。
  2. jsp是视图的一种,需要web容器(tomcat,weblogic 等),等进行编译、解析等等,所以解析特定(自定义)的jsp,需要的额外jar包(解析自定义jsp标签等的jar包)要放在web容器里边。

部署在tomcat上没有问题,是因为tomcat没有weblogic对jsp校验严格 见附录。

总结:

碰到问题,耐心很重要,细心发现,总会露出破绽。

附录:

以下转自: https://www.xuebuyuan.com/528062.html

WebLogic对JSP校验问题:

第一次为测试组部署测试环境时,遇到了很多的问题,几乎都是页面打不开,结果发现是WebLogic对JSP校验非常严格,遇到不规范的书写方式或者标签中引入了并不存在的类,就会报错误,而这些问题是在Tomcat下从未出现的。所出现的错误如下:

  1. 首页面中引入的xx标签,而xx.tld中的tag中有一个是并不存在的类
  2. 在xxx页面引入的struts标签中,<%@ taglib uri=http://jakarta.apache.org/struts/tags-template prefix=“template”%>,该标签在struts.jar包中并不存在,所以引入该标签会报错。
  3. 在xxxx页面中jsp的import语句书写不规范,<%@ page import=“com.xxx.config.xxx;import 这样的写法在WebLogic下就会报错。com.xx.xxx”%>
  4. 在xx多个页面,需要include其它页面,在父页面及子页面都有设置字符集的语句<%@ page contentType=“text/html; charset=GBK”%>,所幸的是子页面中没有汉字,所以可以安全的将该语句删除。
  5. weblogic下的request对象与tomcat下的request不一样,在tomcat下用函数request.getLocalAddr()函数没有问题,在weblogic下根本没有该方法。
  6. xx页面,用到了tg标签中的一个tag,其中有一个属性在类中没有定义,且没有get和set方法,导致该页无法显示。
    所以以后在编码的时候一定要注意~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值