【问题标题】:Nightmare: Upgrading Tomcat 5.5 to 6.0噩梦:将 Tomcat 5.5 升级到 6.0
【发布时间】:2011-01-02 09:33:04
【问题描述】:

我正在尝试将运行良好的嵌入式 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

根据this 的解释,我需要删除一个 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 小时,但没有成功。

任何指针方向提示线索?

【问题讨论】:

    标签: java tomcat6 tomcat5.5


    【解决方案1】:

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

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

    【讨论】:

    • Tomcat 升级让生活一团糟。
    【解决方案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

    祝你好运!

    【讨论】:

    • 感谢@jmort 的关注,但我使用的是嵌入式 Tomcat。因此没有战争。 :(
    【解决方案3】:

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

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

    编辑

    • 您的应用程序的目录布局是什么,jar(尤其是 tomcat jar)存放在哪里。
    • 当您的 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。

    【讨论】:

    • mtraut 是对的。 servlet-api.jar 不应该在那里,而是在另一个目录中。 Tomcat 有它的 shared/lib 或 common/lib 目录,它需要 servlet-api.jar,请尝试将它移到那里。
    • 应用程序和tomcat所需的jars都存在于.../WEB-INF/lib中。系统中没有其他地方我们有罐子(除了像 JAVA_HOME 这样的地方)。我启动应用程序时的类路径由 .../WEB-INF/lib 中的所有 jar 和 .../WEB-INF/classes 中的所有类组成。 Tomcat 可以像这样嵌入:copperykeenclaws.com/embedding-tomcat-7
    • 当tomcat在没有servlet-api.jar的情况下启动时,日志输出显示ClassNotFoundExceptionSEVERE: Error listenerStart error.
    • 如何让 webapp 类加载器引用yourapp\webapp\lib?有一些API吗?我必须通过 API 完成所有操作,因为我使用的是嵌入式。感谢 mtraut 的关注。
    • 好吧,也许你会在这里找到:copperykeenclaws.com/embedding-tomcat-7 :-))) 我没有亲自尝试,但我认为它是对“ webapp.setContextPath("/myapp"); 的调用。 " (应该是“yourapp\webapp”。只需浏览一下 WebAppContext 文档......
    【解决方案4】:

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

    非常感谢 mtraut 对这个问题表现出兴趣。我希望我能不止一次地投票给你。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      相关资源
      最近更新 更多