【问题标题】:Strange java.lang.ArrayIndexOutOfBoundsException thrown on jetty startup码头启动时抛出奇怪的 java.lang.ArrayIndexOutOfBoundsException
【发布时间】:2014-12-17 05:55:32
【问题描述】:

每当我部署码头应用程序时,我都会遇到这个问题。看起来像一些jar 或类坏了。

  • 同事编译完全相同的代码,没有遇到问题。即使部署到同一台计算机上。 (我们使用gitmaven
  • 删除本地 maven 存储库 ~/.m2 并重建没有帮助。
  • 可以毫无问题地在本地运行相同的码头应用程序。
  • 我最初的怀疑是某些jar 已损坏。试过 jar tvf $every_jar 并没有找到任何东西。

有什么想法可以调试吗?看起来真的很神秘,我怀疑是某些文件损坏了。

Stack trace:
2014-10-21 13:29:25.123:WARN:oejw.WebAppContext:Failed startup of context o.e.j.w.WebAppContext{/,file:/XYZ/},/XYZ/webapps/root
javax.servlet.ServletException: jersey-serlvet
        at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:553)
        at org.eclipse.jetty.servlet.ServletHolder.doStart(ServletHolder.java:344)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
        at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:791)
        at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:265)
        at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1242)
        at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:717)
        at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:494)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
        at org.eclipse.jetty.deploy.bindings.StandardStarter.processBinding(StandardStarter.java:39)
        at org.eclipse.jetty.deploy.AppLifeCycle.runBindings(AppLifeCycle.java:186)
        at org.eclipse.jetty.deploy.DeploymentManager.requestAppGoal(DeploymentManager.java:494)
        at org.eclipse.jetty.deploy.DeploymentManager.addApp(DeploymentManager.java:141)
        at org.eclipse.jetty.deploy.providers.ScanningAppProvider.fileAdded(ScanningAppProvider.java:145)
        at org.eclipse.jetty.deploy.providers.ScanningAppProvider$1.fileAdded(ScanningAppProvider.java:56)
        at org.eclipse.jetty.util.Scanner.reportAddition(Scanner.java:615)
        at org.eclipse.jetty.util.Scanner.reportDifferences(Scanner.java:540)
        at org.eclipse.jetty.util.Scanner.scan(Scanner.java:403)
        at org.eclipse.jetty.util.Scanner.doStart(Scanner.java:337)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
        at org.eclipse.jetty.deploy.providers.ScanningAppProvider.doStart(ScanningAppProvider.java:121)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
        at org.eclipse.jetty.deploy.DeploymentManager.startAppProvider(DeploymentManager.java:555)
        at org.eclipse.jetty.deploy.DeploymentManager.doStart(DeploymentManager.java:230)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
        at org.eclipse.jetty.util.component.AggregateLifeCycle.doStart(AggregateLifeCycle.java:81)
        at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:58)
        at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:96)
        at org.eclipse.jetty.server.Server.doStart(Server.java:282)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
        at org.eclipse.jetty.xml.XmlConfiguration$1.run(XmlConfiguration.java:1274)
        at java.security.AccessController.doPrivileged(Native Method)
        at org.eclipse.jetty.xml.XmlConfiguration.main(XmlConfiguration.java:1197)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.eclipse.jetty.start.Main.invokeMain(Main.java:473)
        at org.eclipse.jetty.start.Main.start(Main.java:615)
        at org.eclipse.jetty.start.Main.main(Main.java:96)

紧随其后

Caused by:
java.lang.ArrayIndexOutOfBoundsException: 6241
        at org.objectweb.asm.ClassReader.<init>(Unknown Source)
        at org.objectweb.asm.ClassReader.<init>(Unknown Source)
        at org.objectweb.asm.ClassReader.<init>(Unknown Source)
        at com.sun.jersey.spi.scanning.AnnotationScannerListener.onProcess(AnnotationScannerListener.java:133)
        at com.sun.jersey.core.spi.scanning.uri.FileSchemeScanner$1.f(FileSchemeScanner.java:86)
        at com.sun.jersey.core.util.Closing.f(Closing.java:71)
        at com.sun.jersey.core.spi.scanning.uri.FileSchemeScanner.scanDirectory(FileSchemeScanner.java:83)
        at com.sun.jersey.core.spi.scanning.uri.FileSchemeScanner.scanDirectory(FileSchemeScanner.java:80)
        at com.sun.jersey.core.spi.scanning.uri.FileSchemeScanner.scanDirectory(FileSchemeScanner.java:80)
        at com.sun.jersey.core.spi.scanning.uri.FileSchemeScanner.scan(FileSchemeScanner.java:71)
        at com.sun.jersey.core.spi.scanning.PackageNamesScanner.scan(PackageNamesScanner.java:223)
        at com.sun.jersey.core.spi.scanning.PackageNamesScanner.scan(PackageNamesScanner.java:139)
        at com.sun.jersey.api.core.ScanningResourceConfig.init(ScanningResourceConfig.java:80)
        at com.sun.jersey.api.core.PackagesResourceConfig.init(PackagesResourceConfig.java:104)
        at com.sun.jersey.api.core.PackagesResourceConfig.<init>(PackagesResourceConfig.java:78)
        at com.sun.jersey.api.core.PackagesResourceConfig.<init>(PackagesResourceConfig.java:89)
        at com.sun.jersey.spi.container.servlet.WebComponent.createResourceConfig(WebComponent.java:700)

