2011-09-19 14 views
7

プロパティプレースホルダを解決する必要があるXMLファイル(urlrewrite.xml)があります。これを実現するためにMavenフィルタリングを有効にします。これは、組み立てられたWARファイルでうまく動作します。実行:Mavenの桟橋などのmaven-桟橋 - プラグイン(Mavenの突堤プラグイン)を使用して開発モードでアプリケーションを実行しようとしたときMaven Jetty Pluginを使用しているときにリソースをフィルタリングする方法は?

<build> 
    <resources> 
     <resource> 
      <directory>src/main/resources</directory> 
      <filtering>true</filtering> 
     </resource> 

問題があります。

urlrewrite.xmlのファイルはsrc/main/resourcesディレクトリにありますので、/ WEB-INF/classes(またはmaven jetty:runのターゲット/クラス)で終わる必要があります)。

次のようにURLRewriteFilterの設定は、設定ファイルの場所を指定します。

<filter> 
    <filter-name>UrlRewriteFilter</filter-name> 
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> 
    <init-param> 
     <param-name>confPath</param-name> 
     <param-value>/WEB-INF/classes/urlrewrite.xml</param-value> 
    </init-param> 
</filter> 

これは、デプロイ時に動作します。ただし、jetty mavenプラグインを使用すると、config.loadResourceAsString( "/ WEB-INF/classes/urlrewrite.xml")を使用して設定ファイルをロードするため、URLRewriteはNullPointerExceptionで終了します。 Jettyは、ワークスペースからアプリケーションを実行するときに、/ WEB-INF/classes/...をsrc/main/webapp/WEB-INF/...に解決するため、nullを返します。 WARはまだアセンブルされていないため、そこにファイルは存在しません。代わりに、target/classes/urlrewrite.xmlからリソースを取得する必要があります。

これはあなたには分かりませんが、この質問に答えることはできません。なぜなら、あなたが回避策を見つけ出すためには、ジェッティの教祖である必要があると思われるからです。

これを回避する方法を知っている人はいますか? SRC /メイン/ webResources、新しいディレクトリの下にurlrewrite.xml入れ

  1. とMavenの戦争のプラグインに<webReources>それを追加して、フィルタリングを有効にします。また、私は無駄を知るために、以下の回避策を試してみました。それは、WARがパッケージ化されているときにその内容を適切な場所にコピーしますが、それを桟橋のために利用することはできません:run
  2. 私は覚えていないことがあります...(私がしても更新されます)
要約すると

、Mavenの-桟橋 - プラグインがMavenの桟橋のために利用できるようにするために、SRC /メイン/リソース/ webappの/ 挿入パスとファイル名下にあるファイルを必要とします:runコマンド...

ありがとうございます...

よろしくお願いします。 Lloyd F orce

答えて

12

