2

ここに簡単な質問があります:別のプロジェクトから桟橋が埋め込まれたWebアプリを起動することは可能ですか? 次のコードを(JUnitで)実行しようとしています:

Server server = new Server(80);
WebAppContext context = new WebAppContext();
File webXml = new File("../Project1/src/main/webapp/WEB-INF/web.xml");
context.setDescriptor(webXml.getAbsolutePath());
context.setResourceBase("../Project1/src/main/webapp");
context.setContextPath("/");
context.setParentLoaderPriority(false);
server.setHandler(context);
server.start();

別のプロジェクト、たとえば Project2 からこれを行うと、jetty は多くの例外をスローします。 xml.ws.transport.http.servlet.WSSpringServlet

Project1 を Project の 2 クラスパスに追加しようとしましたが、これは状況を改善しません。同じ Project1 内で同じものを実行しようとすると (もちろん、すべてのパスを調整して)、すべて正常に動作します。

ご協力ありがとうございました。

4

2 に答える 2

0

これは、相対パス文字列が原因である可能性があります。

これもJUnit Assertを使用した代替アプローチです...

    Server server = new Server(80);
    WebAppContext context = new WebAppContext();
    File otherProject = new File("../Project1");
    Assert.assertTrue("Project1 should exist", otherProject.exists());

    // make path reference canonical (eliminate the relative path reference)
    otherProject = otherProject.getCanonicalFile();
    File webAppDir = new File(otherProject, "src/main/webapp");
    Assert.assertTrue("Webapp dir should exist", webAppDir.exists());
    File webXml = new File(webAppDir, "WEB-INF/web.xml");
    Assert.assertTrue("web.xml should exist", webXml.exists());

    context.setDescriptor(webXml.getAbsolutePath());
    context.setResourceBase(webAppDir.getAbsolutePath());
    context.setContextPath("/");
    context.setParentLoaderPriority(false);
    server.setHandler(context);
    server.start();

または、../Project1/src/main/webapp/WEB-INF/lib必要な依存関係がないことが原因である可能性があります。WebAppContext はWEB-INF/lib最初に提供されたコンテンツを使用し、次にサーバー クラスパスを使用するため、これは重要です。

于 2013-05-14T14:59:14.243 に答える