如何使Jetty在OSGi中运行时加载webdefault.xml?
我在一个OSGi容器中运行了Jetty 8.1.12服务器,这要感谢jetty-osgi-boot,如Jetty 8和Jetty 9文档中所述
我想配置默认的webapp描述符( etc/webdefault.xml
)。 当我定义jetty.home
,jetty拿起etc/jetty.xml
但它不加载etc/webdefault.xml
我不想依赖配置包(通过jetty.home.bundle
系统属性),因为我希望配置可以轻松修改。
我不想依靠Jetty-defaultWebXmlFilePath
MANIFEST标头出于同样的原因,再加上它会将我的webapp绑定到码头。
jetty-osgi-boot软件包包含一个jetty-deployer.xml
配置文件,其中包含这个注释掉的块:
<!-- Providers of OSGi Apps -->
<Call name="addAppProvider">
<Arg>
<New class="org.eclipse.jetty.osgi.boot.OSGiAppProvider">
<Set name="defaultsDescriptor"><Property name="jetty.home" default="."/>/etc/webdefault.xml</Set>
...
这不起作用,因为OSGiAppProvider
类不再存在。
有没有其他方法来配置webdefaults.xml文件位置?
简短的回答:我不能让jetty 8.1.12来加载OSGi下的webdefaults.xml。
经过数小时的谷歌搜索,源代码阅读和调试,我得出了以下结论:
Jetty-defaultWebXmlFilePath
MANIFEST标头未按预期工作。 它无法解析绑定入口路径,只能解析绝对文件系统路径。 绝对FS路径不是一个现实的选择。
很多配置在ServerInstanceWrapper
和BundleWebAppProvider
硬编码中,所以我们不能配置默认描述符的位置。 此位置结束为默认值,即IIRC, org/eclipse/jetty/webapp/webdefault.xml
。
我采取了修补jetty-osgi的方式,以便它可以读取一些配置并将其应用于BundleWebAppProvider
。 FWIW这个黑客可以在github上找到
上一篇: How to make Jetty load webdefault.xml when it runs in OSGi?