3

我们正在努力解决从文件系统中的某个位置但在 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 的系统上进行了尝试。

4

3 回答 3

1

该问题可能与 pax-web 版本有关。在 Karaf 3.0.5 中,它使用我读过的 Pax-web 3.2.6 版本(抱歉我找不到链接)有一个与提供静态内容相关的错误。

我已经在 Karaf 4.0.3 (Pax-web 4.2.3) 中测试了@Achim 的方法,它就像魅力一样。

于 2015-11-19T15:59:43.310 回答
0

实际上,您已经在样本中找到了它,这是最好的方法。从这个集成测试可以看出它正在工作。

所以请确保你有它:

<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">target/logs</Set>
                        <Set name="directoriesListed">true</Set>
                    </New>
                </Set>
            </New>
        </Arg>
    </Call>
</Get>
于 2015-06-03T11:09:27.250 回答
0

我也无法让它工作。使用新下载的 Karaf 3.0.5:

$ cd /tmp
$ tar xzf ~/Downloads/apache-karaf-3.0.5.tar.gz 
$ ./apache-karaf-3.0.5/bin/karaf 
        __ __                  ____      
       / //_/____ __________ _/ __/      
      / ,<  / __ `/ ___/ __ `/ /_        
     / /| |/ /_/ / /  / /_/ / __/        
    /_/ |_|\__,_/_/   \__,_/_/         

  Apache Karaf (3.0.5)

Hit '<tab>' for a list of available commands
and '[cmd] --help' for help on a specific command.
Hit '<ctrl-d>' or type 'system:shutdown' or 'logout' to shutdown Karaf.

karaf@root()> 

检查是否还有任何东西:

$ curl http://localhost:8181/
curl: (7) Failed to connect to localhost port 8181: Connection refused

好的。还没有码头。

安装 pax 网络

karaf@root()> feature:repo-add mvn:org.ops4j.pax.web/pax-web-features/2.1.0/xml/features
Adding feature url mvn:org.ops4j.pax.web/pax-web-features/2.1.0/xml/features
karaf@root()> feature:install pax-jetty
karaf@root()> feature:install http

用 curl 再次检查

$ curl http://localhost:8181/
...
<h2>HTTP ERROR: 404</h2>
<hr /><i><small>Powered by Jetty://</small></i>
...

好的。码头还活着。

将 ResourceHandler 添加到 apache-karaf-3.0.5/etc/jetty.xml

<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">/tmp</Set>
                        <Set name="directoriesListed">true</Set>
                    </New>
                </Set>
            </New>
        </Arg>
    </Call>
</Get>

curl 仍然看到 404:

$ curl http://localhost:8181/
...
<h2>HTTP ERROR: 404</h2>
...

不确定我需要重新启动任何东西。无论如何,我重新启动整个 Karaf。

两个卷发都给出 404:

$ curl http://localhost:8181/
$ curl http://localhost:8181/static-content

在 apache-karaf-3.0.5/etc/org.ops4j.pax.logging.cfg 中启用 DEBUG 日志记录

log4j.rootLogger=DEBUG, out, osgi:*

curl 仍然为http://localhost:8181/static-content获得 404 ,并且 karaf.log 说:

