2013-09-09 4 views
4

Я пытаюсь запустить сервер веб-сервера Cometd во время собственной войны, которая запускает причал 8.1.12 во встроенном режиме. Я в состоянии запустить все другие веб-приложения, таким образом, но для случая WebSocket я получаю эту ошибку:Как исправить NPE во время WebSocketFactory.upgrade() на встроенном Jetty 8.1.12

java.lang.NullPointerException 
at org.eclipse.jetty.websocket.WebSocketFactory.upgrade(WebSocketFactory.java:238) 
at org.eclipse.jetty.websocket.WebSocketFactory.acceptWebSocket(WebSocketFactory.java:396) 
at org.cometd.websocket.server.WebSocketTransport.handle(WebSocketTransport.java:157) 
at org.cometd.server.CometdServlet.service(CometdServlet.java:166) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848) 
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:686) 

Я прочитал все другие должности, и я думаю, что это по-другому.

У меня есть 2 проекта maven, в котором построен кувшин uber, содержащий причал-сервер 8.1.12, с использованием плагина maven-shades, а другой, который включает эту первую банку в качестве военного наложения. Наложение помещает все классы причал-сервер в корень войны, поэтому его можно запустить с помощью «java -jar my.war». Поскольку Cometd также нуждается в причале для веб-карт, я сделал двойной уверен, что все зависимости и банки в каталоге WEB-INF/lib все равно 8.1.12. Таким образом, всего один сервер и его причал 8.1.12. Все остальные сообщения/вопросы связаны с контейнером, не связанным с транспортом или не-websocket, или с не-http-соединением, но это 100% -ый причал 8.1.12, и webapp отлично работает при развертывании с автономным внешним приложением 8.1.12.

Зависимости для uberjar от Maven-оттенков (для встраиваемых молов себя ех войны)

[INFO] com.pgi.pulsar:pulsar-container:jar:1.0-SNAPSHOT 
[INFO] +- org.eclipse.jetty:jetty-server:jar:8.1.12.v20130726:compile 
[INFO] | +- org.eclipse.jetty.orbit:javax.servlet:jar:3.0.0.v201112011016:compile 
[INFO] | +- org.eclipse.jetty:jetty-continuation:jar:8.1.12.v20130726:compile 
[INFO] | \- org.eclipse.jetty:jetty-http:jar:8.1.12.v20130726:compile 
[INFO] |  \- org.eclipse.jetty:jetty-io:jar:8.1.12.v20130726:compile 
[INFO] +- org.eclipse.jetty:jetty-servlet:jar:8.1.12.v20130726:compile 
[INFO] | \- org.eclipse.jetty:jetty-security:jar:8.1.12.v20130726:compile 
[INFO] +- org.eclipse.jetty:jetty-webapp:jar:8.1.12.v20130726:compile 
[INFO] | \- org.eclipse.jetty:jetty-xml:jar:8.1.12.v20130726:compile 
[INFO] +- org.eclipse.jetty:jetty-servlets:jar:8.1.12.v20130726:compile 
[INFO] | +- org.eclipse.jetty:jetty-client:jar:8.1.12.v20130726:compile 
[INFO] | \- org.eclipse.jetty:jetty-util:jar:8.1.12.v20130726:compile 
[INFO] \- junit:junit:jar:4.8.2:test 

Вот код для запуска встроенного причала:

