运行嵌入式jetty时加载Web片段

时间:2016-07-12 08:28:29

标签: java jetty embedded-jetty

在测试环境中,我正在尝试使用某些应用程序运行嵌入式码头。该应用程序取决于some-dependency,它在web-fragemnt.xml文件夹中指定了META-INF。我正在尝试像这样加载片段:

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) {
            ...
        }
    });
}

调试时我可以看到片段是在server.handler.metadata.webFragments{Roots,NameMap,ResourceMap}下加载但在server.handler.{filters,servlets}下我看不到在该片段中声明的过滤器和servlet 我究竟做错了什么? 另外,加载片段是否有一种不太常见的方式?我在类路径中也有一个spring web-fragment,所以如果我只是尝试从classpath加载它加载spring one

1 个答案:

答案 0 :(得分:0)

将网络片段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 ...