2015-11-14 12:57:00,938 | DEBUG | 673-63 Selector0 | nio                              | 70 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.17.v20150415 | created SCEP@5b87b8b7{l(/127.0.0.1:46304)<->r(/127.0.0.1:8181),s=0,open=true,ishut=false,oshut=false,rb=false,wb=false,w=true,i=0}-{AsyncHttpConnection@21d1b60b,g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=-14,l=0,c=0},r=0}
2015-11-14 12:57:00,939 | DEBUG | qtp425678673-70  | HttpParser                       | 70 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.17.v20150415 | filled 92/92
2015-11-14 12:57:00,939 | DEBUG |  /static-content | Server                           | 70 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.17.v20150415 | REQUEST /static-content on AsyncHttpConnection@21d1b60b,g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=-5,l=3,c=0},r=1
2015-11-14 12:57:00,940 | DEBUG |  /static-content | ServerModel                      | 77 - org.ops4j.pax.web.pax-web-spi - 3.2.6 | Matching [/static-content]...
2015-11-14 12:57:00,940 | DEBUG |  /static-content | ServerModel                      | 77 - org.ops4j.pax.web.pax-web-spi - 3.2.6 | Path [/static-content] does not match any context
2015-11-14 12:57:00,940 | DEBUG |  /static-content | Server                           | 70 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.17.v20150415 | RESPONSE /static-content  200 handled=false
2015-11-14 12:57:00,940 | DEBUG | qtp425678673-70  | AsyncHttpConnection              | 70 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.17.v20150415 | Enabled read interest SCEP@5b87b8b7{l(/127.0.0.1:46304)<->r(/127.0.0.1:8181),s=1,open=true,ishut=false,oshut=false,rb=false,wb=false,w=true,i=0r}-{AsyncHttpConnection@21d1b60b,g=HttpGenerator{s=4,h=0,b=0,c=-1},p=HttpParser{s=0,l=3,c=0},r=1}
2015-11-14 12:57:00,941 | DEBUG | qtp425678673-70  | ChannelEndPoint                  | 70 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.17.v20150415 | ishut SCEP@5b87b8b7{l(/127.0.0.1:46304)<->r(/127.0.0.1:8181),s=1,open=true,ishut=false,oshut=false,rb=false,wb=false,w=true,i=0r}-{AsyncHttpConnection@21d1b60b,g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=-14,l=0,c=-3},r=1}
2015-11-14 12:57:00,941 | DEBUG | qtp425678673-70  | HttpParser                       | 70 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.17.v20150415 | filled -1/0
2015-11-14 12:57:00,941 | DEBUG | qtp425678673-70  | AsyncHttpConnection              | 70 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.17.v20150415 | Disabled read interest while writing response SCEP@5b87b8b7{l(/127.0.0.1:46304)<->r(/127.0.0.1:8181),s=1,open=true,ishut=true,oshut=false,rb=false,wb=false,w=true,i=0r}-{AsyncHttpConnection@21d1b60b,g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=0,l=0,c=-3},r=1}
2015-11-14 12:57:00,942 | DEBUG | qtp425678673-70  | ChannelEndPoint                  | 70 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.17.v20150415 | close SCEP@5b87b8b7{l(/127.0.0.1:46304)<->r(/127.0.0.1:8181),s=1,open=true,ishut=true,oshut=false,rb=false,wb=false,w=true,i=0r}-{AsyncHttpConnection@21d1b60b,g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=0,l=0,c=-3},r=1}
2015-11-14 12:57:00,942 | DEBUG | 673-63 Selector0 | nio                              | 70 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.17.v20150415 | destroyEndPoint SCEP@5b87b8b7{l(null)<->r(0.0.0.0/0.0.0.0:8181),s=0,open=false,ishut=true,oshut=true,rb=false,wb=false,w=true,i=0!}-{AsyncHttpConnection@21d1b60b,g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=0,l=0,c=-3},r=1}
2015-11-14 12:57:00,943 | DEBUG | 673-63 Selector0 | AbstractHttpConnection           | 70 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.17.v20150415 | closed AsyncHttpConnection@21d1b60b,g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=0,l=0,c=-3},r=1

然后在Advanced Jetty Configuration中尝试将 DefaultServlet 作为大纲,将我之前在 jetty.xml 中添加的内容替换为

<Get name="handler">
    <Call name="addHandler">
      <Arg>
    <New class="org.eclipse.jetty.servlet.ServletContextHandler">
          <Set name="contextPath">/static-content</Set>
          <Set name="resourceBase">/tmp</Set>
          <Call name="addServlet">
            <Arg>org.eclipse.jetty.servlet.DefaultServlet</Arg>
            <Arg>/</Arg>
          </Call>
        </New>
      </Arg>
    </Call>
</Get>

重新启动 Karaf,并且 curl http://localhost:8181/static-content仍然给出 404,并且 Karaf 日志显示与 ResourceHandler 基本相同。

少了什么东西?

于 2015-11-14T21:02:10.003 回答