问题描述
我有一个带有嵌入式码头服务器的应用程序,我正在这样启动(放置在main()中,并使用eclipse启动)
Server server = new Server(port);
WebAppContext context = new WebAppContext();
context.setResourceBase("web/");
context.setDescriptor("web/WEB-INF/web.xml");
context.setConfigurations(new Configuration[]{
new AnnotationConfiguration(),new WebXmlConfiguration(),new WebInfConfiguration(),new TagLibConfiguration(),new PlusConfiguration(),new MetaInfConfiguration(),new FragmentConfiguration(),new EnvConfiguration()});
context.setcontextpath("/");
context.setParentLoaderPriority(true);
context.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",".*/classes/.*");
URL classes = Main.class
.getProtectionDomain()
.getCodeSource()
.getLocation();
URL url = Main.class.getResource("/packageX/packageY/");
context.getMetaData().setWebInfClassesDirs(Arrays.asList(Resource.newResource(classes)));
//If i replace classes with url it can't find annotated filters or listeners.
//context.getMetaData().setWebInfClassesDirs(Arrays.asList(Resource.newResource(url)));
server.setHandler(context);
server.start();
server.join();
上面的代码运行正常,但是它扫描了我的胖子罐中的所有软件包,这很耗时。因此,我想通过提供用于搜索的包路径来缩小搜索空间,但此后它找不到任何带注释的类。我在这里做什么错了?
解决方法
这两个属性...
-
org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern
用于控制扫描哪些容器JAR。 -
org.eclipse.jetty.server.webapp.WebInfIncludeJarPattern
用于控制要扫描哪些WebApp JAR。
..仅适用于JAR级别。拥有真正的uber-jar kinda会使这两个配置都没有意义。
您是否考虑过将uber-jar变成一场实战?并更好地将容器部分和Webapp部分分开?
请参阅:https://github.com/jetty-project/embedded-jetty-live-war
您还可以在构建时对字节码/注释可扫描组件进行预先计算,并通过特殊的WebAppContext
组件加载QuickStartWebApp
,而在嵌入时完全跳过注释扫描步骤。 / p>
请参阅:https://www.eclipse.org/jetty/documentation/current/quickstart-webapp.html