2014-10-21 10 views
9

जब भी मैं जेटी एप्लिकेशन को तैनात करता हूं, मैंने इस मुद्दे को मारा। ऐसा लगता है कि कुछ jar या कक्षा टूट गई है।अजीब java.lang.ArrayIndexOutOfBoundsException जेटी स्टार्टअप पर फेंक दिया

  • समान कोड संकलित करने वाले सहयोगी इस मुद्दे को नहीं दबाते हैं। भले ही एक ही कंप्यूटर पर तैनाती हो। (हम git और 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 के पुराने संस्करण का उपयोग करते समय समान देखा है।

  • जावा 8 बाईटकोड के लिए, का उपयोग एएसएम 5.0.1+
  • जावा 6 या जावा 7 बाईटकोड, (प्रयोग एएसएम के लिए 3.1 यदि आप चाहिए, लेकिन पता है कि एएसएम 5.x है यह भी सुनिश्चित करें कि आपका asm.jar (या org.objectweb.asm.jar) वर्तमान है भी काम करने जा यहाँ)

थोड़ा कम आम मुद्दा है जहां कक्षा स्वयं खराब है। कभी-कभी कक्षाओं के साथ देखा जाता है जो एक जेडीके (जैसे आईबीएम) में संकलित होते हैं और फिर किसी अन्य जावा (जैसे सूर्य/ओरेकल) पर चलते हैं।

इसका वास्तविक दुनिया उदाहरण the icu4j-2.6.1.jar and its com/ibm/icu/impl/data/LocaleElements_zh__PINYIN.class jar entry होगा।

+0

उपयोग जावा 7 और एएसएम 3.1 के साथ बदल दिया। – Jakozaur

+0

जो भी आप अपने जेवीएम के लिए उपयोग करते हैं वह बाइटकोड स्कैनिंग के लिए अप्रासंगिक है, जो वर्ग विफलता पैदा कर रहा है वह आपके जेवीएम से अधिक बाइटकोड हो सकता है। (दूसरे शब्दों में, जिस वर्ग को ट्रिप किया जा रहा है उसे जावा 8 के लिए संकलित किया जा सकता है) –

+0

एएसएम 3 द्वारा नियंत्रित नहीं की जाने वाली विशेषताएं पहले से ही जावा 7 में परिभाषित की गई हैं और यहां तक ​​कि यदि 'जावा' उनका उपयोग नहीं करता है, तो हो सकता है कि आप रनटाइम पर उन्हें सामना करें। वैसे भी पुराने संस्करण का उपयोग करने की सिफारिश करने में कोई समझ नहीं है। * सभी * संस्करणों के लिए बस एएसएम 5 का उपयोग करें ... – Holger

8

जेट्टी-मेवेन-प्लगइन का नया संस्करण उपयोग करें।

अधिक जानकारी ->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

धन्यवाद, यह मेरे लिए हल हो गया! मेवेन सेंट्रल में उपलब्ध [जेट्टी-मेवेन-प्लगइन संस्करण] (http://mvnrepository.com/artifact/org.eclipse.jetty/jetty-maven-plugin) देखें। – Jonik

+0

यह काम करता है! धन्यवाद ~ – 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. 

मैंने इसे वेब.एक्सएमएल में पैकेज स्कैनिंग स्कोप को कम करने के साथ तय किया। उदा।, पैरा-वैल्यू टैग में नीचे 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

यह मेरे मामले में काम किया। मैंने उप-पैकेज में नई गैर-सर्वलेट कक्षाएं जोड़ दी थीं। मैंने अपना पैकेज पथ बदल दिया और त्रुटियां चली गईं। – jla

0

मेरे मामले में, मैं एएसएम पुस्तकालय संस्करण का उपयोग कर रहा हूँ और जावा 8 लैम्ब्डा अभिव्यक्ति का समर्थन नहीं है, तो या तो आप जावा 8 का समर्थन करने या अपने कोड को बदलने के लिए एएसएम पुस्तकालय बदल जाते हैं।

मेरे मामले में मैं पुनरावृत्ति के लिए जावा 8 लैम्ब्डा अभिव्यक्ति का उपयोग कर रहा हूँ और मैं पाश के लिए

संबंधित मुद्दे