我有一个Web应用程序,我从一台服务器复制到另一台服务器。我已将WAR文件复制到webapps文件夹中,并且未正确解压缩。
但是,当应用程序启动时,会记录此错误:
IINFO: Deploying web application archive /var/lib/tomcat7/webapps/admin.war
Apr 03, 2019 10:36:50 PM org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(/var/lib/tomcat7/webapps/admin/WEB-INF/lib/tomcat-embed-core-8.5.11.jar) - jar not loaded. See Servlet Spec 3.0, section 10.7.2. Offending class: javax/$
Apr 03, 2019 10:36:50 PM org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(/var/lib/tomcat7/webapps/admin/WEB-INF/lib/tomcat-embed-el-8.5.11.jar) - jar not loaded. See Servlet Spec 3.0, section 10.7.2. Offending class: javax/el$
这是什么意思?它可能是由于其他服务器的jvm版本?
这是源服务器中的Java版本:
java version "1.8.0_92"
Java(TM) SE Runtime Environment (build 1.8.0_92-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.92-b14, mixed mode)
这是在目标服务器中:
java version "1.7.0_181"
OpenJDK Runtime Environment (IcedTea 2.6.14) (7u181-2.6.14-0ubuntu0.3)
OpenJDK 64-Bit Server VM (build 24.181-b01, mixed mode)
Jaime问候
我不确定它是否重复this。无论如何,类似的问题包含BalusC的有用答案,我想分享(link)。
BalusC的回答是:
这是类路径污染的标志。 JSP / Servlet API库依赖于appserver实现,属于Tomcat / lib文件夹中Tomcat 6的情况,不应该在其他地方移动或复制。正如您现在遇到的那样,它是可移植性问题和类加载冲突的秘诀。 webapp中的库在类加载中具有优先权。如果在那里遇到servlet-api.jar,它会在那里寻找它的依赖关系,但它们显然在那里缺失。
您必须从webapp的Webapp / WEB-INF / lib中删除任何特定于appserver的库。您应该只在其中放置特定于webapp的库。将appserver特定的库保留在appserver自己的默认类路径中,这是您的案例中的Tomcat / lib。保持不变。您最多可以在其中添加要在其中的所有Web应用程序中共享的库,或者更好的是,在Tomcat / conf / catalina.properties中配置shared.loader。
还要从JDK / lib和JRE / lib文件夹中删除任何特定于appserver和webapp的库(如果有)。我经常看到一些初学者移动/复制那里的库,因为“否则它不会编译”。您永远不应该在那里复制非JRK / JRE特定的库。这也是便携性问题的秘诀。使用javac编译类时,应使用-cp参数指定依赖库。
更新:如果是IDE(您在谈论“构建路径”时似乎使用了一个IDE),则需要将Web项目与应用程序服务器相关联。例如,在Eclipse中,您可以选择在创建动态Web项目期间执行此操作。您需要在项目创建之前在Eclipse中集成服务器实例。您可以通过Servers视图执行此操作(假设您正在使用Eclipse for Java EE开发人员,否则升级)。您也可以通过项目属性中的Servers条目更改它。选择一个您想要用作“默认”服务器的服务器,然后它的库将自动包含在项目的构建路径中。绝对没有必要在其他地方复制/移动它们。另请参见如何在Eclipse项目中导入javax.servlet API?