2014-10-21 15 views
9

Всякий раз, когда я развертываю приложение причала, я попал в эту проблему. Похож на некоторых jar или класс не работает.Странный java.lang.ArrayIndexOutOfBoundsException, брошенный при запуске причала

  • Коллеги, составляющие точно такой же код, не попадают в проблему. Даже если развертывание на одном компьютере. (мы используем git и maven)
  • Удаление локального хранилища 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 и ассемблерном 3.1. – Jakozaur

+0

То, что вы используете для JVM, не имеет отношения к сканированию байт-кода, класс, вызывающий отказ, может быть байт-кода выше, чем ваш JVM. (другими словами, класс, который отключается, может быть скомпилирован для Java 8) –

+0

Функции, которые не обрабатываются ASM 3, уже определены в Java 7, и даже если 'javac' их не использует, вы можете столкнуться с ними во время выполнения. В любом случае нет смысла рекомендовать использовать устаревшую версию. Просто используйте ASM 5 для * всех * версий ... – Holger

8

Используйте более новую версию plug-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> 

Обратите внимание на идентификатор_группы является "org.eclipse.jetty".

+1

Спасибо, это решило это для меня! См. Доступные версии [jetty-maven-plugin] (http://mvnrepository.com/artifact/org.eclipse.jetty/jetty-maven-plugin) в Maven Central. – Jonik

+0

Он работает! thank u ~ – Wuaner

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 в теге param-value исправлена ​​проблема.

<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

Это сработало в моем случае. Я добавил новые классы без сервлетов в подпакет. Я изменил их путь пакета, и ошибки ушли. – jla

0

В моем случае, я использую версию библиотеки ASM и не поддерживает лямбда-выражения Java 8, так что либо изменить библиотеку ASM для поддержки Java 8 или изменить свой код.

В моем случае я использую лямбда-выражения Java 8 для переборе, и я заменил его на петле