VsCode运行Payara Micro时executor服务任务抛出IndexOutOfBoundsException
VS Code Payara扩展启动Payara Micro索引越界异常修复方案
异常现象
通过VS Code Payara扩展启动Java 8环境下的GlassFish项目时,payara-executor-service-task线程抛出索引越界异常,异常日志如下:
[2021-12-02T08:11:06.092-0400] [] [INFO] [NCLS-JMX-00006] [javax.enterprise.system.jmx] [tid: _ThreadID=88 _ThreadName=Thread-9] [timeMillis: 1638447066092] [levelValue: 800] JMXStartupService has disabled JMXConnector system [2021-12-02T08:11:32.329-0400] [] [SEVERE] [] [javax.enterprise.system.tools.deployment.common] [tid: _ThreadID=35 _ThreadName=payara-executor-service-task] [timeMillis: 1638447092329] [levelValue: 1000] [[ Exception while visiting jersey/repackaged/com/google/common/collect/AbstractMapBasedMultimap$RandomAccessWrappedList.class of size 2105 java.lang.IndexOutOfBoundsException: Index: 3, Size: 3 at java.util.ArrayList.rangeCheck(ArrayList.java:657) at java.util.ArrayList.get(ArrayList.java:433) at org.glassfish.hk2.classmodel.reflect.impl.MethodModelImpl.getParameter(MethodModelImpl.java:104) at org.glassfish.hk2.classmodel.reflect.impl.ModelClassVisitor$ModelMethodVisitor.visitParameterAnnotation(ModelClassVisitor.java:392) at org.objectweb.asm.ClassReader.readParameterAnnotations(ClassReader.java:2932) at org.objectweb.asm.ClassReader.readMethod(ClassReader.java:1467) at org.objectweb.asm.ClassReader.accept(ClassReader.java:717) at org.objectweb.asm.ClassReader.accept(ClassReader.java:401) at org.glassfish.hk2.classmodel.reflect.Parser$5.on(Parser.java:336) at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.handleEntry(ReadableArchiveScannerAdapter.java:165) at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.onSelectedEntries(ReadableArchiveScannerAdapter.java:127) at org.glassfish.hk2.classmodel.reflect.Parser.doJob(Parser.java:321) at org.glassfish.hk2.classmodel.reflect.Parser.access$300(Parser.java:44) at org.glassfish.hk2.classmodel.reflect.Parser$3.call(Parser.java:280) at org.glassfish.hk2.classmodel.reflect.Parser$3.call(Parser.java:269) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) ]] [2021-12-02T08:11:32.460-0400] [] [SEVERE] [] [javax.enterprise.system.tools.deployment.common] [tid: _ThreadID=35 _ThreadName=payara-executor-service-task] [timeMillis: 1638447092460] [levelValue: 1000] [[ Exception while visiting jersey/repackaged/com/google/common/collect/AbstractMapBasedMultimap$WrappedCollection.class of size 6672 java.lang.IndexOutOfBoundsException: Index: 3, Size: 3 at java.util.ArrayList.rangeCheck(ArrayList.java:657) at java.util.ArrayList.get(ArrayList.java:433) at org.glassfish.hk2.classmodel.reflect.impl.MethodModelImpl.getParameter(MethodModelImpl.java:104) at org.glassfish.hk2.classmodel.reflect.impl.ModelClassVisitor$ModelMethodVisitor.visitParameterAnnotation(ModelClassVisitor.java:392) at org.objectweb.asm.ClassReader.readParameterAnnotations(ClassReader.java:2932) at org.objectweb.asm.ClassReader.readMethod(ClassReader.java:1467) at org.objectweb.asm.ClassReader.accept(ClassReader.java:717) at org.objectweb.asm.ClassReader.accept(ClassReader.java:401) at org.glassfish.hk2.classmodel.reflect.Parser$5.on(Parser.java:336) at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.handleEntry(ReadableArchiveScannerAdapter.java:165) at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.onSelectedEntries(ReadableArchiveScannerAdapter.java:127) at org.glassfish.hk2.classmodel.reflect.Parser.doJob(Parser.java:321) at org.glassfish.hk2.classmodel.reflect.Parser.access$300(Parser.java:44) at org.glassfish.hk2.classmodel.reflect.Parser$3.call(Parser.java:280) at org.glassfish.hk2.classmodel.reflect.Parser$3.call(Parser.java:269) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) ]] [2021-12-02T08:11:32.495-0400] [] [SEVERE] [] [javax.enterprise.system.tools.deployment.common] [tid: _ThreadID=35 _ThreadName=payara-executor-service-task] [timeMillis: 1638447092495] [levelValue: 1000] [[ Exception while visiting jersey/repackaged/com/google/common/collect/AbstractMapBasedMultimap$WrappedList.class of size 5708 java.lang.IndexOutOfBoundsException: Index: 3, Size: 3 at java.util.ArrayList.rangeCheck(ArrayList.java:657) at java.util.ArrayList.get(ArrayList.java:433) at org.glassfish.hk2.classmodel.reflect.impl.MethodModelImpl.getParameter(MethodModelImpl.java:104) at org.glassfish.hk2.classmodel.reflect.impl.ModelClassVisitor$ModelMethodVisitor.visitParameterAnnotation(ModelClassVisitor.java:392) at org.objectweb.asm.ClassReader.readParameterAnnotations(ClassReader.java:2932) at org.objectweb.asm.ClassReader.readMethod(ClassReader.java:1467) at org.objectweb.asm.ClassReader.accept(ClassReader.java:717) at org.objectweb.asm.ClassReader.accept(ClassReader.java:401) at org.glassfish.hk2.classmodel.reflect.Parser$5.on(Parser.java:336) at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.handleEntry(ReadableArchiveScannerAdapter.java:165) at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.onSelectedEntries(ReadableArchiveScannerAdapter.java:127) at org.glassfish.hk2.classmodel.reflect.Parser.doJob(Parser.java:321) at org.glassfish.hk2.classmodel.reflect.Parser.access$300(Parser.java:44) at org.glassfish.hk2.classmodel.reflect.Parser$3.call(Parser.java:280) at org.glassfish.hk2.classmodel.reflect.Parser$3.call(Parser.java:269) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) ]] [2021-12-02T08:11:32.503-0400] [] [SEVERE] [] [javax.enterprise.system.tools.deployment.common] [tid: _ThreadID=35 _ThreadName=payara-executor-service-task] [timeMillis: 1638447092503] [levelValue: 1000] [[ Exception while visiting jersey/repackaged/com/google/common/collect/AbstractMapBasedMultimap$WrappedSortedSet.class of size 4003 java.lang.IndexOutOfBoundsException: Index: 3, Size: 3 at java.util.ArrayList.rangeCheck(ArrayList.java:657) at java.util.ArrayList.get(ArrayList.java:433) at org.glassfish.hk2.classmodel.reflect.impl.MethodModelImpl.getParameter(MethodModelImpl.java:104) at org.glassfish.hk2.classmodel.reflect.impl.ModelClassVisitor$ModelMethodVisitor.visitParameterAnnotation(ModelClassVisitor.java:392) at org.objectweb.asm.ClassReader.readParameterAnnotations(ClassReader.java:2932) at org.objectweb.asm.ClassReader.readMethod(ClassReader.java:1467) at org.objectweb.asm.ClassReader.accept(ClassReader.java:717) at org.objectweb.asm.ClassReader.accept(ClassReader.java:401) at org.glassfish.hk2.classmodel.reflect.Parser$5.on(Parser.java:336) at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.handleEntry(ReadableArchiveScannerAdapter.java:165) at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.onSelectedEntries(ReadableArchiveScannerAdapter.java:127) at org.glassfish.hk2.classmodel.reflect.Parser.doJob(Parser.java:321) at org.glassfish.hk2.classmodel.reflect.Parser.access$300(Parser.java:44) at org.glassfish.hk2.classmodel.reflect.Parser$3.call(Parser.java:280) at org.glassfish.hk2.classmodel.reflect.Parser$3.call(Parser.java:269) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) ]]
异常抛出后Payara Micro实例仍可正常启动,启动成功日志如下:
[2021-12-02T08:12:23.124-0400] [] [INFO] [] [PayaraMicro] [tid: _ThreadID=1 _ThreadName=main] [timeMillis: 1638447143124] [levelValue: 800] Payara Micro URLs: [2021-12-02T08:12:23.127-0400] [] [INFO] [] [PayaraMicro] [tid: _ThreadID=1 _ThreadName=main] [timeMillis: 1638447143127] [levelValue: 800] Payara Micro 5.2021.5 #badassmicrofish (build 770) ready in 111,507 (ms)
根因说明
问题核心是VS Code Payara扩展默认继承全局JAVA_HOME/JDK_HOME环境变量启动服务,而VS Code Java扩展要求全局JAVA_HOME配置为JDK11,和项目所需的JDK8运行环境存在字节码解析兼容问题,导致HK2类反射工具解析JDK8编译的Guava类字节码时触发索引越界。
修复方案
- 配置Payara扩展独立JDK路径:打开VS Code设置,搜索
Payara › Jdk: Path配置项,将值设置为项目使用的JDK8本地路径,扩展启动Payara Micro时会优先使用该配置的JDK,规避全局JDK版本冲突问题。 - 升级相关组件版本:将VS Code Payara扩展升级到最新稳定版,同时将Payara Micro版本升级到5.2022.1及以上,官方已修复该类HK2字节码解析越界漏洞。
- 临时调试规避:直接使用Maven命令
mvn fish.payara.maven.plugins:payara-micro-maven-plugin:start -X启动Payara Micro,启动时添加--debug 5005参数开启调试端口,再在VS Code中新建Remote JVM Debug配置,端口设置为5005后attach到运行实例即可正常调试,完全绕开扩展启动逻辑。
内容的提问来源于stack exchange,提问作者Rubén Vásquez
相关产品推荐
相关产品推荐

