2010-06-10 23 views
16

Tôi có một ứng dụng web Maven với các tập tin văn bản trongMaven Chuỗi Thay Tài Web Tiêu

src/main/webapp/textfilesdir

Theo tôi được biết, trong giai đoạn gói textfilesdir này thư mục sẽ được sao chép vào

mục tiêu/dự án-1,0-SNAPSHOT

thư mục, sau đó được nén thành một

mục tiêu/dự án-1,0-SNAPSHOT.war

Vấn đề

Bây giờ, tôi cần phải làm một sự thay thế chuỗi trên nội dung của các tệp văn bản trong target/project-1.0-SNAPSHOT/textfilesdir. Điều này sau đó phải được thực hiện sau khi textfilesdir được sao chép vào target/project-1.0-SNAPSHOT, nhưng trước khi tập tin target/project-1.0-SNAPSHOT.war được tạo ra. Tôi tin rằng đây là tất cả được thực hiện trong giai đoạn gói.

Làm thế nào có thể một plugin (có khả năng maven-antrun-plugin), cắm vào giai đoạn gói để làm điều này.

Tệp văn bản không chứa các thuộc tính, như $ {property-name} để lọc. Thay thế chuỗi có thể là lựa chọn duy nhất.

Tùy chọn

  1. Sửa đổi các tập tin văn bản sau khi copy vào thư mục đích/dự án-1,0-SNAPSHOT, tuy nhiên trước sự sáng tạo WAR.

  2. Sau khi đóng gói, trích xuất các tệp văn bản từ WAR, sửa đổi chúng và thêm chúng trở lại vào WAR.

Tôi nghĩ có một tùy chọn khác ở đây tôi bị thiếu. Suy nghĩ bất cứ ai?

Trả lời

4

Tùy chọn 1 không thể thực hiện được, prepare-package quá sớm, package quá muộn nên tôi không thấy nơi bạn có thể cắm bất kỳ công việc tùy chỉnh nào. Tùy chọn 2 có thể thực hiện được nhưng là IMO đau đớn. Vì vậy, đây là một số mệnh đề khác (tất cả dựa trên AntRun và các nhiệm vụ ReplaceRegExp và/hoặc Replace).

Giải pháp 1:

  1. Tạo một thư mục mới, nơi bạn đặt các tập tin văn bản mà cần phải được xử lý.
  2. Liên kết plugin antrun với prepare-package và định cấu hình plugin để xử lý tệp và đặt các tệp đã xử lý trong một số thư mục dưới target (ví dụ: target/textfilesdir).
  3. Định cấu hình plugin chiến dịch để bao gồm target/textfilesdir dưới dạng webResource. Tham khảo Adding and Filtering External Web Resources để biết chi tiết.

Giải pháp 2:

  1. Bind plugin antrun để prepare-package và cấu hình nó để xử lý các tập tin văn bản từ src/main/webapp/textfilesdir và đưa các tập tin xử lý trong target/project-1.0-SNAPSHOT.
  2. Định cấu hình plugin chiến dịch để loại trừ các tệp đã xử lý trước đó. Một lần nữa, hãy tham khảo Adding and Filtering External Web Resources để biết chi tiết.

Tôi nghĩ tôi sẽ đi giải pháp thứ hai.

+0

như thường lệ, tôi sẽ đề nghị sử dụng gmaven (http://docs.codehaus.org/display/GMAVEN/Executing+Groovy+Code) để nhúng groovy chứ không phải kiến, nhưng nếu không tôi hoàn toàn đồng ý (+1) –

+0

@seanizer: Tôi cần phải suy nghĩ thêm Groovy :) Nó chắc chắn sẽ chơi độc đáo ở đây. –

+0

yup. trong khi tôi không quá điên rồ về việc xây dựng các ứng dụng groovy (grails etc), tôi nghĩ groovy hoàn toàn bị đánh giá là một ngôn ngữ kịch bản –

1

Bạn có thể sử dụng maven-replacer-plugin:

