2013-08-09 6 views
10

PF 3.5.10、2.1.21クロサギ科は、私は(唯一のCSSファイル付き)JSFライブラリーを持っている1.5瓶内のリソースのためにJSFのバージョンを使用する方法

をomnifaces。このライブラリは.jarファイルにあります。 CSSは <h:outputStylesheet library="mylib" name="css/mycss.css">とxhtmlに含まれます。 HTMLで

それは次のようにレンダリングされます。最後に localhost:8080/cms/javax.faces.resource/primefaces.js.jsf?ln=primefaces&v=3.5.10

お知らせライブラリバージョン(3.5.10 &):primefacesのlocalhost:8080/cms/javax.faces.resource/css/mycss.css.jsf?ln=mylib

CSSファイルがにレンダリングされます。どうすれば同じことができますか?私はManifest.mfにバージョンを書くべきですか?またはjarファイルでjsf-versioningを使用するにはどうすればよいですか?

+0

[JSF2でリソースライブラリのバージョンを指定する方法は?](http://stackoverflow.com/questions/9868068/how-to-specify-resource-library-version-in-jsf2) –

+0

いいえ、私はこの質問はjarファイルに関するものなので、重複ではないと思います。 jarではこれは異なっています。 BalusCの回答を参照してください:[リンク](http://stackoverflow.com/a/11988418/2023524) – Tony

答えて

17

これは残念ながら不可能です。ライブラリのバージョン管理は、JARのリソースではサポートされていません。

あなたは基本的に2つのオプションまし

  1. はそれを簡単に醜い方法を行いますが、クエリ文字列として、サーバの起動時間が含まれます。あなたがOmniFacesを使用していることを考えると、あなたは、アプリケーションのスコープ内java.util.Dateインスタンスを参照するその組み込み#{startup}管理対象Beanを使用することができます。

    <h:outputStylesheet ... name="some.css?#{startup.time}" /> 
    <h:outputScript ... name="some.js?#{startup.time}" /> 
    

    それとも、すでにいくつかのアプリケーション変数としてバージョンをしました。

    <h:outputStylesheet ... name="some.css?v=#{app.version}" /> 
    <h:outputScript ... name="some.js?v=#{app.version}" /> 
    

    更新:すべての後に、これは<h:outputStylesheet>のために動作しません。 https://java.net/jira/browse/JAVASERVERFACES-3941およびhttps://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-1395も参照してください。これは、カスタムResourceHandlerを作成し、かなりすぐhttps://java.net/jira/browse/JAVASERVERFACES-1212

  2. Do the same as PrimeFacesを実施した非常にsimliarバグレポートを持っていた、しかし<h:outputScript>のために働きます。

    public class MyVersionResourceHandler extends ResourceHandlerWrapper { 
    
        private ResourceHandler wrapped; 
    
        public MyVersionResourceHandler(ResourceHandler wrapped) { 
         this.wrapped = wrapped; 
        } 
    
        @Override 
        public Resource createResource(String resourceName) { 
         return createResource(resourceName, null, null); 
        } 
    
        @Override 
        public Resource createResource(String resourceName, String libraryName) { 
         return createResource(resourceName, libraryName, null); 
        } 
    
        @Override 
        public Resource createResource(String resourceName, String libraryName, String contentType) { 
         final Resource resource = super.createResource(resourceName, libraryName, contentType); 
    
         if (resource == null) { 
          return null; 
         } 
    
         return new ResourceWrapper() { 
    
          @Override 
          public String getRequestPath() { 
           return super.getRequestPath() + "&v=1.0"; 
          } 
    
          @Override // Necessary because this is missing in ResourceWrapper (will be fixed in JSF 2.2). 
          public String getResourceName() { 
           return resource.getResourceName(); 
          } 
    
          @Override // Necessary because this is missing in ResourceWrapper (will be fixed in JSF 2.2). 
          public String getLibraryName() { 
           return resource.getLibraryName(); 
          } 
    
          @Override // Necessary because this is missing in ResourceWrapper (will be fixed in JSF 2.2). 
          public String getContentType() { 
           return resource.getContentType(); 
          } 
    
          @Override 
          public Resource getWrapped() { 
           return resource; 
          } 
         }; 
        } 
    
        @Override 
        public ResourceHandler getWrapped() { 
         return wrapped; 
        } 
    
    } 
    

    それとも、すでにOmniFacesを使用するために起こる場合は、それは単純に行うことができる:

    public class YourVersionResourceHandler extends DefaultResourceHandler { 
    
        public YourVersionResourceHandler(ResourceHandler wrapped) { 
         super(wrapped); 
        } 
    
        @Override 
        public Resource decorateResource(Resource resource) { 
         if (resource == null || !"mylib".equals(resource.getLibraryName())) { 
          return resource; 
         } 
    
         return new RemappedResource(resource, resource.getRequestPath() + "&v=1.0"); 
        } 
    
    } 
    

    いずれかの方法で、それを実行するために取得するため、JARの/META-INF/faces-config.xml<resource-handler>として登録。

    <application> 
        <resource-handler>com.example.MyVersionResourceHandler</resource-handler> 
    </application> 
    
+0

ありがとう!非常に有用な答え。 '#{startup}'のあなたのアイデアは素晴らしいです。クライアントのCSSは常に更新されるので、バージョンを変更するのを忘れることはできません。別の質問:このResourceHandlerをj​​arファイルに置き、そこから使用することは可能ですか?したがって、すべての瓶は独立しています。 – Tony

+2

はい、クラスをJARに入れ、JARの '/ META-INF/faces-config.xml'に登録してください。これはあなたがそれを見逃した場合の答えの一番下にも記載されています。 – BalusC

+0

ありがとうございました!私はあなたのチュートリアルの大ファンです。彼らは多くを助けます。 – Tony

3

また、あなたのプロジェクトのバージョンを使用して、リソースファイルのバージョン番号として、それを追加することができます。これはmaven-war-pluginを使用して行うことができます。 maven-war-pluginは、ビルド時にページを見て、定義されたプロパティを置き換えます。

ポンポン:

次の例では、カスタムプロパティasset.versionを注入するために、あなたのWebアプリケーションのリソースをフィルタリングするmaven-war-pluginを設定する方法を示します。XML

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" ...> 
    ... 

    <properties> 
    <asset.version>${project.version}</asset.version>  
    </properties> 

    ... 

    <build> 
    <plugins> 
     ... 

     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-war-plugin</artifactId> 
     <version>2.3</version> 
     <configuration> 

      <nonFilteredFileExtensions> 
      <nonFilteredFileExtension>gif</nonFilteredFileExtension> 
      <nonFilteredFileExtension>ico</nonFilteredFileExtension> 
      <nonFilteredFileExtension>jpg</nonFilteredFileExtension> 
      <nonFilteredFileExtension>png</nonFilteredFileExtension> 
      <nonFilteredFileExtension>pdf</nonFilteredFileExtension> 
      </nonFilteredFileExtensions> 

      <failOnMissingWebXml>false</failOnMissingWebXml> 

      <webResources> 
      <webResource> 
       <directory>${basedir}/src/main/webapp</directory> 
       <filtering>true</filtering> 
      </webResource> 
      </webResources> 

     </configuration> 
     </plugin> 

     ... 
    </plugins> 
    </build> 

</project> 

asset.versionプロパティは、あなたのJSFファイルで使用することができます。以下になります(私の場合)

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html> 
<html ... 
     xmlns:jsf="http://xmlns.jcp.org/jsf"> 

... 
<script jsf:name="js/libs/pure/pure-min.css?v=${project.version}" /> 

結果:ここで

はJSF 2.2でテスト例です

<script type="text/javascript" src="/context-path/javax.faces.resource/js/libs/pure/pure-min.css.xhtml?v=1.0.15-SNAPSHOT"></script> 
+1

良い点!ありがとうございました。それはMavenを使う面白い解決策です。残念ながらそれはしません。 – Tony

0

@Balusc応答が言った、「よくないバグ、見落としとスペックは失敗する "。ライブラリに配備されたCSSリソースは、mojarra 2.2.14でバージョン管理できないようです。そうですか?カスタムResourceHandlerを使用してソリューションを実装しようとしましたが、getWrapped()。createResource(resourceName、libraryName)によって返されるリソースは常にnullを返します。 createResource()のように、/ META-INF/resources /というパスでライブラリのリソース(css/layout.cssなど)を検索しようとしていますが、バージョンがありません。私は、生成されたリンクは

<link type="text/css" rel="stylesheet" href="/javax.faces.resource/1_0_3/css/layout.css?ln=common&amp;v=1_0_3"/> 

のように見えるこの回避策ではresourceNameは

@Override 
public Resource createResource(String resourceName, String libraryName) { 
    if (libraryName != null && libraryName.equals(LIBRARY_NAME)) { 
     if (!resourceName.startsWith(version)) { 
      resourceName = version + "/"+resourceName; 
     } 
    } 
    return super.createResource(resourceName, libraryName); 
} 

にバージョンプレフィックスを追加するOmnifaces DefaultResourceHandlerを拡張するカスタムResourceHandlerにCREATERESOURCEメソッドをオーバーライドしている問題を回避するには

outputStylesheet宣言の場合

<h:outputStylesheet library="common" name="css/layout.css" /> 

これが最善の回避策であるかどうかはわかりません。

関連する問題