2

我使用 Netbeans 7.0.1 和 JDK 1.7 创建了一个 Netbeans 平台应用程序。

我使用 Embedded Jetty 7.4.5(由一个 Web 服务和几个 servlet 组成)在一个普通模块上实现了我自己的 Web 应用程序,并创建了一个库包装模块,包括所有 Jetty jar 文件和“jetty-j2sehttpspi-7.4 .5.v20110725.jar”,我需要能够发布 Web 服务的端点。Web 模块依赖于 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 中包含的 Web 服务器,这会导致冲突,因为我们让两个 Web 服务器(Jetty 和 JDK)都试图在同一个端口(在本例中为 8081)上运行。

我设法解决此问题的唯一方法是将所有 Jetty jar 文件复制到 JRE 的“lib/ext”文件夹中(仅复制“jetty-j2sehttpspi-7.4.5.v20110725.jar”不会导致错误,但是服务器无法启动)。通过这种方式,系统可以找到它需要的类及其所有依赖项。

我想发生的事情是,即使 NetBeans 使用它自己的类路径加载器,System.setProperty 方法也会忽略这一点并尝试访问标准类路径,并且因为 NetBeans 平台应用程序实际上并不允许您直接更改类路径(这将打破由 NetBeans 平台管理模块的全部目的),我真的不知道如何使它使用包装模块中包含的库。

我可以使用我找到的临时解决方案继续开发应用程序,但老实说,将内容复制到 JRE 文件夹中不是一个可接受的解决方案,最终会导致客户端机器的分发和安装问题(我已经在 Mac OS 机器上尝试过)甚至不知道 JRE 将它的库保存在哪里来尝试做同样的肮脏把戏)。

因此,我想问你们是否有任何解决这个特定问题的方法,或者是否有人对正在发生的事情有更好的解释以及我可以如何解决它而不必重新创建我的项目的整个架构(实际上工作正常,除了这个有点不方便)。

提前致谢!

4

1 回答 1

0

将您的问题写到邮件列表 dev@platform.netbeans.org,您更有可能得到答案。

于 2011-09-04T07:52:22.327 回答