<plugin> 
     <groupId>com.google.code.maven-replacer-plugin</groupId> 
     <artifactId>maven-replacer-plugin</artifactId> 
     <version>1.3.7</version> 
     <executions> 
      <execution> 
       <phase>prepare-package</phase> 
       <goals> 
        <goal>replace</goal> 
       </goals>     
      </execution> 
     </executions> 
     <configuration> 
      <file>target/${project.artifactId}-${project.version}/WEB-IN/site.xml</file> 
      <replacements> 
       <replacement> 
        <token>ear.version</token> 
        <value>${ear.version}-${maven.build.timestamp}</value> 
       </replacement>   
      </replacements> 
     </configuration> 
    </plugin> 

Nhưng bạn cần thêm hai thủ đoạn. Một là thêm mục tiêu phát nổ vào plugin chiến tranh:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-war-plugin</artifactId> 
    <version>2.1.1</version> 
     ..... 
     <executions> 
     <execution> 
     <phase>prepare-package</phase> 
      <goals> 
       <goal>exploded</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

Và cuối cùng cần gọi mvn sạch trước gói. Bạn có thể làm điều đó từ pom của bạn:

    <plugin> 
        <artifactId>maven-clean-plugin</artifactId> 
        <version>2.4.1</version> 
        <executions> 
         <execution> 
         <id>auto-clean</id> 
         <phase>initialize</phase> 
         <goals> 
          <goal>clean</goal> 
         </goals> 
         </execution> 
        </executions> 
      </plugin> 

Nếu bạn đang sử dụng một phiên bản của maven-chiến-cắm mới hơn 2.0.1, bạn sẽ cần phải bao gồm đúng trong cấu hình của maven-chiến-plugin , nếu không, các thay đổi đối với (các) tệp của bạn sẽ được chia nhỏ khi plugin chiến tranh sao chép ứng dụng web của bạn qua lần thứ hai. Nếu bạn đang sử dụng Hudson/Jenkins, bạn sẽ phải sử dụng phiên bản mới hơn 2.0.1.

7

Tôi đã gặp vấn đề tương tự và tôi đã không hài lòng với vấn đề này, vì vậy tôi sẽ trả lời mặc dù câu hỏi này khá cũ. Như đã nói bởi leandro và Phil, người ta có thể sử dụng plugin maven-replacer. Nhưng giải pháp của họ không hiệu quả với tôi. Bật useCache đã gây ra lỗi khiến không thể xây dựng dự án. Ngoài ra, tôi không thể làm cho công cụ tự động làm sạch hoạt động bình thường. Như tôi không được phép vẫn chưa bình luận gì về bài viết, tôi sẽ cung cấp giải pháp đầy đủ của tôi ở đây:

Trước hết, cấu hình maven-replacer-plugin:

<plugin> 
    <groupId>com.google.code.maven-replacer-plugin</groupId> 
    <artifactId>maven-replacer-plugin</artifactId> 
    <version>1.3.7</version> 
    <executions> 
    <execution> 
     <phase>prepare-package</phase> 
     <goals> 
     <goal>replace</goal> 
     </goals> 
    </execution> 
    </executions> 
    <configuration> 
    <includes> 
     <include>target/${project.build.finalName}/static/**/*.css</include> 
    </includes> 
    <regex>false</regex> 
    <token>someString</token> 
    <value>replaceString</value> 
    </configuration> 
</plugin> 

Trước khi cuộc chiến tranh thực tế được xây dựng , chúng ta tạo ra một cuộc chiến bùng nổ. Điều này có nghĩa, toàn bộ nội dung của tập tin chiến tranh được lưu trữ trong một thư mục con (mặc định là target/$ {project.build.finalName}). Sau đó, plugin maven-replacer sẽ thay đổi nội dung của các tập tin như chúng ta đã chỉ định. Cuối cùng, .war sẽ được đóng gói trong pha gói bởi công việc default-war. Để tránh nội dung của thư mục chiến tranh bị phát hiện bị ghi đè, người ta phải đặt warSourceDirectory vào thư mục nơi lưu trữ nội dung chiến tranh được giải mã.Đoạn cấu hình sau đây sẽ làm công việc này:

<plugin> 
    <artifactId>maven-war-plugin</artifactId> 
    <version>2.1.1</version> 
    <executions> 
    <execution> 
     <id>prepare</id> 
     <phase>prepare-package</phase> 
     <goals> 
     <goal>exploded</goal> 
    </goals> 
    </execution> 
    <execution> 
     <id>default-war</id> 
     <phase>package</phase> 
     <goals> 
     <goal>war</goal> 
     </goals> 
     <configuration> 
     <warSourceDirectory>${project.build.directory}/${project.build.finalName}</warSourceDirectory> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

