33
  • Tomcat 7.0.16
  • Java 1.6.0_22
  • CentOS 5.6

我刚刚将 web.xml 切换到 servlet 3.0(从之前运行 2.4 的应用程序),现在我看到以下错误(为 org.apache.tomcat.util 启用了精细日志记录):

mtyson  FINE: Scanning JAR [file:/usr/java/jdk1.6.0_22/jre/lib/ext/jcharset.jar] from classpath
mtyson  Jul 19, 2011 10:04:40 AM org.apache.catalina.startup.HostConfig deployDirectory
mtyson  SEVERE: Error deploying web application directory ROOT
mtyson  org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 60

更新:刚刚尝试过tomcat 7.0.19 - 结果相同

4

11 回答 11

32

添加

metadata-complete="true" 

到您的 web.xml 应该对问题进行排序

<web-app version="3.0"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         metadata-complete="true">

这告诉tomcat不要扫描类的注释:http ://www.tomcatexpert.com/blog/2011/10/12/how-use-fragments-and-annotations-configure-your-web-application

于 2012-10-04T14:54:11.243 回答
24

这可能不是你的问题,但我的问题和这个问题一样——旧版本的com.ibm.icu:icu4j. 我通过更改构建配置以排除较旧的传递依赖项并明确依赖于最新版本(4.8)解决了这个问题。

于 2011-07-20T16:39:23.687 回答
19

感谢James A Wilson 的回答- 按照您的建议更新 icu4j 对我有用,并允许我将 version="3.0" 保留在我的 web.xml 中(从长远来看,我更喜欢它)。

icu4j 2.6.1 是无法工作的版本,升级到 NEXT 版本 3.4.4 将解决此问题。我没有使用最新版本的 icu4j (49.1),因为它比 3.4.4 版本大 4MB。

这是一个 Maven 配置片段,用于锁定您的传递依赖版本(不添加显式依赖):

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.ibm.icu</groupId>
            <artifactId>icu4j</artifactId>
            <version>3.4.4</version>
        </dependency>
    </dependencies>
</dependencyManagement>
于 2012-04-25T22:12:41.303 回答
3

结果证明这是构建中包含的不兼容的 jasper jar,与 tomcat 7 中的 jasper.jar 冲突。

于 2012-01-22T18:44:43.033 回答
3

我今天遇到了同样的问题。就我而言,依赖来自 com.google.code.findbugs:annotations:jar:1.3.8。这意味着这个库只在构建时使用,使用注释来关闭一些 findbug 警告。在这种情况下,无需更改版本,只需更改依赖范围而不在运行时获取库是安全的:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.ibm.icu</groupId>
            <artifactId>icu4j</artifactId>
            <scope>provided</scope>
        </dependency>
        ....
于 2013-06-12T12:02:51.567 回答
2

我认为这是我自己解析 web.xml 文件的错误

使用它对我有用...

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

<session-config> <tracking-mode>COOKIE</tracking-mode> </session-config>

请注意使用带有 web-app_3_0.xsd 架构的 version="2.5" 以及 session-config tracking-mode 的存在,这只是 3.0 规范的一部分,而不是 2.5 (AFAIK)

于 2011-08-04T12:55:45.317 回答
2

在没有升级 Java、Tomcat 或项目依赖项的情况下,对我们的应用程序进行了微小的更改,我们就开始遇到同样的错误。我们有 icu4j 2.6.1

在花费了相当多的时间并尝试将 icu4j 升级到各种较新的版本之后(我们注意到并发现 icu 版本从 4.8.x 到 49.xx、50.xx 等,肯定有人在构建 4.9.0 ),我们发现了问题。

我们的小改动提交了一个映射到休眠的新类(A 类)。Hibernate 在我们启动 WAR 时进行初始化,并根据它们的映射检查持久对象。在我们的代码库中碰巧有另一个类,它是一个具有相同名称和相同包的枚举(B 类)。一旦我们修复了那个重复的类,问题就消失了。

于 2015-09-17T15:29:30.743 回答
1

一周后我遇到了同样的问题,只需用最新版本的 jar 替换 icu4j.2.1.jar 文件即可解决。

于 2014-01-14T11:15:09.520 回答
1

在 2.6.1 版中。com.ibm.icu.impl.data.LocaleElements_zh__PINYIN.class 无效。唯一的解决方案是更新,其他解决方案只是解决方法。

可以通过在您的项目中运行以下测试来检查它(前提是 icu-xxxjar 在您的类路径中):

@Test public void testValidityOfLocaleElements_zh__PINYINJar() throws ClassNotFoundException { getClass().forName("com.ibm.icu.impl.data.LocaleElements_zh__PINYIN"); }

于 2015-02-09T09:54:32.273 回答
1

通过删除文件夹并重新下载jar来解决

于 2018-04-22T20:02:40.073 回答
0

这可能不是你的问题,但我的问题和这个问题一样——gson-2.8.5 的旧版本。我通过更改构建配置以排除旧的传递依赖项并明确依赖于旧版本(2.8.5)来解决问题。

于 2020-07-11T05:20:31.990 回答