public class Main { 

public static void main(String[] args) throws Exception { 
    Server server = new Server(); 
    SocketConnector connector = new SocketConnector(); 
    connector.setMaxIdleTime(1000 * 60 * 60); 
    connector.setSoLingerTime(-1); 
    String portValue = System.getProperty("pulsar.port"); 
    int port = (portValue != null ? Integer.parseInt(portValue) : 8080); 
    connector.setPort(port); 
    server.setConnectors(new Connector[]{connector}); 
    WebAppContext context = new WebAppContext(); 
    context.setServer(server); 
    context.setContextPath("/"); 

    ProtectionDomain protectionDomain = Main.class.getProtectionDomain(); 
    URL location = protectionDomain.getCodeSource().getLocation(); 
    context.setWar(location.toExternalForm()); 

    server.setHandler(context); 
    server.start(); 
    System.in.read(); 
    server.stop(); 
    server.join(); 

The LIBS в вебе-приложении WEB-INF/libs:

jar tvf target/pulsar-websockets-1.0-SNAPSHOT.war | grep WEB-INF/lib/jetty | cut -b 36-100 
WEB-INF/lib/jetty-client-8.1.12.v20130726.jar 
WEB-INF/lib/jetty-continuation-8.1.12.v20130726.jar 
WEB-INF/lib/jetty-http-8.1.12.v20130726.jar 
WEB-INF/lib/jetty-io-8.1.12.v20130726.jar 
WEB-INF/lib/jetty-jmx-8.1.12.v20130726.jar 
WEB-INF/lib/jetty-server-8.1.12.v20130726.jar 
WEB-INF/lib/jetty-util-8.1.12.v20130726.jar 
WEB-INF/lib/jetty-websocket-8.1.12.v20130726.jar 
WEB-INF/lib/jetty-xml-8.1.12.v20130726.jar 

Проблема в том, что проблема может быть связана с проблемой загрузки класса b между классами причалов, такими как HttpConnection (я прочитал сообщение о HttpConnection-ThreadLocal и osgi), которые совместно используются webapp и приложением причального сервера. Эти классы фактически находятся в обоих местах, но я не могу найти способ их разделить, поскольку они необходимы в обоих местах.

Возможно, есть способ иметь причал, чтобы его классы, загруженные классом, с помощью загрузчика классов Webapp? На данный момент у меня закончились идеи и я не знаю, что я могу попробовать дальше. Что я могу сделать, чтобы заставить это работать?

ответ

1

Получил его работу. После сравнения точных различий между внешним сервером причала, который работает, и встроенной конфигурацией, я смог заставить это работать. Это потребовало небольшого проб и ошибок, и это не совсем очевидно, поэтому я делюсь тем, что я сделал для других.

Во-первых, только молы баночка мне нужна в WEB-INF/Lib это одна:

jetty-util-8.1.12.v20130726.jar 

Все остальные я в снаружи для встроенного контейнера. Несмотря на то, что эта банка присутствовала в пути к классам серверов, приложение не загружалось. Единственный способ, которым это будет работать, - это добавить только эту банку в каталог/lib. Это привело меня к следующей ошибке:

java.lang.IllegalStateException: Websockets not supported on blocking connectors 
    at org.eclipse.jetty.websocket.WebSocketFactory.upgrade(WebSocketFactory.java:237) 
    at org.eclipse.jetty.websocket.WebSocketFactory.acceptWebSocket(WebSocketFactory.java:396) 
    at org.cometd.websocket.server.WebSocketTransport.handle(WebSocketTransport.java:157) 

Заметим, что она проходит мимо NPE, что является прогрессом. Итак, глядя на лог-линии в другом рабочем сервере молов, и немного чтения на неблокируемых соединителях, я использовал этот разъем вместо SocketConector:

import org.eclipse.jetty.server.nio.SelectChannelConnector; 
. . . 
SelectChannelConnector connector = new SelectChannelConnector(); 

Этих две очень простые изменения у меня и Бег.

+0

Также обратите внимание, что если вы делаете все с встроенного причала с помощью 1 webapp, вы можете просто использовать 'WebAppContext.setParentLoaderPriority (true)' и практически исключить свой каталог 'WEB-INF/lib'. –

+0

Его хорошее предложение, и я попробовал это первым. Но это, как и addSystemClasses() и т. Д., Описанное здесь, http://wiki.eclipse.org/Jetty/Reference/Jetty_Classloading не решило проблему. На каждом шагу я столкнулся с исключениями NoClassDefFound и ClassNotFound. Что-то о websocket и о том, как он охватывает cometd webapp и контейнер причала делает это сложно по какой-то причине. –

0

У меня была та же проблема, приложение, которое я пытаюсь построить, опираясь на atmosphere И я запускал приложение под Jetty-9.

Я нашел Jetty банки в war/WEB-INF/lib являются:

jetty-continuation-7.6.7.v20120910.jar jetty-http-7.6.7.v20120910.jar jetty-io-7.6.7.v20120910.jar jetty-security-7.6.7.v20120910.jar jetty-server-7.6.7.v20120910.jar jetty-servlet-7.6.7.v20120910.jar jetty-util-7.6.7.v20120910.jar jetty-websocket-7.6.7.v20120910.jar

я перешел на Jetty-8 и проблема исчезла.