背景:weblogic 10.3.6升级到weblogic 14.1、Jdk1.6升级至Jdk1.8版本,直接部署war包,未重新编译war包;
启动weblogic受管应用服务时报错:
weblogic.management.DeploymentException: java.lang.ClassNotFoundException: org.mortbay.component.Container$Listener
at weblogic.application.internal.BaseDeployment.throwAppException(BaseDeployment.java:132)
at weblogic.application.internal.BaseDeployment.prepare(BaseDeployment.java:244)
at weblogic.application.internal.SingleModuleDeployment.prepare(SingleModuleDeployment.java:52)
at weblogic.application.internal.DeploymentStateChecker.prepare(DeploymentStateChecker.java:158)
at weblogic.deploy.internal.targetserver.AppContainerInvoker.prepare(AppContainerInvoker.java:65)
Truncated.
Caused By: java.lang.ClassNotFoundException: org.mortbay.component.Container$Listener
at weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:1035)
at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:996)
at weblogic.utils.classloaders.ChangeAwareClassLoader.findClass(ChangeAwareClassLoader.java:101)
at weblogic.utils.classloaders.GenericClassLoader.doFindClass(GenericClassLoader.java:617)
at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:547)
Truncated.
在linux服务器下 app/WEB-INF/lib下执行搜索命令:
(搜索指定路径下所有jar包中的每个class中是否依赖了某个类 import xx,如果某个jar包中的某个class中 引用了某个类,就将jar包名打印出来)
find . -name "*.jar" -exec sh -c '
if jar tf "$1" | grep ".class$" | while read -r classfile; do
unzip -p "$1" "$classfile" | strings | grep -q "org.mortbay.jetty.Connector"
if [ $? -eq 0 ]; then
echo "$1"
exit 0
fi
done; then
exit 0
else
exit 1
fi
' sh {} \;
找到cxf-*.jar 6个jar包,org.mortbay.component.Container类 在cxf-2.0.2.10.jar包的 JettyHTTPServerEngineFactory类中被引用。如项目中不需要可删除 cxf-*.jar 6个jar包或者通过maven仓库引用:
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty</artifactId>
<version>6.1.25</version>
</dependency>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-util</artifactId>
<version>6.1.25</version>
</dependency>