在测试环境中,我正在尝试使用某些应用程序运行嵌入式码头。该应用程序取决于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
答案 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 ...