Netbeans 7.0.1 と JDK 1.7 を使用して、Netbeans プラットフォーム アプリケーションを作成しました。
Embedded Jetty 7.4.5 (Web サービスといくつかのサーブレットで構成される) を使用して通常のモジュールに独自の 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がどこにライブラリを保持しているのかさえ知りませんでした)。
したがって、この特定の問題に対する解決策があるかどうか、または何が起こっているのか、プロジェクトのアーキテクチャ全体を再作成せずに修正する方法について誰かがより良い説明を持っているかどうかを皆さんに尋ねたいと思います (これは実際には問題なく動作しますが、これは少し不便です)。
前もって感謝します!