2010-02-11 32 views
5

Tôi đang cố gắng tạo một cái lọ có tệp xml làm tài nguyên. Tôi muốn áp dụng một bộ lọc cho xml đó để chèn tên của một phụ thuộc vào xml. Bộ lọc đang hoạt động, vì tôi có thể rơi vào số ${project.build.finalName} và thay thế nó. Tôi tìm thấy one hint rằng thuộc tính tôi đang tìm kiếm có thể làLàm thế nào để lọc tài nguyên trong Maven, thay thế bằng một artifactId phụ thuộc?

${project.dependencies[0].artifactId} 

nhưng điều đó dường như không hoạt động. Tôi đang tìm để thay thế

<fileName>${project.dependencies[0].artifactId}</fileName> 

với

<fileName>OtherLibrary</fileName> 

Là có thể?

xml, mà là ở src/main/nguồn:

<somenode> 
    <fileName>${project.dependencies[0].artifactId}</fileName> 
</somenode> 

pom.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <modelVersion>4.0.0</modelVersion> 
<groupId>com.foo</groupId> 
<artifactId>Thing</artifactId> 
<version>1.0-SNAPSHOT</version> 
<name>Thing</name> 
<url>http://maven.apache.org</url> 
<build> 
    <resources> 
     <resource> 
      <directory>${basedir}/src/main/resources</directory> 
      <filtering>true</filtering> 
     </resource> 
    </resources> 
</build> 
<dependencies> 
    <dependency> 
     <groupId>com.pts</groupId> 
     <artifactId>OtherLibrary</artifactId> 
     <version>1.0-SNAPSHOT</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
</dependencies> 
</project> 
+0

Đây là 2.2.1 maven bằng cách này. – Jim

Trả lời

7

Chết tiệt, cậu nói đúng, khách sạn này không được thay thế trong thời gian lọc tài nguyên. Đó là lạ và nó giống như một lỗi trong Maven Resources Plugin vì thuộc tính này được nội suy chính xác trong giai đoạn process-resources như tôi sẽ trình bày trong cách giải quyết mà tôi đề xuất bên dưới (dựa trên plugin maven-antrun-plugin và nhiệm vụ replace).

Đầu tiên, thêm dòng sau vào POM của bạn:

<plugin> 
    <artifactId>maven-antrun-plugin</artifactId> 
    <executions> 
     <execution> 
     <phase>process-resources</phase> 
     <configuration> 
      <tasks> 
      <echo>${project.dependencies[0].artifactId}</echo><!-- I'm a test --> 
      <replace file="${project.build.outputDirectory}/myxmlfile.xml" 
        token="@@@" value="${project.dependencies[0].artifactId}"/> 
      </tasks> 
     </configuration> 
     <goals> 
      <goal>run</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 

Sau đó, cập nhật tập tin XML của bạn vào:

<somenode> 
    <fileName>@@@</fileName> 
</somenode> 

Với những thay đổi này, chạy mvn process-resources sẽ tạo ra kết quả sau:

$ cat target/classes/myxmlfile.xml 
<somenode> 
    <fileName>OtherLibrary</fileName> 
</somenode> 

Điều này chứng minh thuộc tính được nội suy (nhưng không được đặt trong maven fi ltering of resources) . Và nếu bạn cần lọc nhiều hơn một tệp, nhiệm vụ replace có thể mất một tệp. Điều chỉnh nó cho phù hợp với nhu cầu của bạn.

Trên thực tế, nó sẽ được tốt đẹp để tạo ra một Jira mới cho lỗi này trong Maven 2.x Resources Plugin. Tôi đã tạo MRESOURCES-118.

+0

nội suy và lọc không sử dụng cùng một thuật toán, do đó việc lọc chỉ có một tập con của các biểu thức –

+0

@Brett Cảm ơn bạn đã giải thích. –

+0

Cảm ơn bạn đã thêm báo cáo lỗi và cho giải pháp thay thế. – Jim

1

Thuộc tính được lập chỉ mục sẽ chỉ có sẵn bên trong cấu hình plugin do cách Maven nội suy POM - vì vậy nó có sẵn cho tác vụ thay thế của antrun, nhưng không phải là lọc.

Tuy nhiên, việc truy cập phụ thuộc theo chỉ mục không phải là rất mạnh mẽ - nó dễ bị thay đổi trong phụ huynh. Thay vào đó có thể sử dụng sau trong pom.xml:

<properties> 
    <fileName>some-name</fileName> 
</properties> 
... 
<dependency> 
    <groupId>your.group.id</groupId> 
    <artifactId>${fileName}</artifactId> 
    ... 
</dependency> 

Sau đó bạn có thể tiếp tục lọc bằng cách sử dụng tên tài sản:

<somenode> 
    <fileName>${fileName}</fileName> 
</somenode> 
+1

Thực ra, tôi đã thử những gì bạn đang đề xuất trong giải pháp đầu tiên khi tôi viết câu trả lời của tôi (và đề cập đến nó trong http://jira.codehaus.org/browse/MRESOURCES-118) nhưng điều này không hiệu quả, bạn sẽ nhận được ' $ {project.dependencies [0] .artifactId}' trong tài nguyên được lọc. Nhưng giải pháp thứ hai chắc chắn là một giải pháp tốt. –

+0

bạn nói đúng, xin lỗi về điều đó. Các cơ chế nội suy là một cái gì đó đã trải qua khá nhiều thay đổi giữa Maven 2.0.x, 2.2.x và 3.0. Tôi tin rằng biểu thức này sẽ chỉ có sẵn bên trong cấu hình plugin trong hầu hết các phiên bản của Maven, vì vậy tốt nhất là không nên dựa vào nó. –

+0

Tôi nên chỉ ra rằng lý do tôi đang tìm kiếm đây là những gì tôi sẽ đoán là một trường hợp/trường hợp cạnh duy nhất mà tôi cần phải thêm không EJB jar vào persistence.xml của tôi. Và bởi vì các plugin tai không có một cách để xác định quy ước đặt tên cho các lọ trong thư mục lib, tôi đã đi xuống con đường này. Các plugin chiến tranh có một cách tốt đẹp để làm cho lọ theo một mô hình đặt tên mà tôi muốn các plugin tai có. Xem http://jira.codehaus.org/browse/MEAR-98 chẳng hạn. Cuối cùng tôi sẽ viết mã không tồn tại. Nó chỉ là một cái lọ tôi thừa kế và đang làm việc để tích hợp. – Jim

Các vấn đề liên quan