2011-09-19 86 views
7

我有一個需要解決屬性佔位符的XML文件(urlrewrite.xml)。我啓用Maven過濾來實現這一點。這適用於組裝的WAR文件。如何在使用maven jetty插件時過濾資源?

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

的問題是試圖運行使用Maven的碼頭 - 插件(Maven的碼頭插件)的發展模式中的應用,隨着Maven碼頭時:運行。

有問題的文件urlrewrite.xml位於src/main/resources目錄下,因此應該(並且)應該在/ WEB-INF/classes(或者maven jetty的target/classes:run )。

的URLRewriteFilter config指定配置文件的位置如下:

<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插件,URLRewrite將會因NullPointerException而死亡,因爲它使用context.getResourceAsString(「/ WEB-INF/classes/urlrewrite.xml」)來加載配置文件。 Jetty爲此返回null,因爲從工作區運行應用程序時,它會將/ WEB-INF/classes/...解析爲src/main/webapp/WEB-INF/...。該文件不存在,因爲WAR尚未彙編。它應該從target/classes/urlrewrite.xml中提取資源。

如果這對你來說很模糊,那麼你可能無法回答這個問題,因爲我懷疑你需要成爲一名碼頭專家來找出解決方法(提示:這是一個挑戰!)。

有沒有人知道解決這個問題的方法?我也曾嘗試以下解決知道無濟於事:

  1. 一個新的目錄下,認沽urlrewrite.xml,的src/main/webResources並將其添加到Maven的戰爭插件<webReources>和啓用過濾。當WAR被打包時,它會將它的內容複製到適當的位置,但不會使其可用於碼頭:運行
  2. 其他一些我甚至不記得的黑客...(將更新,如果我這樣做)

綜上所述,Maven的碼頭 - 插件需要的文件是在src /主/資源/ web應用/ 插入路徑和文件名以可用於maven的碼頭:運行命令

謝謝你的幫助...

此致 Lloyd F orce

回答

12

回答了我自己的問題。

  1. 升級Maven的碼頭,插件至少6.1.12

  2. 參見「配置多個Web應用程序源目錄」(此Wiki網頁可用,因爲碼頭,6.1.12.rc2和碼頭 - 7.0 .0pre3)

  3. 給pom增加一些魔力。XML:

首先,添加一個新的目錄中(src /主/ webResources)爲您過濾網絡資源,並添加<資源>元素:

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

這將文件複製到目標/ jettyFilteredResources(我們將在稍後參考)。此目錄不會被複制到打包的WAR文件中,它僅用於碼頭!

以下元素添加到您的Maven的戰爭插件<配置>元素:

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

這將確保一切都打包了你真正的WAR文件。

最後,告訴碼頭使用您特別是對於其複製,通過添加下面的代碼片段的資源到你的<baseResource>元素:

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

現在,一切都將是叫人! (好吧,從技術上說,我還沒有測試過生產戰爭,但是......等等......它也應該工作)。

如果有人有更好的答案,我會接受它,只要在合理的時間內(比如1天)提供答案。

+0

+1用於記錄解決方案(網上有很多未解答的問題)。如果這對你有用,請自我接受。簡而言之,你是否嘗試過使用專門的資源過濾來添加'Development'maven profile?這是我爲非碼頭Web項目採取的一種方法。 –

+0

可以選擇使用maven-replacer-plugin,並將替換後的文件寫入/ WEB-INF/classes/dir。它將確保dir結構存在。 – Steven

+0

對於那些使用Jetty 9:org.eclipse.jetty.util.resource.ResourceCollection而不是org.mortbay.resource.ResourceCollection – RockMeetHardplace

3

我想在這個問題的其他答案是更好:

Running resource filters when using jetty:run

基本上,而不是運行「命令mvn碼頭:運行」,你必須使用「命令mvn碼頭:運行爆炸」。

唯一的缺點是它需要構建WAR文件,這在某些情況下可能很昂貴。如果這對你來說不是問題,那麼我認爲它更好。

+0

讓我告訴你,運行爆炸不是一個選項;你談論幾秒鐘而不是幾分鐘;至少在寫這篇文章的時候是這樣。我上面發佈的解決方案爲您提供了兩全其美的解決方案。是的,這是一個黑客。但它根本不會滲透到實際的應用程序中。這只是一個構建黑客,你可以忘記它一旦建立。給它一個鏡頭,讓我知道你的想法。我承認我在爲有經驗的maven用戶寫信時有點簡單。如果你認爲這會有所幫助,我可以更新更多細節。 – les2

+0

除非我錯過了一些東西,否則這個答案適用於我。 – jbird

2

其添加到pom.xml中:

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

,這是應該如何碼頭嵌入式服務器看起來像:

 <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> 
相關問題