Tomcat嵌入式jar文件无法加载

时间:2019-04-05 23:15:35

标签: java jvm tomcat7

我有一个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)

问候 海梅

1 个答案:

答案 0 :(得分:0)

我不太确定它是否是重复this。无论如何,类似的问题包含一个有用的答案BalusC,我想分享(link)。

BalusC的答案:

  

这是类路径污染的标志。 JSP / Servlet API库是与appserver实现有关的,并且在Tomcat / lib文件夹中的Tomcat 6情况下属于JSP / Servlet库,因此绝对不应将其移动或复制到其他位置。正如您现在遇到的那样,它是可移植性问题和类加载冲突的良方。 webapp中的库在类加载中优先。如果在此遇到servlet-api.jar,则它将在那儿寻找其依赖项,但显然在那儿缺少它们。

     

您必须从Webapp的Webapp / WEB-INF / lib中删除所有特定于应用服务器的库。您只应在其中放置特定于Webapp的库。将特定于应用程序服务器的库保留在应用程序服务器自己的默认类路径中,本例中为Tomcat / lib。保持原状。您最多可以添加要在其中所有Web应用程序之间共享的库,甚至更好的是,为此在Tomcat / conf / catalina.properties中配置shared.loader。

     

还从JDK / lib和JRE / lib文件夹(如果有)中删除任何特定于应用程序服务器和特定于Webapp的库。我经常看到一些入门者将库移动/复制到那里,因为“否则它不会编译”。您永远不要在其中复制非JRK / JRE特定的库。这也是可移植性问题的解决方案。使用javac编译类时,应使用-cp参数指定依赖库。

     

更新:如果使用的是IDE(在谈论“构建路径”时似乎使用了一个),则需要将Web项目与应用程序服务器关联。例如,在Eclipse中,您可以选择在创建动态Web项目的过程中执行此操作。在创建项目之前,您需要在Eclipse中集成服务器实例。您可以通过“服务器”视图来做到这一点(假设您将Eclipse用于Java EE开发人员,否则进行升级)。之后,您还可以通过项目属性中的“服务器”条目更改它。选择您要用作“默认”服务器的服务器,然后其库将自动包含在项目的构建路径中。绝对没有必要将它们复制/移动到其他地方。另请参阅如何在Eclipse项目中导入javax.servlet API?