2013-03-12 31 views
33

Tôi có một dự án Maven tải xuống một số tệp thử nghiệm vào thư mục xây dựng ./target/files. sau đó những tập tin này nên có sẵn cho một servlet, mà tôi có thể dễ dàng đạt được bằng thể xác định rõ đường dẫn đầy đủ như một <init-param> của servlet:Làm thế nào để thay thế một giá trị trong web.xml bằng thuộc tính Maven?

<servlet> 
    <servlet-name>TestServlet</servlet-name> 
    <servlet-class>my.package.TestServlet</servlet-class> 
    <init-param> 
     <param-name>filepath</param-name> 
     <param-value>/home/user/testproject/target/files</param-value> 
    </init-param> 
</servlet> 

Làm thế nào tôi có thể tránh hardcoding đường dẫn đầy đủ và sử dụng một sự thay thế tham số động để thay thế? Tôi cố gắng điều sau đây, nhưng nó đã không làm việc:

<param-value>${project.build.directory}/files</param-value> 
+0

bạn có thể giải thích chi tiết hơn cách dự án của bạn tải các tập tin thử nghiệm? Điều gì gây nên điều đó? Thông thường vấn đề như thế này được giải quyết bằng cách cho phép lọc, nhưng nó có thể khó khăn tùy thuộc vào cách các tập tin này xuất hiện. –

Trả lời

66

Thêm vào mục pom của bạn:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-war-plugin</artifactId> 
    <configuration> 
     <webResources> 
      <resource> 
       <filtering>true</filtering> 
       <directory>src/main/webapp</directory> 
       <includes> 
        <include>**/web.xml</include> 
       </includes> 
      </resource> 
     </webResources> 
     <warSourceDirectory>src/main/webapp</warSourceDirectory> 
     <webXml>src/main/webapp/WEB-INF/web.xml</webXml> 
    </configuration> 
</plugin> 

Xem Maven: Customize web.xml of web-app project để biết thêm chi tiết

+0

Xem thêm https://maven.apache.org/plugins/maven-war-plugin/examples/adding-filtering-webresources.html để biết thêm thông tin – tukushan

+4

Có gì trong giải pháp cho phép thay thế? –

+0

@ alikelzin-kilaka: bạn có thể xác định thuộc tính trong tệp pom.xml của mình (ví dụ:" Moin") và nếu bạn có trong tệp web.xml một trình giữ chỗ ("$ {myProp}"), giá trị này sẽ được thay thế bằng giá trị của thuộc tính của bạn (có "Moin" trong mẫu của tôi) – Steffen

1

Mã hóa các thông số maven trong web.xml không thể làm việc trực tiếp, bởi vì tại thời gian chạy, khi ứng dụng của bạn bắt đầu, maven đã hoàn tất công việc của mình và các ứng dụng có không có kiến ​​thức về maven.

Bạn có thể lọc một web.xml thay thế (xem lọc maven: http://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html) và sử dụng nó khi xây dựng chiến tranh (xem tham số webXml tại tài liệu Plugin chiến tranh: http://maven.apache.org/plugins/maven-war-plugin/war-mojo.html)

5

Bạn có thể sử dụng Replace Ant Task để làm điều đó.

Heres một thực hiện mẫu nơi tôi thay thế tokenkeys trong một tập tin bất động sản, điều chỉnh nó cho phù hợp với nhu cầu của bạn

test.properties

[email protected][email protected] 
[email protected][email protected] 

pom.xml

<plugin> 
    <artifactId>maven-antrun-plugin</artifactId> 
    <version>1.7</version> 
    <executions> 
     <execution> 
     <phase>compile</phase> 
     <configuration> 
      <tasks> 

      <replace dir="${basedir}/src/main/resources" > 
       <include name="**/*.properties"/> 
      <replacefilter  token="@[email protected]" value="My Server"/> 
      <replacefilter  token="@[email protected]" value="My Profile"/> 
      </replace>    

      </tasks> 
     </configuration> 
     <goals> 
      <goal>run</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 

thì đấy! Bây giờ thực hiện

mvn clean package 
+6

Sử dụng tốt hơn [lọc tài nguyên] (http://maven.apache.org/plugins/maven là gì -resources-plugin/examples/filter.html) thay vì Ant. – khmarbaise

+0

Khi câu trả lời được chấp nhận tốt hơn cho câu hỏi thực tế được hỏi, đây thực sự chính xác là những gì tôi đang tìm kiếm để tôi có thể thay thế các phiên bản cho phụ thuộc webjar trong các tệp html tĩnh. Cảm ơn! – Pytry

5

Bạn chỉ có thể sử dụng maven filtering resources:

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

Bạn cũng có thể kết hợp này và muốn lọc một số tập tin trong khi những người khác không nên được lọc:

<resources> 
     <resource> 
     <directory>src/main/resources</directory> 
     <filtering>true</filtering> 
     <includes> 
      <include>**/*.xml</include> 
     </includes> 
     </resource> 
     <resource> 
     <directory>src/main/resources</directory> 
     <filtering>false</filtering> 
     <excludes> 
      <exclude>**/*.xml</exclude> 
     </excludes> 
     </resource> 
     ... 
    </resources> 

Đặt trình giữ chỗ phù hợp vào các tệp bạn muốn thay thế những thứ như $ {home}.

+0

Mã này lọc và thay thế các chuỗi trong các tệp XML bằng các giá trị được xác định trong thẻ pom.xml hoặc tôi có cần sử dụng tệp thuộc tính không? – madtyn

1

Tôi nghĩ bạn có thể sử dụng tùy chọn filteringDeploymentDescriptors maven-chiến-plugin để lọc deployment descriptor -

<properties> 
    <maven.war.filteringDeploymentDescriptors>true</maven.war.filteringDeploymentDescriptors> 
</properties> 
Các vấn đề liên quan