我们正在努力解决从文件系统中的某个位置但在 Web 应用程序之外提供静态文件的简单问题,但我们无法让它运行。
有很多关于如何做到这一点的例子,但它们似乎都不起作用,到目前为止,我们无法从某人那里找到它确实有效的确认。
在 etc 目录中找到的 jetty.xml 已被编辑,如此处所述 https://ops4j1.jira.com/wiki/display/paxweb/Advanced+Jetty+Configuration 或此处 ops4j GitHub 示例
所以添加到 jetty.xml 这个:
<Get name="handler">
<Call name="addHandler">
<Arg>
<New class="org.eclipse.jetty.servlet.ServletContextHandler">
<Set name="contextPath">/fileserver</Set>
<Set name="resourceBase">/Users/Shared/testenv</Set>
<Call name="addServlet">
<Arg>org.eclipse.jetty.servlet.DefaultServlet</Arg>
<Arg>/</Arg>
</Call>
</New>
</Arg>
</Call>
</Get>
或这个:
<Get name="handler">
<Call name="addHandler">
<Arg>
<New class="org.eclipse.jetty.server.handler.ContextHandler">
<Set name="contextPath">/fileserver</Set>
<Set name="handler">
<New class="org.eclipse.jetty.server.handler.ResourceHandler">
<Set name="resourceBase">/Users/Shared/testenv</Set>
<Set name="directoriesListed">true</Set>
</New>
</Set>
</New>
</Arg>
</Call>
</Get>
使用这两个版本的 jetty / karaf 启动正常,当 karaf 关闭时,我可以看到
2015-06-02 12:02:57,838 | 信息 | 池 7 线程 2 | 上下文处理程序
| 113 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.15.v20140411 | 停止 oejsServletContextHandler{/fileserver,file:/Users/Shared/testenv/}
但是文件不在 localhost:8181/fileserver 下提供
它工作的唯一方法(在新安装的 karaf 容器中)是使用
<Set name="handler">
<New class="org.eclipse.jetty.server.handler.HandlerList">
<Set name="handlers">
<Array type="org.eclipse.jetty.server.Handler">
<Item>
<New class="org.eclipse.jetty.servlet.ServletContextHandler">
<Set name="contextPath">/fileserver</Set>
<Set name="resourceBase">/Users/Shared/testenv</Set>
<Call name="addServlet">
<Arg>org.eclipse.jetty.servlet.DefaultServlet</Arg>
<Arg>/</Arg>
</Call>
</New>
</Item>
</Array>
</Set>
</New>
</Set>
但是这样做会破坏在 karaf 中运行的其他 Web 应用程序。例如,我们正在使用 Camel Servlet 组件。
那么是否有人通过karaf中的码头实例提供静态文件的工作配置,或者现在如何做到这一点?
任何帮助表示赞赏。预先感谢!
顺便说一句:使用 Karaf 3.0.3
编辑:
我使用 Achim 给出的代码片段重新运行测试并启用 DEBUG 登录。
2015-06-03 15:33:25,492 | 调试 | 池 6 线程 1 | XML配置 | 71 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.15.v20140411 | XML oejshContextHandler{/,null}.setContextPath(/static-content) 2015-06-03 15:33:25,527 | 调试 | 池 6 线程 1 | XML配置 | 71 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.15.v20140411 | XML oejshContextHandler{/static-content,null}.setHandler(org.eclipse.jetty.server.handler.ResourceHandler@3855ace4) 2015-06-03 15:33:25,529 | 调试 | 池 6 线程 1 | 集装箱
| 71 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.15.v20140411 | 容器 oejshContextHandler{/static-content,null} + org.eclipse.jetty.server.handler.ResourceHandler@3855ace4 作为处理程序 2015-06-03 15:33:25,529 | 调试 | 池 6 线程 1 | 容器
| 71 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.15.v20140411 | 容器 org.ops4j.pax.web.service.jetty.internal.JettyServerHandlerCollection@6665534e + oejshContextHandler{/static-content,null} 作为处理程序 2015-06-03 15:33:25,542 | 调试 | 池 6 线程 1 | 抽象生命周期
| 71 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.15.v20140411 | 开始 oejshContextHandler{/static-content,null} 2015-06-03 15:33:25,542 | 调试 | 池 6 线程 1 | 抽象处理程序
| 71 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.15.v20140411 | 开始 oejshContextHandler{/static-content,null} 2015-06-03 15:33:25,543 | 调试 | 池 6 线程 1 | 抽象生命周期
| 71 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.15.v20140411 | 开始 oejshContextHandler{/static-content,null} 2015-06-03 15:34:27,974 | 调试 | /静态内容 | 服务器
| 71 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.15.v20140411 | 在 AsyncHttpConnection@638f2d20,g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=-5,l=10,c=0 上请求 /static-content },r=1 2015-06-03 15:34:27,974 | 调试 | /静态内容 | 服务器型号
| 78 - org.ops4j.pax.web.pax-web-spi - 3.1.4 | 匹配 [/static-content]... 2015-06-03 15:34:27,975 | 调试 | /静态内容 | 服务器型号 | 78 - org.ops4j.pax.web.pax-web-spi - 3.1.4 | 路径 [/static-content] 不匹配任何上下文 2015-06-03 15:34:27,975 | 调试 | /静态内容 | 服务器 | 71 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.15.v20140411 | 响应/静态内容 200 处理=假
在这里,我注意到获取版本(不工作)和设置版本(工作)之间的区别。
Set 设置类org.eclipse.jetty.server.handler.HandlerList
Get 获取并添加到类org.ops4j.pax.web.service.jetty.internal.JettyServerHandlerCollection
中,描述为
在执行基于子字符串的请求路径与注册别名的匹配之后,仅调用与请求路径匹配的处理程序 (=context) 的 Jetty 处理程序集合
别名可能有问题吗?
编辑2:
我试图深入研究这个,但我真的无法让它工作。我不知道集成测试和常规 karaf 之间的区别,但肯定有问题。要重现此问题,只需使用一个新的 karaf (3.0.3) 容器,feature:install war
然后将代码段添加到 etc/jetty.xml,使其看起来像这样,然后编辑 resourceBase 的路径,使其与本地路径匹配。
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//
DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
<Configure class="org.eclipse.jetty.server.Server">
<!-- =========================================================== -->
<!-- Set connectors -->
<!-- =========================================================== -->
<!-- One of each type! -->
<!-- =========================================================== -->
<!-- Use this connector for many frequently idle connections and for
threadless continuations. -->
<Call name="addConnector">
<Arg>
<New class="org.eclipse.jetty.server.nio.SelectChannelConnector">
<Set name="host">
<Property name="jetty.host" />
</Set>
<Set name="port">
<Property name="jetty.port" default="8181" />
</Set>
<Set name="maxIdleTime">300000</Set>
<Set name="Acceptors">2</Set>
<Set name="statsOn">false</Set>
<Set name="confidentialPort">8443</Set>
<Set name="lowResourcesConnections">20000</Set>
<Set name="lowResourcesMaxIdleTime">5000</Set>
</New>
</Arg>
</Call>
<!-- =========================================================== -->
<!-- Configure Authentication Realms -->
<!-- Realms may be configured for the entire server here, or -->
<!-- they can be configured for a specific web app in a context -->
<!-- configuration (see $(jetty.home)/contexts/test.xml for an -->
<!-- example). -->
<!-- =========================================================== -->
<Call name="addBean">
<Arg>
<New class="org.eclipse.jetty.plus.jaas.JAASLoginService">
<Set name="name">karaf</Set>
<Set name="loginModuleName">karaf</Set>
<Set name="roleClassNames">
<Array type="java.lang.String">
<Item>org.apache.karaf.jaas.boot.principal.RolePrincipal
</Item>
</Array>
</Set>
</New>
</Arg>
</Call>
<Call name="addBean">
<Arg>
<New class="org.eclipse.jetty.plus.jaas.JAASLoginService">
<Set name="name">default</Set>
<Set name="loginModuleName">karaf</Set>
<Set name="roleClassNames">
<Array type="java.lang.String">
<Item>org.apache.karaf.jaas.boot.principal.RolePrincipal
</Item>
</Array>
</Set>
</New>
</Arg>
</Call>
<Get name="handler">
<Call name="addHandler">
<Arg>
<New class="org.eclipse.jetty.server.handler.ContextHandler">
<Set name="contextPath">/static-content</Set>
<Set name="handler">
<New class="org.eclipse.jetty.server.handler.ResourceHandler">
<Set name="resourceBase">/Users/Shared/testenv/in</Set>
<Set name="directoriesListed">true</Set>
</New>
</Set>
</New>
</Arg>
</Call>
</Get>
</Configure>
尝试使用 localhost:8181/static-content 通过浏览器访问上下文。
结果始终为 404 - 未找到。
我们已经在多个运行 linux 和 windows 的系统上进行了尝试。