3

我正在尝试将完美运行的嵌入式 Tomcat 5.5 升级到 Tomcat 6.0。我知道我需要做的就是用 6.0 替换 Tomcat 5.5 罐子。这就是我所做的。

所以我更换了以下罐子:

catalina-5.0.28.jar catalina-5.5.9.jar catalina-optional-5.5.9.jar 
commons-el.jar commons-modeler-1.1.0.jar jasper-compiler-jdt.jar 
jasper-compiler.jar jasper-runtime.jar jmx-5.0.28.jar jsp-api-2.0.jar 
naming-factory.jar naming-resources.jar servlet-api-2.4.jar 
servlets-default.jar tomcat-coyote.jar tomcat-http.jar tomcat-util.jar

和:

annotations-api.jar  catalina.jar    jasper.jar         tomcat-dbcp.jar
catalina-ant.jar     el-api.jar      jsp-api.jar        tomcat-i18n-es.jar
catalina-ha.jar      jasper-el.jar   servlet-api.jar    tomcat-i18n-fr.jar
catalina-tribes.jar  jasper-jdt.jar  tomcat-coyote.jar  tomcat-i18n-ja.jar
tomcat-juli.jar

启动服务器后,我会在 INFO 级别的日志中收到以下消息:

INFO: Starting Servlet Engine: Apache Tomcat/6.0.29
Dec 31, 2010 6:04:18 AM org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(/usr/local/blah/blue/./WEB-INF/lib/servlet-api.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class

根据这个解释,我需要删除一个 Servlet.class 冲突的 jar 文件。我向上帝发誓,没有其他冲突的 jar 文件,我为 Servlet.class 在系统范围内搜索,它只匹配 servlet-api.jar。

我还下载了 javaee.jar 并将其替换为 servlet-api.jar,同样有效。

在尝试了很多这些东西之后,我没有太多可看的东西,所以将 tomcat 日志记录级别设置为 ALL。在日志中,我可以看到它正在尝试检查它正在加载的每个 jar 中的 Servlet.class,直到它找到 servlet-api.jar 并在找到 servlet-api.jar 后立即抛出“jar not loaded”消息. 见下文:

FINE:  Checking for javax/servlet/Servlet.class
Jan 2, 2011 7:39:33 AM org.apache.catalina.loader.WebappLoader setRepositories
FINE: Deploy JAR /WEB-INF/lib/servlet-api.jar to /usr/local/blah/blue/./WEB-INF/lib/servlet-api.jar
Jan 2, 2011 7:39:33 AM org.apache.catalina.loader.WebappClassLoader addJar
FINE: addJar(/WEB-INF/lib/servlet-api.jar)
Jan 2, 2011 7:39:33 AM org.apache.catalina.loader.WebappClassLoader validateJarFile
FINE:  Checking for javax/servlet/Servlet.class
Jan 2, 2011 7:39:33 AM org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(/usr/local/blah/blue/./WEB-INF/lib/servlet-api.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
Jan 2, 2011 7:39:33 AM org.apache.catalina.loader.WebappLoader setRepositories

更新 我可以通过将 servlet-api.jar 放在单独的文件夹(如 $CATALINA_HOME/common/lib)中来删除上述“jar not added”错误。但是,当我点击 URL 时,GUI 仍然显示空白(错误 404):(。点击 URL 时的日志消息如下所述。 更新结束

但是请注意,Tomcat 启动成功!一旦我在浏览器上点击 URL,我就会得到空白页面(这可能只是我的情况,我猜是因为我的 web.xml,与大多数人不同。互联网上的其他人得到了错误 404 .) 带有以下日志语句(最好的级别)

Jan 2, 2011 9:40:01 AM org.apache.catalina.connector.CoyoteAdapter parseSessionCookiesId
FINE:  Requested cookie session id is 0FBA716E3F9B0147C3AF7ABAE3B1C27B
Jan 2, 2011 9:40:01 AM org.apache.catalina.authenticator.AuthenticatorBase invoke
FINE: Security checking request GET /login.jsp
Jan 2, 2011 9:40:01 AM org.apache.catalina.realm.RealmBase findSecurityConstraints
FINE:   Checking constraint 'SecurityConstraint[protected]' against GET /login.jsp --> false
Jan 2, 2011 9:40:01 AM org.apache.catalina.realm.RealmBase findSecurityConstraints
FINE:   Checking constraint 'SecurityConstraint[protected]' against GET /login.jsp --> false
Jan 2, 2011 9:40:01 AM org.apache.catalina.realm.RealmBase findSecurityConstraints
FINE:   Checking constraint 'SecurityConstraint[protected]' against GET /login.jsp --> false
Jan 2, 2011 9:40:01 AM org.apache.catalina.realm.RealmBase findSecurityConstraints
FINE:   Checking constraint 'SecurityConstraint[protected]' against GET /login.jsp --> false
Jan 2, 2011 9:40:01 AM org.apache.catalina.realm.RealmBase findSecurityConstraints
FINE:   No applicable constraint located
Jan 2, 2011 9:40:01 AM org.apache.catalina.authenticator.AuthenticatorBase invoke
FINE:  Not subject to any constraint
Jan 2, 2011 9:40:01 AM org.apache.catalina.core.StandardWrapper allocate
FINEST:   Returning non-STM instance

我不确定上述日志消息是否重要,但我在这里全面披露。

不过,一件有趣的事情是,我在 WEB-INF 文件夹之外手动创建了一个仅包含“helloooo”的虚拟 jsp 文件(此文件没有安全限制)。该文件是可访问的并且可以显示。但是,我所有的 jsp 和类都在 WEB-INF(当然)内。

厌倦了这个问题,请帮我解决它。我已经花了 20-24 小时来解决这个问题,但没有成功。

任何指针方向提示线索?

4

4 回答 4

2

servlet-api.jar 绝对是运行嵌入的 tomcat 所需要的。但是,这似乎是一个类加载器问题。webapp 的类加载器不能“直接”访问 servlet.jar,只能通过其父类加载器。

如果只更换jar,那么6.0和5.5的ClassLoaders肯定有细微的差别,但我不能说在哪里。

于 2011-01-02T09:42:55.193 回答
2

Tomcat 5.5 和 Tomcat 6.0 有一些显着差异。我的建议是将 WAR 文件移动到新的 Tomcat 中,而不是尝试删除旧的。我想到的一个特别区别是 JAR 文件的组织方式都不同。

由于 Tomcat 6.0 显然带有所有 Tomcat 6.0 JAR 文件,因此如果您只使用新的 Tomcat 6.0 安装然后将 WAR 文件应用程序移动到新的 Tomcat 6,那么您就不会有任何冲突。

您可能仍然会遇到冲突,但您至少会删除一个变量,您会知道您正在使用全新的、可靠的 Tomcat 安装,而不是可能损坏或可能不会损坏的 Tomcat 安装。

良好的调用将日志记录级别设置为 ALL,只需确保您获得所有 logging.properties 文件,因为有时可能不止一个。

http://tomcat.apache.org/tomcat-6.0-doc/logging.html

祝你好运!

于 2011-01-02T09:46:40.353 回答
1

这看起来很奇怪 - 如果您没有更改自己的网络应用程序,这个问题也必须在 5.5 中退出。

正如@daniel 所说,您的网络应用程序不允许包含包含 servlet 内容的 jar 文件。如果我正确解释日志,则 Web 应用程序目录中有一个 servlet-api。在那里完全删除 servlet-api。

编辑

  • 你的应用程序的目录布局是什么,jars(尤其是 tomcat jars)在哪里。
  • 当您的 Web 应用程序中没有 servlet-api 时,tomcat 启动时的日志输出是什么
  • 你如何“嵌入”tomcat
  • 启动应用程序时的类路径是什么

编辑

你必须分开环境让我们说

\你的应用
|
+库
|
+ 网络应用
  |
  + lib(这是你的 webapp 所在的地方,没有 servlet-api)

如果这与标准 JavaEE 容器结构相似 - 这不是纯粹的危险:-)

yourapp\lib 托管您的应用程序和 tomcat 库。这形成了启动的类路径。

yourapp\webapp\lib jar 永远不会被类路径引用,只会被 webapp 类加载器引用。当您将内置 tomcat 配置为指向此 webapp 时,您必须考虑到它们的正确路径,否则 web 应用程序加载器可能找不到它们。

编辑

也许从比 JSP 更雄心勃勃的东西开始。您是否部署了一个简单的测试 servlet?

您必须注意部署应用程序的 Web 应用程序上下文。在日志中,我看到您使用根上下文。这是真的吗?例如,如果你说

  tomcat.addWebapp("foo", appBase);

在您的嵌入中,您必须在浏览器中请求 /foo/servlet,而不是 /servlet。

于 2011-01-02T09:49:11.267 回答
0

So the issue really was: not compiling the source code with latest jars. The classes present on the machine were pre-existent and compiled using Tomcat 5.5 jars and not Tomcat 6.0. Transferring fresh classes solved my problem.

Big thanks to mtraut for showing interest on this question. I wish I could up-vote you more than once. :)

于 2011-01-07T12:28:50.667 回答