2012-06-21 30 views
15

Tôi sử dụng maven-resource-plugin để lọc một số tài nguyên trong dự án của tôi. Trong dự án cha mẹ của tôi, tôi có:Định cấu hình mã hóa cho các loại tệp khác nhau trong maven?

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 

trong một dự án phụ Tôi có một test.properties tập tin mà là một đồng bằng java properties file với mã hóa mặc định = ISO-8859-1. Tập tin này chứa:

aboutText=Version ${project.version} © 2012 blabla 

Để đảm bảo bộ lọc tập tin này một cách chính xác tôi đã chia maven-tài nguyên-plugin vào hành riêng biệt mỗi mã hóa của nó:

<plugin> 
    <artifactId>maven-resources-plugin</artifactId> 
    <configuration> 
     <nonFilteredFileExtensions> 
     <nonFilteredFileExtension>ico</nonFilteredFileExtension> 
     <nonFilteredFileExtension>jar</nonFilteredFileExtension> 
     </nonFilteredFileExtensions> 
    </configuration> 
    <executions> 
     <execution> 
     <id>filter-properties-files</id> 
     <phase>generate-resources</phase> 
     <goals> 
      <goal>copy-resources</goal> 
     </goals> 
     <configuration> 
      <!-- java properties files are encoded in ISO-8859-1 so when 
      filtering those files we stick with that encoding. --> 
      <encoding>ISO-8859-1</encoding> 
      <outputDirectory>${basedir}/after</outputDirectory> 
      <resources> 
      <resource> 
       <filtering>true</filtering> 
       <directory>${basedir}/before</directory> 
       <includes> 
       <include>**/*.properties</include> 
       </includes> 
      </resource> 
      </resources> 
     </configuration> 
     </execution> 
     <execution> 
     <id>filter-non-properties-files</id> 
     <phase>generate-resources</phase> 
     <goals> 
      <goal>copy-resources</goal> 
     </goals> 
     <configuration> 
      <encoding>${project.build.sourceEncoding}</encoding> 
      <outputDirectory>${basedir}/after</outputDirectory> 
      <resources> 
      <resource> 
       <filtering>true</filtering> 
       <directory>${basedir}/before</directory> 
       <includes> 
       <include>**/*.product</include> 
       <include>**/*.inf</include> 
       </includes> 
      </resource> 
      </resources> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 

Điều này có vẻ quá mức cần thiết và tôi có cảm giác rằng tôi không sử dụng đúng plugin hoặc vấn đề này sẽ được xử lý theo cách khác. Có thể gắn mã hóa các ký tự đặc biệt trong các tệp thuộc tính trực tiếp:

aboutText=Version ${project.version} \u00a9 2012 blabla 

?

+0

bạn có cân nhắc viết plugin maven của riêng mình cho điều này không? (có thể có các tùy chọn bằng cách sử dụng các plugin kiến ​​nhưng đó chỉ là một dự đoán) – wemu

+0

Bạn có chắc chắn rằng bạn phải làm phần bổ sung cho các tập tin thuộc tính? Tôi nghĩ chỉ dành cho mã nguồn, trong khi các tệp thuộc tính là tài nguyên và do đó không có mã nguồn. – hennr

+0

'project.build.sourceEncoding' thực sự áp dụng cho' maven-resources-plugin', xem https://maven.apache.org/plugins/maven-resources-plugin/xref/org/apache/maven/plugin/resources/ Tài nguyênMojo.html # 69, giá trị mặc định cho 'encoding' là' project.build.sourceEncoding' –

Trả lời

2

Bạn đúng là bạn phải định cấu hình thực thi ... Bạn có thể thoát khỏi hai lần thực thi thay vì ba bạn dường như đang sử dụng nếu bạn đang theo dõi bố cục thư mục chuẩn nhưng dường như bạn đang đặt tệp từ ${basedir}/before vào ${basedir}/after để thực hiện mặc định resources:resources cùng với việc thêm nhiều resources vào phần build sẽ không hoạt động cho bạn.

Mã hóa các tập tin lọc là một giám sát trong đặc tả pom mô hình ban đầu và có thể sẽ được cố định trong một số phiên bản như được nêu ra không xác định của Maven

4

Câu hỏi đặt ra là một câu trả lời vô giá của riêng mình, như rõ ràng các thủ tục phức tạp các tác giả cung cấp là cách duy nhất để cấu hình các mã hóa khác nhau cho các loại tệp được lọc khác nhau. Ví dụ được đưa ra, tuy nhiên, cụ thể đối với trường hợp sử dụng phi tiêu chuẩn của tác giả và chú ý đến một số chi tiết quan trọng, mà không sử dụng thực tế ví dụ nào là phù hợp với gotchas:

  • Không rõ ràng, nhưng trong ví dụ của tác giả mục tiêu sao chép tài nguyên mặc định resources vẫn được bật và chạy ngoài hai mục tiêu đã xác định!
  • Bạn sẽ nhận thấy rằng tác giả đã sử dụng vòng đời generate-resources thay vì mặc định process-resources. Đây là một mẹo để vượt qua điểm đầu tiên ở trên; bằng cách thực hiện hai mục tiêu copy-resources xảy ra trong giai đoạn vòng đời trước, các tài nguyên được sao chép theo các quy tắc đã cho và sau đó khi mục tiêu default-resources xuất hiện cùng với bản sao tài nguyên gốc còn nguyên, rõ ràng là do cài đặt mặc định overwritefalse. Nhưng sẽ tốt hơn nếu thực hiện disable altogether việc thực hiện default-resources.
  • Tác giả cung cấp tuyên bố outputDirectory. Nó sẽ là tự nhiên để nghĩ rằng tác giả chỉ cung cấp này bởi vì một thư mục đầu ra tùy chỉnh đã được mong muốn; sau cùng, mục tiêu resources cung cấp giá trị mặc định cho cài đặt này. Tuy nhiên, kỳ lạ, đối với mục tiêu copy-resources, cài đặt này thực sự là bắt buộc! Tuy nhiên, có một biến Maven chuẩn ${project.build.outputDirectory} có thể được sử dụng làm giá trị.

Xây dựng trên ví dụ của tác giả trong câu hỏi, đây là cách cắt và dán để lọc tệp thuộc tính bằng ISO-8859-1, sao chép các tệp khác mà không lọc và ngăn sao chép tài nguyên mặc định ; tất cả bằng cách sử dụng thư mục nguồn và mục tiêu chuẩn:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-resources-plugin</artifactId> 
    <version>2.7</version> 
    <executions> 
    <execution> 
     <!-- Turn off default resource copying --> 
     <id>default-resources</id> 
     <phase /> 
    </execution> 
    <execution> 
     <!-- Filter resources in properties files. --> 
     <id>filter-properties-files</id> 
     <phase>process-resources</phase> 
     <goals> 
     <goal>copy-resources</goal> 
     </goals> 
     <configuration> 
     <encoding>ISO-8859-1</encoding> 
     <outputDirectory>${project.build.outputDirectory}</outputDirectory> 
     <resources> 
      <resource> 
      <directory>src/main/resources</directory> 
      <filtering>true</filtering> 
      <includes> 
       <include>**/*.properties</include> 
      </includes> 
      </resource> 
     </resources> 
     </configuration> 
    </execution> 
    <execution> 
     <!-- Do not do property substitution in files that are not properties files, such as binary files. --> 
     <id>copy-other-resources</id> 
     <phase>process-resources</phase> 
     <goals> 
     <goal>copy-resources</goal> 
     </goals> 
     <configuration> 
     <outputDirectory>${project.build.outputDirectory}</outputDirectory> 
     <resources> 
      <resource> 
      <directory>src/main/resources</directory> 
      <filtering>false</filtering> 
      <excludes> 
       <exclude>**/*.properties</exclude> 
      </excludes> 
      </resource> 
     </resources> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 
+0

Cảm ơn phản hồi này! Một câu hỏi: Làm thế nào điều này làm việc cùng với các nguồn lực và các tùy chọn lọc được xác định theo build.resources resp. build.testResources? Tôi có phải định cấu hình cả hai hoặc chỉ cấu hình plugin? – Puce

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