3

IBM WebSphere Application Server にデプロイされた JAX-RS と AngularJS を使用して、単純なレポート Web アプリケーションを作成しています。非常にシンプルなので、依存関係をできるだけ少なくするようにしています。そのため、サーバー側で派手なフレームワークは使用していません。

静的リソースを提供するために、このコントローラーを作成しました。フォルダに保管していsrc/main/resourcesます。

@Path("/")
public class Assets {

    @GET
    @Path("{path:.*\\.js}")
    public Response javascript(@PathParam("path") String resourceName) {
        return serveResource(resourceName, "application/javascript");
    }

    private Response serveResource(String resourceName, String contentType) {
        InputStream inputStream =
            getClass().getClassLoader().getResourceAsStream(resourceName);

        return Response.ok(inputStream)
                .header(HttpHeaders.CONTENT_TYPE, contentType)
                .build();
    }
}

ここまでは順調ですね。

いくつかの JavaScript ライブラリ (jQuery、Underscore.js、AngularJS) を使用しているため、 WebJarsを利用したいと考えました。webjars.orgのドキュメントによると:

Servlet 3 と互換性のあるコンテナでは、ディレクトリ内の WebJars WEB-INF/libが自動的に静的リソースとして利用可能になります。これが機能するのMETA-INF/resources は、JAR 内のディレクトリにあるものはすべてWEB-INF/lib、静的リソースとして自動的に公開されるためです。

対応する WebJars を に入れるとpom.xml、動作が停止しました。これは私がこれまでに見つけたものです:

  • もちろん、WebJar は、結果の.warパッケージのWEB-INF/libフォルダーに存在します。
  • ClassLoader私のserveResourceメソッドクレームで使用されているクラスパスには、すべての WebJars があります。
  • ClassLoader実装はcom.ibm.ws.classloader.CompoundClassLoader.
  • META-INF/resourcesフォルダ内の WebJars に存在するリソースはどれも に表示されませんClassLoader。なし。

クラスローダーに WebJars のリソースを表示させるにはどうすればよいですか?

4

1 に答える 1

1

JAR 形式のファイルを提供するMETA-INF/resourcesには、WebSphere v8.5.
詳細については、このページを確認してください - JavaServer Pages 静的ファイル アクセス用の Web コンテナー構成

次の方法を使用して、静的ファイルを見つけます。

URL ServletContext.getResource(String path)
Set ServletContext.getResourcePaths(String path) 

アプリケーション WAR ファイルの WEB-INF/Lib ディレクトリの下にあるフラグメントの META-INF/resources ディレクトリ

フラグメント前のドキュメント ルートを検索した後、Web コンテナは Web フラグメントを検索します。Web フラグメントは、アプリケーションの WEB-INF/lib ディレクトリにある JAR ファイルで構成されます。JAR には、JAR ファイル内で定義されている META-INF/resources ディレクトリー内の静的リソースが含まれる場合があります。Web コンテナーが META-INF/resources ディレクトリーを検索しないようにするには、 com.ibm.ws.webcontainer.SkipMetaInfResourcesProcessingWeb コンテナーのカスタム・プロパティーを true に設定します。カスタム プロパティのデフォルト値は です false

com.ibm.ws.webcontainer.SkipMetaInfResourcesProcessing = true

UPDATE
メソッドを次のように変更してみてください(疑似コード、例外処理なし):

public Response javascript(@PathParam("path") String resourceName, 
                           @Context ServletContext servletContext) {

    // make sure resource name starts with / and should be relative path to META-INF/resources
    URL url = serveltContext.getResource(resourceName);  
    InputStream inputStream = url.openStream();

    return Response.ok(inputStream)
            .header(HttpHeaders.CONTENT_TYPE, "application/javascript")
            .build();
}

ServletContext.getResourceおよびURL.openStreamを参照してください。

于 2014-10-06T10:49:03.353 に答える