web-dev-qa-db-fra.com

Étrange erreur Java.lang.ArrayIndexOutOfBoundsException levée au démarrage de la jetée

Chaque fois que je déploie une application de jetée, je rencontre ce problème On dirait que jar ou classe est cassé.

  • Les collègues qui compilent exactement le même code ne se posent pas le problème. Même si le déployer sur le même ordinateur. (nous utilisons git et maven)
  • La suppression du référentiel maven local ~/.m2 et la reconstruction n'aident pas.
  • Peut exécuter la même application de jetée localement sans aucun problème.
  • Mon premier suspect était que quelque jar soit cassé. J'ai essayé jar tvf $every_jar et je n'ai rien trouvé.

Des idées comment puis-je résoudre ce problème? Cela semble vraiment mystérieux et je suppose que certains fichiers sont corrompus.

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)

suivi par

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)
11
Jakozaur

Pour vos 2 erreurs ..

javax.servlet.ServletException: jersey-serlvet

Cela signifie que vous avez une faute de frappe dans votre WEB-INF/web.xml

Quant à celui-ci ..

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

J'ai vu des exemples similaires en utilisant une ancienne version de asm.jar avec du bytecode Java compilé plus récent.

  • Pour le bytecode Java 11, nous ne connaissons pas encore de version asm valide à utiliser.
  • Pour le bytecode Java 10, utilisez asm 6.1+
  • Pour le bytecode Java 9, utilisez asm 6.0+
  • Pour le bytecode Java 8, utilisez asm 5.0.1+
  • Pour les bytecodes Java 6 ou Java 7, (utilisez asm 3.1 si vous devez, mais sachez que asm 5.x fonctionne également ici)

Assurez-vous que votre asm.jar (ou org.objectweb.asm.jar) est à jour.

Il y a un problème un peu moins commun où la classe elle-même est mauvaise. Parfois vu avec des classes compilées dans un JDK (tel que IBM) puis exécutées sur un autre Java (tel que Sun/Oracle). 

Un exemple concret de ceci serait le icu4j-2.6.1.jar et son entrée de jarre com/ibm/icu/impl/data/LocaleElements_zh__PINYIN.class .

18
Joakim Erdfelt

Utilisez une version plus récente de jetty-maven-plugin.

Plus d'informations -> Bug 419801 - Mise à niveau vers asm5 pour jdk8

Alors, éditez votre pom.xml comme ceci:

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

Notez que le groupId est " org.Eclipse.jetty ".

10
vv314

Dans mon cas, j'utilise la version de la bibliothèque ASM et ne supporte pas l'expression lambda Java 8. Vous devez donc modifier la bibliothèque ASM pour prendre en charge Java 8 ou modifier votre code.

Dans mon cas, j’utilise l’expression lambda Java 8 pour l’itération et je l’ai remplacée par la boucle for 

1
Gaurav Deshmukh

Je suis tombé sur un problème similaire lors de la maintenance du code hérité.

 Servlet.init () pour le servlet JerseyServlet a lancé une exception 
 
 Type Rapport d'exception 
 
 Message Servlet.init () pour le servlet JerseyServlet a lancé une exception 
 
 description Le serveur a rencontré une erreur interne qui l’empêche de répondre à cette requête. 
 
 exception 
 
 javax.servlet.ServletException : Servlet.init () pour le servlet JerseyServlet a lancé une exception 
 Org.Apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.Java:505) 
 Org.Apache.catalina.valves.ErrorReportVe (ErrorReportValve.Java:103)
 Org.Apache.catalina.valves.AccessLogValve.invoke (AccessLogValve.Java:956) 
 Org.Pache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.Java : 423) 
 Org.Apache.coyote.http11.AbstractHttp11Processor.process (AbstractHttp11Processor.Java:1079) [.________ .___ _.] 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) 
 Cause première racine 
 
 Java.lang.ArrayIndexOutOfBoundsException 
 Note La trace de pile complète de la racine cause est disponible dans les journaux Apache Tomcat/7.0.65. 

Je l'ai corrigé en réduisant l'étendue de l'analyse des paquets dans web.xml. Par exemple, la suppression de package_with_too_many_classes ci-dessous dans la balise param-value a résolu le problème.

<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>
1
Popeye