2014-10-21 116 views
9

每当我部署码头应用程序时,我遇到了这个问题。看起来像一些jar或者班级坏了。在码头启动时抛出奇怪的java.lang.ArrayIndexOutOfBoundsException

  • 编译完全相同的代码的同事不会遇到问题。即使部署到同一台计算机。 (我们使用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) 

回答

17

为了您的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字节码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

+0

使用的Java 7和ASM 3.1取而代之。 – Jakozaur 2014-10-21 21:26:06

+0

您用于JVM的内容与字节码扫描无关,导致失败的类可能比JVM的字节码高。 (换句话说,被绊倒的类可以编译为Java 8) – 2014-10-21 22:23:27

+0

ASM 3未处理的功能已在Java 7中定义,即使“javac”不使用它们,您可能会在运行时遇到它们。无论如何,推荐使用过时的版本是毫无意义的。只需使用ASM 5 for * all *版本... – Holger 2016-12-20 17:59:06

8

使用更新版本的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”。

+1

谢谢,这为我解决了它!在Maven Central查看可用的[jetty-maven-plugin版本](http://mvnrepository.com/artifact/org.eclipse.jetty/jetty-maven-plugin)。 – Jonik 2015-09-23 09:56:12

+0

它的工作原理!谢谢你〜 – Wuaner 2018-03-09 07:46:50

1

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

 
Servlet.init() for servlet JerseyServlet threw exception 

type Exception report 

message Servlet.init() for servlet JerseyServlet threw exception 

description The server encountered an internal error that prevented it from fulfilling this request. 

exception 

javax.servlet.ServletException: Servlet.init() for servlet JerseyServlet threw exception 
    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) 
root cause 

java.lang.ArrayIndexOutOfBoundsException 
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.65 logs. 

我通过在web.xml中减少包扫描范围来解决它。例如,删除参数值标签中的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> 
+0

这工作在我的情况。我在子包中添加了新的非servlet类。我改变了他们的包装路径,错误消失了。 – jla 2017-03-21 03:50:51

0

就我而言,我使用ASM库版本和不支持Java 8 Lambda表达式,所以要么你改变ASM库支持Java 8或更改代码。

在我的情况下,我用java 8 lambda表达式的迭代和我一起为环

相关问题