回答しました。少なくとも6.1.12

    1. アップグレードのmaven-桟橋 - プラグインは( '複数のWebAppのソースディレクトリの設定' に関するこのwikiページを参照してください可能な以来、桟橋-6.1.12.rc2と桟橋 - 7.0 .0pre3)

    2. pomにいくつかの魔法を追加します。XML:

    まず、あなたのフィルタ処理Webリソースのための新しいディレクトリ(SRC /メイン/ webResources)を追加し、<リソース>要素を追加します。

     <resource> 
          <directory>src/main/webResources</directory> 
          <filtering>true</filtering> 
          <targetPath>../jettyFilteredResources</targetPath> 
         </resource> 
    

    ターゲットにファイルをコピーします/ jettyFilteredResources(これについては後で参照します)。このディレクトリはパッケージ化されたWARファイルにはコピーされません。

       <webResources> 
            <resource> 
             <directory>src/main/webResources</directory> 
             <filtering>true</filtering> 
            </resource> 
           </webResources> 
    

    すべてがあなたの本当のWARファイル用にパッケージ化されていることを確認します。

    はあなたのmaven-戦争 - プラグインに<設定>要素を次の要素を追加します。

    <baseResource implementation="org.mortbay.resource.ResourceCollection">       
        <resourcesAsCSV>src/main/webapp,target/jettyFilteredResources</resourcesAsCSV> 
    </baseResource> 
    

    今、すべてがworkethます:

    最後に、あなたの<baseResource>要素に次のコードを追加したことで、あなたは特にそれのためにコピーされたリソースを使用するために桟橋を教えて! (まあ、技術的には私はまだ生産WARをテストしていませんが、それはあまりにもうまくいくはずです)。

    誰かがより良い回答をしている場合は、回答が合理的な時間(例えば1日)で提供されれば、私はそれを受け入れます。

  • +0

    +1解決策を文書化するために(網にはまだたくさんの未回答の質問があります)。これはあなたのために働く場合は、自己受け入れます。特別なリソースフィルタリングで '開発'メイヴンプロファイルを追加しようとしましたか?それは私が私の非桟橋ウェブプロジェクトのために取ったアプローチでした。 –

    +0

    オプションで、maven-replacer-pluginを使用し、置き換えられたファイルを/ WEB-INF/classes/dirに書き出すようにします。 dir構造が存在することを確認します。 – Steven

    +0

    Jetty 9を使用している場合は、org.mecache.java.util.resource.ResourceCollectionをorg.mortbay.resource.ResourceCollectionの代わりに – RockMeetHardplace

    3

    は、私は、この他の問題の答えは優れていると思う:

    Running resource filters when using jetty:run

    基本的には、代わりに「MVN桟橋:実行」を実行しているのは、使用しなければならない「MVN桟橋:実行-爆発します」。

    唯一の欠点は、場合によっては高価なWARファイルを構築する必要があることです。それがあなたにとって問題でないなら、私はそれが良いと思います。

    +0

    私に教えてください。run-explodedはオプションではありません。あなたの話は数秒と数秒です。少なくともこの記事が書かれた時のケースでした。上に掲げたソリューションは、あなたに両方の世界のベストを提供します。はい、それはハックです。実際のアプリケーションにはまったく出ません。一度設定すると忘れることのできるビルドハックです。それを打ち、あなたの考えを知らせてください。私は経験豊富なMavenユーザのために私の答えはちょっと狭いと認めます。あなたがそれが助けになると思うなら、私はもっと詳細で更新することができます。 – les2

    +0

    私は何かが欠けていない限り、この答えは私のために働いた。 – jbird

    2

    のpom.xmlに以下を追加:

    <resources> 
         <resource> 
          <directory>src/main/webapp/WEB-INF</directory> 
          <filtering>true</filtering> 
          <targetPath>../jettyFilteredResources</targetPath> 
         </resource> 
        </resources> 
    

    をして、これは組み込みのJettyサーバがどのように見えるべきかです:

     <plugin> 
          <groupId>org.eclipse.jetty</groupId> 
          <artifactId>jetty-maven-plugin</artifactId> 
          <version>9.1.3.v20140225</version> 
          <configuration> 
           <webAppConfig> 
            <descriptor>target/jettyFilteredResources/web.xml</descriptor> 
           </webAppConfig> 
           <scanIntervalSeconds>3</scanIntervalSeconds> 
          </configuration> 
         </plugin> 
    

    woila!感謝のための感謝@ les2 ;-)

    +0

    jetty-maven-plugin用にこの機能を実装する必要がありましたか?もしそうなら、それは最高です。それは確かに必要な構成をもっと簡単にします。 – les2

    0

    私は別の方法を見つけました。

    プロジェクトをビルドし、追加のクラスパスとしてターゲットフォルダを追加します。

    <webAppConfig> 
        .... 
        <extraClasspath>${basedir}/target/mywebapp</extraClasspath> 
        .... 
    </webAppConfig>