2016-07-12 1 views
0

テスト環境で、私はいくつかのアプリケーションで埋め込みjettyを実行しようとしています。アプリケーションはsome-dependencyに依存し、META-INFフォルダにweb-fragemnt.xmlと指定しています。デバッグ時に、私はフラグメントがserver.handler.metadata.webFragments{Roots,NameMap,ResourceMap}の下にロードされているが、server.handler.{filters,servlets}の下で、私はそのフラグメントで宣言されたフィルタやサーブレットが表示されない 私は何をやっている見ることができます組み込みjettyを実行しているときにWebフラグメントをロードする

public static void someMain(...) { 
    server = new Server(port); 
    final WebAppContext context = new WebAppContext(); 
    addFragmentIfExists(context); 
    context.setContextPath("/"); 
    context.setParentLoaderPriority(true); 
    context.setResourceBase(pathToWebapp); 
    server.setHandler(context); 
} 

private void addFragmentIfExists(final WebAppContext context) { 
    final Optional<URL> url = Stream.of(((URLClassLoader) ClassLoader.getSystemClassLoader()).getURLs()) 
      .filter(u -> u.toString().contains("some-dependency")).findFirst(); 
    url.ifPresent(u -> { 
     try { 
      context.getMetaData().addFragment(newResource(u), 
        newResource(new File(u.getPath(), "META-INF/web-fragment.xml"))); 
     } catch (Exception e) { 
      ... 
     } 
    }); 
} 

:私はこのようなフラグメントをロードしようとしています違う? また、フラグメントをロードするためのハックの少ない方法はありますか?私もクラスパスに春のWebフラグメントがあります。クラスパスからロードしようとすると、春のものがロードされます。

答えて

0

WebフラグメントjarをpathToWebapp + "/WEB-INF/lib/"ディレクトリに置き、Web Fragmentsを使用するように設定します。

例:

Server server = new Server(8080); 

    Configuration.ClassList classlist = Configuration.ClassList 
      .setServerDefault(server); 
    classlist.addAfter("org.eclipse.jetty.webapp.FragmentConfiguration", 
      "org.eclipse.jetty.plus.webapp.EnvConfiguration", 
      "org.eclipse.jetty.plus.webapp.PlusConfiguration"); 
    classlist.addBefore(
      "org.eclipse.jetty.webapp.JettyWebXmlConfiguration", 
      "org.eclipse.jetty.annotations.AnnotationConfiguration"); 

    WebAppContext context = new WebAppContext(); 
    context.setContextPath("/"); 
    // ... etc ... 
+0

おかげで、私は、私は、新しいクラスは、ここですべてとにかくロードがある彼らの、なぜ設定クラスの順序を変更する必要があるかわからない、それを試してみましょうか? また、このソリューションは一般的には十分ではありません。これは、戦争形式のときにjarが既にそのディレクトリにあるためですが、IDEでテストを実行すると、フラグメントは依存関係プロジェクトの対象フォルダ内のclassesディレクトリにあります。 – sagioto

+0

私は突堤: '8.1.5.v20120716'私はこれらの設定クラスomを持っていません。クラスパス – sagioto

関連する問題