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 | ContextHandler
| 113 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.15.v20140411 | oejsServletContextHandler を停止しました{/fileserver,file:/Users/Shared/testenv/}

ただし、ファイルは localhost:8181/fileserver では提供されません

それが(新しくインストールされたカラフコンテナで)機能している唯一の方法は、使用することです

<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のjettyインスタンスを介して静的ファイルを提供する作業構成を持っていますか、それとも今これを行う方法はありますか?

どんな助けでも感謝します。少し早いですがお礼を!

ところで: Karaf 3.0.3 の使用

編集:

Achim から提供されたスニペットを使用してテストを再実行し、DEBUG ログを有効にしました。

2015-06-03 15:33:25,492 | デバッグ | プール-6-スレッド-1 | XmlConfiguration | 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 | XmlConfiguration | 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 as handler 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} as handler 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 | AbstractHandler
| 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 | REQUEST /static-content on AsyncHttpConnection@638f2d20,g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=-5,l=10,c=0 }、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 | RESPONSE /static-content 200 処理済み = false

ここで、Get バージョン (動作していない) と Set バージョン (動作している) の違いに気付きました。

Set はクラスorg.eclipse.jetty.server.handler.HandlerList Get を設定し、クラスに追加しますorg.ops4j.pax.web.service.jetty.internal.JettyServerHandlerCollection。これは、次のように記述されています。

登録されたエイリアスへのリクエスト パスの部分文字列ベースのマッチングを実行した後、リクエスト パスに一致するハンドラー (=コンテキスト) のみを呼び出す Jetty ハンドラー コレクション

エイリアスに関して問題がある可能性はありますか?

編集2:

これを掘り下げてみましたが、実際にはこれを機能させることができません。統合テストと通常のカラフの違いについてはわかりませんが、問題があるに違いありません。この問題を再現するには、新鮮な 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