Я создал приложение на платформе Netbeans, используя Netbeans 7.0.1 и JDK 1.7.
Я реализовал свое собственное веб-приложение на обычном модуле, используя Embedded Jetty 7.4.5 (состоящий из веб-службы и нескольких сервлетов), и создал модуль библиотечного обертки, включающий все jar-файлы Jetty и "jetty- j2sehttpspi-7.4.5.v20110725.jar ", что мне нужно было иметь возможность публиковать конечную точку веб-службы. Веб-модуль зависит от модуля Jetty.
код, который я использую, это:
System.setProperty("com.sun.net.httpserver.HttpServerProvider",
"org.mortbay.jetty.j2sehttpspi.JettyHttpServerProvider");
server = new Server();
JettyHttpServerProvider.setServer(server);
//We read the config file
String[] configFiles = {"etc/jetty.xml"};
for(String configFile : configFiles) {
XmlConfiguration configuration =
new XmlConfiguration(new File(configFile).toURI().toURL());
configuration.configure(server);
}
// Web Services
QueryWeb qWS = new QueryWeb();
Endpoint.publish("http://0.0.0.0:" +
(server.getConnectors()[0].getPort()) + "/ws", qWS);
// Servlets
HandlerCollection hc = (HandlerCollection)server.getHandler();
ServletContextHandler sch =
new ServletContextHandler(ServletContextHandler.SESSIONS);
sch.setContextPath("/web");
sch.addServlet(stream.class, "/stream");
// We add the servlet handler to the server's context handler collection
// because it's the one used by the Web Service Endpoint
ContextHandlerCollection chc = (ContextHandlerCollection)hc.getHandlers()[0];
chc.addHandler(sch);
server.start();
Когда я пытаюсь запустить приложение, я получаю следующую ошибку после вызова «Endpoint.publish»:
Exiting C:\Program Files (x86)\NetBeans 7.0\harness\run.xml.
Exiting C:\Program Files (x86)\NetBeans 7.0\harness\run.xml.
C:\Program Files (x86)\NetBeans 7.0\harness\suite.xml:500:
The following error occurred while executing this line:
C:\Program Files (x86)\NetBeans 7.0\harness\run.xml:225:
The following error occurred while executing this line:
C:\Program Files (x86)\NetBeans 7.0\harness\run.xml:193:
The application is already running within the test user directory.
You must shut it down before trying to run it again.
Насколько я понимаю, это происходит потому, что система не может найти класс "org.mortbay.jetty.j2sehttpspi.JettyHttpServerProvider". Поэтому по умолчанию он возвращается к веб-серверу, включенному в JDK, что вызывает конфликт, поскольку мы получаем, что оба веб-сервера (Jetty и JDK) пытаются работать на одном и том же порту (в данном случае это 8081).
Единственный способ решить эту проблему - скопировать все файлы jar Jetty в папку JRE "lib / ext" (копирование только файла "jetty-j2sehttpspi-7.4.5.v20110725.jar" не приводит к ошибкам). , но сервер не запустится). Таким образом, система может найти необходимый класс и все его зависимости.
Я предполагаю, что происходит то, что, даже если NetBeans использует собственный загрузчик пути к классам, метод System.setProperty игнорирует это и пытается получить доступ к стандартному пути к классам, а поскольку приложение платформы NetBeans фактически не позволяет вам изменять Непосредственно по classpath (это превосходило бы цели администрирования модулей платформой NetBeans), я не знаю, как заставить его использовать библиотеку, включенную в модуль оболочки.
Я могу продолжать разработку приложения с помощью временного решения, которое я нашел, но, честно говоря, копирование содержимого в папки JRE не является приемлемым решением и в конечном итоге приведет к проблемам с распространением и установкой на клиентских компьютерах (уже пробовал в Mac OS машина, и я даже не знал, где JRE хранит свои библиотеки, чтобы попытаться сделать тот же самый грязный трюк).
Поэтому я хочу спросить вас, ребята, есть ли какое-либо решение этой конкретной проблемы или у кого-нибудь есть лучшее объяснение того, что происходит и как я мог бы это исправить, без необходимости воссоздавать всю архитектуру моего проекта (что на самом деле работает Хорошо, за исключением этого немного неудобно).
Заранее спасибо!