eclipse tomcat为什么要继续复制servlet api jar

时间:2011-01-24 14:35:31

标签: java eclipse tomcat

我正在使用eclipse并添加了tomcat 6服务器。每当我尝试启动服务器时,它会自动将服务器api jar复制到WEBINF / lib文件夹中并且应用程序无法启动

INFO: validateJarFile(/media/01CB9CAC704E03A0/Projects/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/myapp/WEB-INF/lib/servlet-api-2.5.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class

2 个答案:

答案 0 :(得分:4)

我遇到了同样的问题,在看完其他页面之后终于开始工作了。我将在此处列出,以防其他人遇到同样的问题。

就我而言,myeclipse项目是从maven .pom文件创建的,该文件将JEE 1.5文件列为“提供”范围,即这些文件将由容器提供(在我的例子中为tomcat 6)。因此,如果我使用maven创建一个war文件并将其放在webapps目录中,它就可以正常工作了。每次做出改变都会有点单调乏味,所以当我遇到同样的问题时,我决定进行爆炸式部署。

由于项目文件是从pom文件创建的,因此这些依赖项出现了,但Eclipse项目文件不会将这些依赖项识别为“已提供”而不会进行部署。当TOMCAT发现规范的两个实现时,它并不高兴:

“Servlet规范2.3秒9.7.2建议......容器用于在WAR中加载servlet的类加载器必须允许开发人员使用getResource在正常的J2SE语义之后加载WAR中的库JAR中包含的任何资源。不允许WAR覆盖J2SE或Java servlet API类。进一步建议加载器不允许WAR中的servlet访问Web容器的实现类。还建议实现应用程序类加载器以便类和资源在WAR中打包的内容优先于驻留在容器范围的库JAR中的类和资源。“

我玩弄上述解决方案来改变我的deplyment程序集配置,但这是没有用的,因为如果我选择“来自构建路径的JARS”这些jar被捆绑在一起 在菜单项目属性/ MyEclipse / Web / Deplyment /配置工作区设置中。 我需要这样做因为我有其他依赖项jar(不是由容器提供)。

解决方案:

  1. 我手动从构建路径中的依赖项中删除了这些jar。
  2. 相反,我添加了对用户库的依赖--JAVA EE5。
  3. 在部署配置中,我删除了从所需项目的用户库导出的JARS选项。
  4. YMMV。但无论如何,如果您阅读上面的servlet规范定义,然后查看工作区中的配置,您可以对其进行排序。

    希望这有帮助。

答案 1 :(得分:1)

转到项目属性,然后在“部署程序集”页面下查看。此页面描述了如何打包应用程序以进行部署或导出。看看有关图书馆的条目。您必须弄清楚哪些条目指向servlet api jar并将其删除。如果该条目指向需要打包的其他jar文件,则需要将其拆分为几个单独的构建路径条目,这样您就可以准确地告诉Eclipse哪些内容需要打包,哪些不需要打包。