SparkJava на уровне API до v26 - PullRequest
0 голосов
/ 17 мая 2018

Я написал простой прокси, используя SparkJava 2.3.0 , который использует Jetty 9.4.4.v20170414 . К сожалению, прокси отлично работал на Android 8 (API 26), но не на Android 7 (API 24).

Подсказка, которую я получил, была трассировкой стека:

art  I  Rejecting re-init on previously-failed class java.lang.Class<org.eclipse.jetty.server.Response>: java.lang.NoSuchMethodError: No static method withInitial(Ljava/util/function/Supplier;)Ljava/lang/ThreadLocal; in class Ljava/lang/ThreadLocal; or its super classes (declaration of 'java.lang.ThreadLocal' appears in /system/framework/core-oj.jar)
     I    at void org.eclipse.jetty.server.Response.<clinit>() (Response.java:77)
     I    at void org.eclipse.jetty.server.HttpChannel.<init>(org.eclipse.jetty.server.Connector, org.eclipse.jetty.server.HttpConfiguration, org.eclipse.jetty.io.EndPoint, org.eclipse.jetty.server.HttpTransport) (HttpChannel.java:94)
     I    at void org.eclipse.jetty.server.HttpChannelOverHttp.<init>(org.eclipse.jetty.server.HttpConnection, org.eclipse.jetty.server.Connector, org.eclipse.jetty.server.HttpConfiguration, org.eclipse.jetty.io.EndPoint, org.eclipse.jetty.server.HttpTransport) (HttpChannelOverHttp.java:69)
     I    at org.eclipse.jetty.server.HttpChannelOverHttp org.eclipse.jetty.server.HttpConnection.newHttpChannel() (HttpConnection.java:127)
     I    at void org.eclipse.jetty.server.HttpConnection.<init>(org.eclipse.jetty.server.HttpConfiguration, org.eclipse.jetty.server.Connector, org.eclipse.jetty.io.EndPoint, org.eclipse.jetty.http.HttpCompliance, boolean) (HttpConnection.java:102)
     I    at org.eclipse.jetty.io.Connection org.eclipse.jetty.server.HttpConnectionFactory.newConnection(org.eclipse.jetty.server.Connector, org.eclipse.jetty.io.EndPoint) (HttpConnectionFactory.java:85)
     I    at org.eclipse.jetty.io.Connection org.eclipse.jetty.server.ServerConnector$ServerConnectorManager.newConnection(java.nio.channels.SelectableChannel, org.eclipse.jetty.io.EndPoint, java.lang.Object) (ServerConnector.java:482)
     I    at org.eclipse.jetty.io.EndPoint org.eclipse.jetty.io.ManagedSelector.createEndPoint(java.nio.channels.SelectableChannel, java.nio.channels.SelectionKey) (ManagedSelector.java:420)
     I    at org.eclipse.jetty.io.EndPoint org.eclipse.jetty.io.ManagedSelector.access$1600(org.eclipse.jetty.io.ManagedSelector, java.nio.channels.SelectableChannel, java.nio.channels.SelectionKey) (ManagedSelector.java:61)
     I    at void org.eclipse.jetty.io.ManagedSelector$CreateEndPoint.run() (ManagedSelector.java:599)
     I    at void org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(java.lang.Runnable) (QueuedThreadPool.java:672)
     I    at void org.eclipse.jetty.util.thread.QueuedThreadPool$2.run() (QueuedThreadPool.java:590)
     I    at void java.lang.Thread.run() (Thread.java:761)

Похоже, что Google добавил в API 26 совместимый с Java 8 метод ThreadLocal<S> ThreadLocal.withInitial (Supplier<? extends S> supplier) ( link ), и этот метод используется Jetty.

Есть ли способ использовать SparkJava на Android API до 26? Или используя предыдущую версию Jetty? Я пытался понизить версию SparkJava, но он все еще использовал совершенно новые версии Jetty.

...