Các gói phần mềm với nội dung thay thế có thể được xây dựng sử dụng mvn clean package

+0

Tuyệt vời, cảm ơn bạn. – user467257

3

Tôi đã có một vấn đề với các giai đoạn, sử dụng chuẩn bị gói không được sao chép các tập tin vào chiến tranh , giải pháp của tôi là thế này:

Thêm cấu hình này trong maven-chiến-plugin

<plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
       <version>2.1.1</version> 
     <executions> 
      <execution> 
       <phase>prepare-package</phase> 
       <goals> 
        <goal>exploded</goal> 
       </goals> 
      </execution> 
      <executions> 
       <configuration> 
       <webResources> 
        <resource> 
         <directory>${basedir}/WebContent?</directory> <excludes> 
       <!--Exclude the file because it is copied using the maven replacer plugin --> 
         <exclude>/style.scss</exclude> 
         </excludes> 
        </resource> 
       </webResources> 
      </configuration> 
      </plugin> 
      Add the configuration to replacer 
<plugin> 
     <groupId>com.google.code.maven-replacer-plugin</groupId> 
     <artifactId>replacer</artifactId> 
     <version>1.5.1</version> 
     <executions> 
      <execution> 
       <id>scss-replacement</id> <phase>prepare-package</phase> <goals> 
       <goal>replace</goal> 
       </goals> <configuration> 
       <file>WebContent?/css/style.scss</file> 
       <!-- My local file(WebContent?/css/style.scss) have a param 
       $url: "http://localhost:8080/interface"; 
       --> <!-- regex with match to $url: "http://localhost:8080/interface"; --> 
       <token>\$url:.</token> 
       <!-- Replace to --> 
       <value>\$url: "www.myapplication.com.br/css/style.css";</value> 
       <outputFile>target/app/css/style.scss</outputFile> 

       </configuration> 
      </execution> 
    <executions> 
<plugin> 

Tệp đầu ra không ghi đè tệp, vì vậy tôi đặt cấu hình maven-war-plugin để loại trừ tệp style.scss. tạm biệt!

2

Một giải pháp khác của tôi, xin lỗi vì đã đến muộn bữa tiệc nhưng vẫn có thể hữu ích đối với một số người. Giải pháp trên chỉ đơn giản là không làm việc cho tôi bởi vì tôi đã có lớp phủ tại chỗ và do đó sử dụng plugin replacer là khó khăn trong nguồn chính. Do đó, tôi đã sử dụng maven-war-plugin để tạo thư mục tạm thời cho tôi trong giai đoạn chuẩn bị gói và thay thế plugin để thao tác và giải phóng chiến tranh khỏi thư mục đó để không có gì khác ghi đè nó.

 <plugin> 
    <artifactId>maven-war-plugin</artifactId> 
    <executions> 
     <execution> 
     <id>prepare</id> 
     <phase>prepare-package</phase> 
     <goals> 
      <goal>exploded</goal> 
     </goals> 
     <configuration> 
      <webappDirectory>${project.build.directory}/${project.build.finalName}-patched/</webappDirectory> 
     </configuration> 
     </execution> 
     <execution> 
     <id>default-war</id> 
     <phase>package</phase> 
     <goals> 
      <goal>war</goal> 
     </goals> 
     <configuration> 
      <useCache>true</useCache> 
      <warSourceDirectory>${project.build.directory}/${project.build.finalName}-patched/</warSourceDirectory> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 
    <plugin> 
    <groupId>com.google.code.maven-replacer-plugin</groupId> 
    <artifactId>replacer</artifactId> 
    <executions> 
     <execution> 
     <phase>prepare-package</phase> 
     <goals> 
      <goal>replace</goal> 
     </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <file>${project.build.directory}/${project.build.finalName}-patched/fileToBeChanged.txt</file> 
     <token>ValueToChange</token> 
     <value>ValueToReplace</value> 
    </configuration> 
    </plugin> 
Các vấn đề liên quan