2011-09-19 41 views
7

Tôi có một tệp XML (urlrewrite.xml) cần một trình giữ chỗ thuộc tính được giải quyết. Tôi cho phép lọc Maven để đạt được điều này. Điều này làm việc tốt cho tập tin WAR lắp ráp.Làm cách nào để lọc tài nguyên khi sử dụng plugin maven jetty?

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

Sự cố là khi cố chạy ứng dụng ở chế độ phát triển bằng trình cắm maven-jetty (Plugin Maven Jetty), làm cầu nối maven: chạy.

Tệp được đề cập, urlrewrite.xml, nằm trong thư mục src/main/resources và do đó nên (và không) kết thúc trong/WEB-INF/classes (hoặc target/classes cho maven jetty: run).

Các URLRewriteFilter cấu hình xác định vị trí của tập tin cấu hình như sau:

<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> 

này sẽ làm việc vào thời điểm triển khai. Tuy nhiên, bằng cách sử dụng plugin maven jetty, URLRewrite sẽ chết với NullPointerException vì nó sử dụng context.getResourceAsString ("/ WEB-INF/classes/urlrewrite.xml") để tải tệp cấu hình. Jetty trả về null cho điều này vì khi chạy ứng dụng từ không gian làm việc, nó giải quyết/WEB-INF/classes/... thành src/main/webapp/WEB-INF/.... Tệp không tồn tại ở đó vì WAR chưa được lắp ráp. Thay vào đó, nó sẽ lấy tài nguyên từ target/classes/urlrewrite.xml.

Nếu điều đó không rõ ràng với bạn, thì có thể bạn sẽ không thể trả lời câu hỏi này vì tôi nghi ngờ bạn sẽ cần phải là một chuyên gia Jetty để tìm ra cách giải quyết (gợi ý: đó là một thách thức!).

Có ai biết cách này không? Tôi cũng đã thử các cách giải quyết sau đây để biết avail:

  1. Đặt urlrewrite.xml dưới một thư mục mới, src/main/webResources và thêm nó vào các plugin chiến tranh maven <webReources> và cho phép lọc. Điều đó sẽ sao chép nội dung của nó ở vị trí thích hợp khi WAR được đóng gói, nhưng sẽ không làm cho nó có sẵn cho cầu tàu: chạy
  2. Một số hacks khác mà tôi thậm chí không thể nhớ ... (sẽ cập nhật nếu tôi làm)

Nói tóm lại, maven-cầu cảng-plugin cần tập tin phải được theo src/main/nguồn/webapp/đường chèn và filename để có sẵn cho các cầu cảng maven: lệnh chạy ...

Cảm ơn sự giúp đỡ của bạn ...

Trân trọng, Lloyd F orce

Trả lời

12

Đã trả lời câu hỏi của riêng tôi.

  1. Upgrade maven-cầu cảng-plugin để ít nhất 6.1.12

  2. Xem trang wiki này vào 'Cấu hình Nhiều WebApp Nguồn thư mục' (có sẵn từ cầu cảng-6.1.12.rc2 và cầu cảng-7.0 .0pre3)

  3. Thêm chút ma thuật vào pom.xml:

Đầu tiên, thêm một thư mục mới (src/main/webResources) cho tài nguyên web lọc của bạn và thêm một < nguồn > yếu tố:

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

Đó sẽ sao chép các tập tin để nhắm mục tiêu/jettyFilteredResources (chúng tôi sẽ tham khảo sau này). Thư mục này sẽ KHÔNG được sao chép vào tệp WAR đóng gói của bạn, nó chỉ dành cho cầu cảng!

Thêm các yếu tố sau vào maven-chiến-plugin < cấu hình > yếu tố:

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

Điều đó sẽ đảm bảo mọi thứ được đóng gói cho tập tin WAR thực sự của bạn.

Cuối cùng, hãy nói với cầu cảng để sử dụng các nguồn lực sao chép của bạn đặc biệt đối với nó, bằng cách thêm đoạn mã sau để > yếu tố < baseResource của bạn:

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

Bây giờ mọi thứ sẽ worketh! (Vâng, về mặt kỹ thuật, tôi chưa thử nghiệm WAR sản xuất, nhưng ... blah ... nó cũng nên hoạt động).

Nếu có ai có câu trả lời hay hơn, tôi sẽ chấp nhận câu trả lời được cung cấp trong một khoảng thời gian hợp lý (ví dụ 1 ngày).

+0

+1 Đối với giải pháp ghi tài liệu (có quá nhiều câu hỏi chưa được trả lời trên mạng). Nếu điều này phù hợp với bạn, hãy tự chấp nhận. Chỉ cần một sang một bên, có bạn đã cố gắng để thêm 'phát triển' hồ sơ maven với lọc tài nguyên chuyên ngành? Đó là một cách tiếp cận tôi đã thực hiện cho dự án web không phải của tôi. –

+0

Tùy chọn sử dụng trình bổ sung maven-replacer và để nó ghi tập tin được thay thế vào/WEB-INF/classes/dir. Nó sẽ đảm bảo cấu trúc dir tồn tại. – Steven

+0

Đối với những người sử dụng Jetty 9: org.eclipse.jetty.util.resource.ResourceCollection thay vì org.mortbay.resource.ResourceCollection – RockMeetHardplace

3

Tôi nghĩ câu trả lời trong câu hỏi này khác là tốt hơn:

Running resource filters when using jetty:run

Về cơ bản, thay vì chạy 'cầu cảng mvn: chạy' bạn phải sử dụng 'cầu cảng mvn: chạy phát nổ'.

Hạn chế duy nhất là nó cần xây dựng tệp WAR, có thể tốn kém trong một số trường hợp. Nếu đó không phải là một vấn đề cho bạn, thì tôi đoán nó tốt hơn.

+0

hãy để tôi nói cho bạn biết, phát nổ không phải là một lựa chọn; bạn nói về một vài giây so với vài phút; ít nhất đó là trường hợp tại thời điểm bài viết này được viết.giải pháp tôi đăng ở trên cung cấp cho bạn những điều tốt nhất của cả hai thế giới. vâng, đó là một hack. nhưng nó không chảy máu vào ứng dụng thực tế chút nào. nó chỉ là một hack xây dựng mà bạn có thể quên một khi nó được thiết lập. cho nó một shot và cho tôi biết những gì bạn nghĩ. tôi thừa nhận câu trả lời của tôi là một chút terse như tôi đã được viết cho người dùng maven giàu kinh nghiệm. tôi có thể cập nhật với nhiều chi tiết hơn nếu bạn nghĩ rằng nó sẽ giúp ích. – les2

+0

Trừ khi tôi bỏ lỡ điều gì đó, câu trả lời này đã làm việc cho tôi. – jbird

2

thêm video này vào pom.xml:

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

và đây là cách nhúng Jetty máy chủ sẽ giống như thế:

 <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! cảm ơn @ les2 vì cảm hứng ;-)

+0

Bạn có phải tự mình triển khai tính năng này cho plugin jetty-maven-plugin không? Nếu vậy, đó là tuyệt vời. Nó chắc chắn làm cho cấu hình yêu cầu đơn giản hơn rất nhiều. – les2

0

Tôi đã tìm thấy một cách khác.

tạo dự án và thêm thư mục đích làm đường dẫn lớp phụ.

<webAppConfig> 
    .... 
    <extraClasspath>${basedir}/target/mywebapp</extraClasspath> 
    .... 
</webAppConfig> 
Các vấn đề liên quan