当我使用Java 8特定代码时,Jetty无法使用ArrayIndexOutOfBoundsException加载

Has*_*san 7 java jetty java-8

我在嵌入式Jetty Web服务器中使用Jersey.除了一个非常具体的案例外,一切都运作良好.我有一个用户列表,当客户端到POST/ user时,我想将用户添加到列表中.没问题,除非我想检查现有用户删除具有相同用户名的任何用户(以便更新用户).

@POST
public void createUser(User user) {
    // The first line causes the failure:
    InventoryServer.getUsers().removeIf(e -> e.getUsername().equals(user.getUsername()));
    InventoryServer.getUsers().add(user);
    InventoryServer.save();
}
Run Code Online (Sandbox Code Playgroud)

奇怪的是,当这条线存在时,Jetty甚至不会启动.它给了我一个ArrayOutOfBoundsException.我在异常时调试了程序,似乎它发生在方法中SignatureParser.current().网上有几个人提到,当你使用名为asm的库运行Java 8字节代码时会发生这种情况,当然,我发现它是jetty-server的依赖.我无法更新它,因为最新版本的Jetty需要旧版本的asm.

我想解决方案就是不使用任何Java 8特有的功能,但这似乎是一个非常不完整的解决方案.有没有办法解决这个问题并继续使用Java 8?

这是堆栈跟踪:

java.lang.ArrayIndexOutOfBoundsException: 207
    at org.objectweb.asm.ClassReader.readUTF(ClassReader.java:1976)
    at org.objectweb.asm.ClassReader.readUTF8(ClassReader.java:1951)
    at org.objectweb.asm.ClassReader.accept(ClassReader.java:515)
    at org.objectweb.asm.ClassReader.accept(ClassReader.java:425)
    at org.glassfish.jersey.server.internal.scanning.AnnotationAcceptingListener.process(AnnotationAcceptingListener.java:167)
    at org.glassfish.jersey.server.ResourceConfig.scanClasses(ResourceConfig.java:850)
    at org.glassfish.jersey.server.ResourceConfig._getClasses(ResourceConfig.java:808)
    at org.glassfish.jersey.server.ResourceConfig.getClasses(ResourceConfig.java:723)
    at org.glassfish.jersey.server.ResourceConfig$RuntimeConfig.<init>(ResourceConfig.java:1120)
    at org.glassfish.jersey.server.ResourceConfig$RuntimeConfig.<init>(ResourceConfig.java:1093)
    at org.glassfish.jersey.server.ResourceConfig.createRuntimeConfig(ResourceConfig.java:1089)
    at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:275)
    at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:262)
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:167)
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:349)
    at javax.servlet.GenericServlet.init(GenericServlet.java:244)
    at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:626)
    at org.eclipse.jetty.servlet.ServletHolder.initialize(ServletHolder.java:405)
    at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:875)
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:346)
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:772)
    at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:259)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132)
    at org.eclipse.jetty.server.Server.start(Server.java:405)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:106)
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61)
    at org.eclipse.jetty.server.Server.doStart(Server.java:372)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at edu.uhd.armyInventory.server.InventoryServer.<init>(InventoryServer.java:74)
    at edu.uhd.armyInventory.server.InventoryServer.main(InventoryServer.java:110)
Exception in thread "main" MultiException[javax.servlet.ServletException: org.glassfish.jersey.servlet.ServletContainer-1da51a35@d8bf347==org.glassfish.jersey.servlet.ServletContainer,-1,false, java.net.BindException: Address already in use]
    at org.eclipse.jetty.server.Server.doStart(Server.java:347)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at edu.uhd.armyInventory.server.InventoryServer.<init>(InventoryServer.java:74)
    at edu.uhd.armyInventory.server.InventoryServer.main(InventoryServer.java:110)
    Suppressed: java.net.BindException: Address already in use
        at sun.nio.ch.Net.bind0(Native Method)
        at sun.nio.ch.Net.bind(Net.java:433)
        at sun.nio.ch.Net.bind(Net.java:425)
        at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
        at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
        at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:326)
        at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:80)
        at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:244)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
        at org.eclipse.jetty.server.Server.doStart(Server.java:384)
        ... 3 more
Caused by: javax.servlet.ServletException: org.glassfish.jersey.servlet.ServletContainer-1da51a35@d8bf347==org.glassfish.jersey.servlet.ServletContainer,-1,false
    at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:647)
    at org.eclipse.jetty.servlet.ServletHolder.initialize(ServletHolder.java:405)
    at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:875)
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:346)
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:772)
    at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:259)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132)
    at org.eclipse.jetty.server.Server.start(Server.java:405)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:106)
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61)
    at org.eclipse.jetty.server.Server.doStart(Server.java:372)
    ... 3 more
Caused by: java.lang.ArrayIndexOutOfBoundsException: 207
    at org.objectweb.asm.ClassReader.readUTF(ClassReader.java:1976)
    at org.objectweb.asm.ClassReader.readUTF8(ClassReader.java:1951)
    at org.objectweb.asm.ClassReader.accept(ClassReader.java:515)
    at org.objectweb.asm.ClassReader.accept(ClassReader.java:425)
    at org.glassfish.jersey.server.internal.scanning.AnnotationAcceptingListener.process(AnnotationAcceptingListener.java:167)
    at org.glassfish.jersey.server.ResourceConfig.scanClasses(ResourceConfig.java:850)
    at org.glassfish.jersey.server.ResourceConfig._getClasses(ResourceConfig.java:808)
    at org.glassfish.jersey.server.ResourceConfig.getClasses(ResourceConfig.java:723)
    at org.glassfish.jersey.server.ResourceConfig$RuntimeConfig.<init>(ResourceConfig.java:1120)
    at org.glassfish.jersey.server.ResourceConfig$RuntimeConfig.<init>(ResourceConfig.java:1093)
    at org.glassfish.jersey.server.ResourceConfig.createRuntimeConfig(ResourceConfig.java:1089)
    at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:275)
    at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:262)
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:167)
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:349)
    at javax.servlet.GenericServlet.init(GenericServlet.java:244)
    at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:626)
    ... 14 more
Run Code Online (Sandbox Code Playgroud)

TMB*_*MBT 5

您需要拥有至少9.2.0的Jetty版本并升级到Jersey 2.22.1以获得Java 8功能支持.