#java #eclipse #maven #jetty #cxf
#java #затмение #мавен #причал #cxf
Вопрос:
Я столкнулся со странной ситуацией.
В очень грязном проекте (типичный сценарий плохой практики вообще), который, очевидно, я не могу сильно изменить, я работаю над своим проектом дочернего модуля (на данный момент не полностью созданным и запрограммированным мной, просто назначена некоторая задача кодирования для выполнения в нем), который имеет массу родительских зависимости.
Поскольку мне нужен сервер Jetty (Jetty 8), я добавил его в свой pom, а также пакет cxf, который, казалось, был необходим.
Проект работает нормально, если я поставлю:
<dependencies>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>8.2.0.v20160908</version>
</dependency>
<!-- -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-bundle</artifactId>
<version>2.6.8</version>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
...
Пожалуйста, обратите внимание, что я выбрал эту пристань, так как должна быть последняя зависимость Jetty 8 от Central (почему jetty 8? Я работаю с JDK 1.7 …), и пакет cxf берется немного случайным образом: я попытался выбрать версию cxf, которая была бы временной, близкой к Jetty.
Исключения cxf-bundle существуют, поскольку без них он больше не будет компилироваться.
Таким образом, когда Джетти проснется, я смогу сделать:
Конечная точка.опубликовать(«http://localhost:1243/test «, новый MyWsTestClassImpl());
…и все работает.
Но, если я помещу эти зависимости непосредственно перед включающим </dependencies>
тегом, я получу:
java.lang.NoSuchMethodError: org.apache.cxf.transport.http_jetty.JettyHTTPDestination.setupMessage(Lorg/apache/cxf/message/Message;Ljavax/servlet/ServletContext;Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V
at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.serviceRequest(JettyHTTPDestination.java:338) ~[cxf-bundle-2.6.8.jar:2.6.8]
at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(JettyHTTPDestination.java:312) ~[cxf-bundle-2.6.8.jar:2.6.8]
at org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(JettyHTTPHandler.java:72) ~[cxf-bundle-2.6.8.jar:2.6.8]
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1088) ~[jetty-server-8.2.0.v20160908.jar:8.2.0.v20160908]
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1024) ~[jetty-server-8.2.0.v20160908.jar:8.2.0.v20160908]
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135) ~[jetty-server-8.2.0.v20160908.jar:8.2.0.v20160908]
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255) ~[jetty-server-8.2.0.v20160908.jar:8.2.0.v20160908]
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) ~[jetty-server-8.2.0.v20160908.jar:8.2.0.v20160908]
at org.eclipse.jetty.server.Server.handle(Server.java:366) ~[jetty-server-8.2.0.v20160908.jar:8.2.0.v20160908]
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494) [jetty-server-8.2.0.v20160908.jar:8.2.0.v20160908]
at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:973) [jetty-server-8.2.0.v20160908.jar:8.2.0.v20160908]
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1035) [jetty-server-8.2.0.v20160908.jar:8.2.0.v20160908]
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:641) [jetty-http-8.2.0.v20160908.jar:8.2.0.v20160908]
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:231) [jetty-http-8.2.0.v20160908.jar:8.2.0.v20160908]
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82) [jetty-server-8.2.0.v20160908.jar:8.2.0.v20160908]
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696) [jetty-io-8.2.0.v20160908.jar:8.2.0.v20160908]
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53) [jetty-io-8.2.0.v20160908.jar:8.2.0.v20160908]
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) [jetty-util-8.2.0.v20160908.jar:8.2.0.v20160908]
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) [jetty-util-8.2.0.v20160908.jar:8.2.0.v20160908]
at java.lang.Thread.run(Thread.java:745) [na:1.7.0_79]
Я обнаружил, что этот метод будет находиться в другой библиотеке cxf, которая:
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>2.6.8</version>
</dependency>
Но даже если я добавлю это, я получу тот же старый стек.
Поскольку я немного боюсь такого рода проектов-монстров, и я твердо убежден, что программист должен знать, что происходит, я решил разобраться с вами в этой проблеме, поскольку у меня пока нет решения.
Комментарии:
1. Jetty 8 — это EOL (конец срока службы) , рассмотрите возможность обновления. даже для Jetty 9.2.x (который все еще находится на Java 7)
2. wiki.eclipse.org/Jetty/Starting/Jetty_Version_Comparison_Table Здесь указано 1.8 для причала 9
3. Перейдите по ссылке в большом красном предупреждении вверху, которая сообщает вам wiki.eclipse.org устарел. eclipse.org/jetty/documentation/current/what-jetty-version.html
4. Боже мой, ты прав. Я думал, что это будет бесполезно, поскольку реклама jdk на этой странице не будет отличаться …!! Я попробую новый причал и сообщу…