2014-10-21 15 views
9

Ogni volta che distribuisco l'applicazione jetty, ho riscontrato questo problema. Sembra che alcuni jar o classe è rotto.Strange java.lang.ArrayIndexOutOfBoundsException lanciata all'avvio del molo

  • I colleghi che compilano esattamente lo stesso codice, non ha riscontrato il problema. Anche se si distribuisce sullo stesso computer. (utilizziamo git e maven)
  • Eliminazione di repository maven locale ~/.m2 e la ricostruzione non è di aiuto.
  • Può eseguire localmente la stessa applicazione di jetty senza alcun problema.
  • Il mio sospetto iniziale era che alcuni jar sono guasti. Provato jar tvf $every_jar e non ho trovato nulla.

Qualche idea come posso eseguire il debug di questo? Sembra davvero misterioso e ho il sospetto che qualche file venga danneggiato.

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) 

seguito da

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) 

risposta

17

Per i vostri 2 errori ..

javax.servlet.ServletException: jersey-serlvet 

Questo significa che hai un errore di battitura nella tua WEB-INF/web.xml

Per quanto riguarda questo ..

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

Ho visto simili quando si utilizza una vecchia versione di asm.jar con un bytecode Java compilato più recente.

  • Per Java bytecode 8, utilizzare asm 5.0.1+
  • Per Java 6 o Java bytecode 7, (Usa ASM 3.1 se è necessario, ma so che asm 5.x è anche andare a lavorare anche qui)

Assicurarsi che il vostro asm.jar (o org.objectweb.asm.jar) è in corso.

C'è un problema un po 'meno comune in cui la classe stessa è cattiva. A volte visto con classi compilate in un JDK (come IBM) e quindi eseguite su un altro Java (come Sun/Oracle).

Un esempio reale di questo sarebbe the icu4j-2.6.1.jar and its com/ibm/icu/impl/data/LocaleElements_zh__PINYIN.class jar entry.

+0

Usare Java 7 e ASM 3.1. – Jakozaur

+0

Ciò che si utilizza per la propria JVM è irrilevante per la scansione bytecode, la classe che causa l'errore potrebbe essere di un bytecode superiore alla JVM. (in altre parole, la classe che è in trincea potrebbe essere compilata per Java 8) –

+0

Le funzionalità che non sono gestite da ASM 3, sono già definite in Java 7 e anche se 'javac' non le usa, potresti incontrarli in fase di runtime. Non ha senso raccomandare comunque di usare una versione obsoleta. Basta usare ASM 5 per * tutte * le versioni ... – Holger

8

Utilizzare la versione più recente di jetty-maven-plug-in.

Maggiori informazioni ->Bug 419801 - Upgrade to asm5 for jdk8

Quindi, modificare il pom.xml in questo modo:

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

Annotare il groupId è "org.eclipse.jetty".

+1

Grazie, questo lo ha risolto per me! Vedi disponibili [versioni di jetty-maven-plugin] (http://mvnrepository.com/artifact/org.eclipse.jetty/jetty-maven-plugin) in Maven Central. – Jonik

+0

Funziona! grazie ~ – Wuaner

1

Mi sono imbattuto in un problema simile durante la manutenzione del codice legacy.

 
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. 

L'ho risolto riducendo l'ambito di scansione del pacchetto in web.xml. Ad esempio, la rimozione del package_with_too_many_classes sotto il tag param-value ha risolto il problema.

<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

Questo ha funzionato nel mio caso. Ho aggiunto nuove classi non servlet in un sottoprogetto. Ho cambiato il percorso del pacchetto e gli errori sono andati via. – jla

0

Nel mio caso, io sto usando la versione della libreria ASM e che non supporta Java 8 espressione lambda, quindi o si cambia Biblioteca ASM al supporto Java 8 o modificare il codice.

Nel mio caso io sto usando Java 8 un'espressione lambda per iterare ed ho sostituito con ciclo for