Я написал простой прокси, используя 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.