Я пытаюсь запустить сервер веб-сервера 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 webapp, вы можете просто использовать 'WebAppContext.setParentLoaderPriority (true)' и практически исключить свой каталог 'WEB-INF/lib'. –
Его хорошее предложение, и я попробовал это первым. Но это, как и addSystemClasses() и т. Д., Описанное здесь, http://wiki.eclipse.org/Jetty/Reference/Jetty_Classloading не решило проблему. На каждом шагу я столкнулся с исключениями NoClassDefFound и ClassNotFound. Что-то о websocket и о том, как он охватывает cometd webapp и контейнер причала делает это сложно по какой-то причине. –