【问题讨论】:

    标签: java jetty maven-jetty-plugin


    【解决方案1】:

    对于您的 2 个错误..

    javax.servlet.ServletException: jersey-serlvet
    

    这意味着您的 WEB-INF/web.xml 中有错字

    至于这个..

    java.lang.ArrayIndexOutOfBoundsException: 6241
        at org.objectweb.asm.ClassReader.<init>(Unknown Source)
    

    在使用旧版本的 asm.jar 和新编译的 Java 字节码时,我看到过类似的情况。

    • 对于 Java 15 字节码,使用 asm 7.3.1+
    • 对于 Java 14 字节码,使用 asm 7.2+
    • 对于 Java 13 字节码,使用 asm 7.1+
    • 对于 Java 12 字节码,使用 asm 7.1+
    • 对于 Java 11 字节码,使用 asm 7.0+
    • 对于 Java 10 字节码,使用 asm 6.1+
    • 对于 Java 9 字节码,使用 asm 6.0+
    • 对于 Java 8 字节码,使用 asm 5.0.1+
    • 对于 Java 6 或 Java 7 字节码,(如果必须使用 asm 3.1,但要知道 asm 5.x 也可以在这里工作)李>

    确保您的asm.jar(或org.objectweb.asm.jar)是最新的。

    还有一个不太常见的问题是类本身不好。有时会看到在一个 JDK(如 IBM)中编译然后在另一个 Java(如 Sun/Oracle)上运行的类。

    the icu4j-2.6.1.jar and its com/ibm/icu/impl/data/LocaleElements_zh__PINYIN.class jar entry 是一个真实的例子。

    【讨论】:

    • 使用 Java 7 和 asm 3.1。
    • 您用于 JVM 的内容与字节码扫描无关,导致失败的类可能是高于 JVM 的字节码。 (换句话说,被绊倒的类可以为 Java 8 编译)
    • ASM 3 未处理的特性已经在 J​​ava 7 中定义,即使 javac 不使用它们,您也可能在运行时遇到它们。无论如何推荐使用过时的版本是没有意义的。只需将 ASM 5 用于 所有 版本...
    • 我不使用 asm 库。它发生在 Android Studio 上。并且只有发布版本变体,调试才能很好地构建
    • @user155 字节码扫描与asm 在android 上不应该工作。因为在 Android 上字节码不再是 java。
    【解决方案2】:

    使用较新版本的 jetty-maven-plugin。

    更多信息 --> Bug 419801 - Upgrade to asm5 for jdk8

    所以,像这样编辑你的pom.xml

    <plugin>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <version>9.3.0.M2</version>
    </plugin>
    

    注意 groupId 是“org.eclipse.jetty”。

    【讨论】:

    【解决方案3】:

    我在维护遗留代码时遇到了类似的问题。

    servlet JerseyServlet 的 Servlet.init() 抛出异常 类型异常报告 servlet JerseyServlet 的消息 Servlet.init() 抛出异常 描述 服务器遇到一个内部错误,阻止它完成这个请求。 例外 javax.servlet.ServletException:Servlet JerseyServlet 的 Servlet.init() 抛出异常 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423) org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079) org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625) org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) java.lang.Thread.run(Thread.java:745) 根本原因 java.lang.ArrayIndexOutOfBoundsException note Apache Tomcat/7.0.65 日志中提供了根本原因的完整堆栈跟踪。

    我通过减少 web.xml 中的包扫描范围来修复它。例如,删除 param-value 标签中的 package_with_too_many_classes 解决了这个问题。

    <servlet>
       <servlet-name>JerseyServlet</servlet-name>
       <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
       <init-param>
           <param-name>com.sun.jersey.config.property.packages</param-name>
           <param-value>package_with_too_many_classes;package_with_approciate_number_of_classes;org.codehaus.jackson.jaxrs</param-value>
       </init-param>
       <load-on-startup>2</load-on-startup>
     </servlet>
    

    【讨论】:

    • 这在我的情况下有效。我在子包中添加了新的非 servlet 类。我改变了他们的包路径,错误就消失了。
    【解决方案4】:

    在我的例子中,我使用的是 ASM 库版本并且不支持 java 8 lambda 表达式,所以要么更改 ASM 库以支持 java 8,要么更改你的代码。

    在我的例子中,我使用 java 8 lambda 表达式进行迭代,并将其替换为 for 循环

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-14
      相关资源
      最近更新 更多