繁体   English   中英

梦魇:将Tomcat 5.5升级到6.0

[英]Nightmare: Upgrading Tomcat 5.5 to 6.0

我正在尝试将完美运行的嵌入式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(ofcourse)中。

厌倦了这个问题,请帮我解决一下。 我已经花了20-24个小时才成功。

任何指针方向提示线索?

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

如果你只更换了jar,那么6.0和5.5的ClassLoader必须有一个微妙的区别,但我不知道在哪里。

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

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

你可能仍会有冲突,但你至少会有一个变量被淘汰,你会知道你正在使用一个新的,可靠的Tomcat安装,而不是一个可能被破坏或可能没有被破坏的安装。

好的调用将日志记录级别设置为ALL,只需确保获取所有logging.properties文件,因为有时可能会有多个。

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

祝好运!

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

正如@daniel所说,你的网络应用程序不允许有一个包含servlet内容的jar文件。 如果我正确地解释了日志,那么web app目录中就会有一个servlet-api。 完全删除servlet-api。

编辑

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

编辑

你必须分开环境让我们说出来

\yourapp
|
+ lib
|
+ webapp
  |
  + lib (this is where your webapp lives, WITHOUT servlet-api)

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

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

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

编辑

也许从一些不那么雄心勃勃的东西开始。 您是否部署了一个简单的测试servlet?

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

  tomcat.addWebapp("foo", appBase);

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

所以问题实际上是:不用最新的jar编译源代码。 机器上存在的类是预先存在的,并使用Tomcat 5.5 jar而不是Tomcat 6.0进行编译。 转移新课程解决了我的问题。

非常感谢mtraut表达了对这个问题的兴趣。 我希望我能不止一次向你投票。 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM