Làm cách nào để định cấu hình mã hóa trong Maven?


375

Khi tôi chạy maven installtrên dự án maven đa mô-đun, tôi luôn nhận được đầu ra sau:

[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!

Vì vậy, tôi đã đi vòng quanh một chút, nhưng tất cả những gì tôi có thể tìm thấy là tôi phải thêm:

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

... đến tệp pom.xml của tôi. Nhưng nó đã ở đó (trong cha mẹ pom.xml).

Cấu hình <encoding>cho plugin maven-resource-plugin hoặc maven-Trình biên dịch-plugin cũng không khắc phục được.

Vậy vấn đề là gì?


1
Hãy cẩn thận rằng mã hóa UTF-8 là những gì bạn thực sự muốn chỉ định làm mã hóa. Bạn có thể tốt hơn bằng cách sử dụng một mã hóa đơn giản hơn như ISO-8859-1 (còn gọi là Latin-1) hoặc thậm chí US-ASCII.
rmp

40
"Bạn có thể tốt hơn khi sử dụng một mã hóa đơn giản hơn như ..." vâng, và người dùng cuối lỗi, cũng như các nhà phát triển khác ... Hiện tại, tốt nhất bạn nên thử sử dụng UTF-8 càng nhiều càng tốt và quan tâm đến người khác mã hóa chỉ khi một yêu cầu ứng dụng đa mã hóa được ném cho bạn. Ở đây, chúng ta chủ yếu nói về việc mã hóa các tệp nguồn và cấu hình, mã hóa đầu vào của người dùng được quản lý khác nhau (với 'java -Dfile.encoding ...' và với rất nhiều nỗ lực lập trình đau đớn).
zakmck

Cá nhân tôi đã quyết định rằng các vấn đề mã hóa khó nắm bắt đến nỗi tôi đã mã hóa ASCII trong pom.xml và sau đó đưa vấn đề mã hóa lên phía trước. Điều này được nhắc nhở một cách tự nhiên bằng cách có một ký tự không phải ASCII trong tên của tôi đưa ra các vấn đề từ ngày 1 :)
Thorbjørn Ravn Andersen

Mã hóa nào được đặt trong pom.xml cha mẹ?
Ripon Al Wasim

Câu trả lời:


535

OK, tôi tìm thấy vấn đề.

Tôi sử dụng một số plugin báo cáo. Trong tài liệu về failafe-maven-plugin ( http://maven.apache.org/plugins/maven-failsafe-plugin/integration-test-mojo.html ) tôi thấy rằng <encoding>cấu hình - tất nhiên - sử dụng ${project.reporting.outputEncoding}theo mặc định . Vì vậy, tôi đã thêm thuộc tính như là một phần tử con của projectphần tử và bây giờ mọi thứ đều ổn:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>

Xem thêm http://maven.apache.org/general.html#encoding-warning


Vì vậy, tôi đã gặp vấn đề này và tôi đã thêm các thuộc tính từ phía trên như thế này: <profile> <profile> <activ> <activeByDefault> true </ activeByDefault> </ activ> <id> local </ id> <property> <url> Earneventapi.intra1.e1.v2.epaas.aapid.com </ url > <project.build.sourceEncoding> UTF-8 </project.build.sourceEncoding> <project.reporting.outputEncoding> UTF-8 .outputEncoding> </ property> </ profile>
Bob Small

Không, cài đặt mã hóa toàn cầu duy nhất là được thực hiện bởi env. biến: stackoverflow.com/a/9976788/715269
Gangnus

Điều này hoạt động như mong đợi trong khi thêm 2 thuộc tính vào khối thuộc tính của tệp pom.xml. Cảm ơn.
Jean Paul Ruiz

47

Điều này sẽ được bổ sung vào trước đó, nếu ai đó gặp vấn đề với các chữ cái scandic không được giải quyết với giải pháp ở trên.

Nếu các tệp nguồn java chứa các chữ cái scandic, chúng cần được giải thích chính xác bởi Java được sử dụng để biên dịch . (ví dụ: các chữ cái scandic được sử dụng trong các hằng số)

Ngay cả khi các tệp được lưu trữ trong UTF-8 và Maven được định cấu hình để sử dụng UTF-8, Java hệ thống được sử dụng bởi Maven vẫn sẽ sử dụng mặc định hệ thống (ví dụ: trong Windows: cp1252).

Điều này sẽ chỉ hiển thị khi chạy thử nghiệm thông qua maven (có thể in các giá trị của các hằng số này trong các thử nghiệm. Các chữ cái scandic được in sẽ hiển thị là '<?>') Nếu không được kiểm tra đúng cách, điều này sẽ làm hỏng các tệp lớp dưới dạng kết quả biên dịch và bị không để ý

Để ngăn chặn điều này, bạn phải đặt Java được sử dụng để biên dịch để sử dụng mã hóa UTF-8. Không đủ để có các cài đặt mã hóa trong maven pom.xml, bạn cần đặt biến môi trường: JAVA_TOOL_OPTIONS = -Dfile.encoding = UTF8

Ngoài ra, nếu sử dụng Eclipse trong Windows, bạn có thể cần phải thiết lập mã hóa được sử dụng bổ sung cho điều này (nếu bạn chạy thử nghiệm riêng lẻ qua nhật thực).


Không chắc chắn nếu có một cách maven để làm điều này, vì đây là cài đặt JVM, không phải Maven.
Ville Myrskyneva

4
Tôi nghĩ rằng bạn đang trộn lẫn mọi thứ. Bạn chỉ cần đặt -Dfile.encodingnếu bạn sử dụng I / O trong Java mà không chỉ định rõ ràng mã hóa (không được khuyến nghị). Tôi không thấy điều này có liên quan đến các chữ cái scandic trong các tệp nguồn Java. Non-ASCII trong các tệp nguồn Java hoạt động với Maven khi project.build.sourceEncodingđược đặt chính xác, như được mô tả trong câu trả lời của Ethan Leroy.
sleske

@sleske Tôi cho rằng điều tương tự là đủ, nhưng khi tôi lần đầu tiên kết thúc ở đây và thực hiện các thay đổi pom.xml, nó đã không khắc phục vấn đề của tôi. Sau khi tìm kiếm nhiều hơn và sau khi dùng thử và lỗi, giải pháp được mô tả đã hoạt động. Tôi nghĩ rằng lý do cho những gì xảy ra là vì maven gọi javac của JDK đã cài đặt / được giới thiệu, lần lượt sử dụng mã hóa O / S làm mặc định. Nếu ai đó biết một cách chỉ định mã hóa cho lệnh gọi javac trong pom.xml sẽ giải quyết vấn đề này theo "cách maven".
Ville Myrskyneva

4
@VilleMyrskyneva: Khi Maven gọi javac, nó sẽ chuyển qua bộ mã hóa bằng cách project.build.sourceEncoding(bạn có thể kiểm tra bằng cách sử dụng mvn -X), vì vậy tôi không thấy những gì bạn mô tả là cần thiết. Nếu bạn vẫn gặp vấn đề về mã hóa trong dự án của mình, hãy xem xét việc hỏi đó như một câu hỏi riêng biệt - có vẻ như bạn đang gặp phải một vấn đề khác. Lý tưởng nhất, gửi một trường hợp thử nghiệm tái sản xuất.
sleske

@sleske Tôi có project.build.sourceEncoding trong pom.xml, nhưng kiểm tra mvn vẫn có vấn đề với mã hóa. trong khi đó -Dfile.encoding = UTF8 giải quyết nó. Tôi không hiểu tại sao. stackoverflow.com/questions/42990644/ từ
Tiina

41

Nếu bạn kết hợp các câu trả lời ở trên, cuối cùng, một tệp pom.xml được định cấu hình cho UTF-8 sẽ giống như vậy.

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>YOUR_COMPANY</groupId>
    <artifactId>YOUR_APP</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <properties>
        <project.java.version>1.8</project.java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <dependencies>
        <!-- Your dependencies -->
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.7.0</version>
                <configuration>
                    <source>${project.java.version}</source>
                    <target>${project.java.version}</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.0.2</version>
                <configuration>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

1
mặc định dường như là $ {project.build.sourceEncoding}, vì vậy bạn không cần xác định rõ ràng cho plugin maven-resource-plugin (xem maven.apache.org/plugins/maven-resource-plugin/examples/ , maven.apache.org/plugins/maven-resources-plugin/... , maven.apache.org/general.html#encoding-warning )
George Birbilis

Không, cài đặt mã hóa toàn cầu duy nhất là được thực hiện bởi env. biến: stackoverflow.com/a/9976788/715269
Gangnus

7

Dường như mọi người trộn mã hóa nội dung với mã hóa tệp / tài nguyên được xây dựng. Chỉ có thuộc tính maven là không đủ. Có -Dfile.encoding=UTF8hiệu quả. Để tránh gặp sự cố với mã hóa, bạn nên tuân theo các quy tắc đơn giản sau

  1. Đặt mã hóa maven, như được mô tả ở trên:
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  1. Luôn đặt mã hóa rõ ràng, khi làm việc với các tệp, chuỗi, IO trong mã của bạn. Nếu bạn không tuân theo quy tắc này, ứng dụng của bạn phụ thuộc vào môi trường. Chính -Dfile.encoding=UTF8xác chịu trách nhiệm cho cấu hình môi trường thời gian chạy, nhưng chúng ta không nên phụ thuộc vào nó. Nếu bạn có hàng ngàn khách hàng, phải mất nhiều nỗ lực hơn để định cấu hình hệ thống và tìm sự cố vì nó. Bạn chỉ cần có một sự phụ thuộc bổ sung vào nó mà bạn có thể tránh bằng cách đặt nó rõ ràng. Hầu hết các phương thức trong Java sử dụng mã hóa mặc định được đánh dấu là không dùng nữa vì nó.

  2. Hãy chắc chắn rằng nội dung mà bạn đang làm việc cũng nằm trong cùng một mã hóa mà bạn mong đợi. Nếu không, các bước trước không thành vấn đề! Ví dụ, một tệp sẽ không được xử lý chính xác, nếu mã hóa của nó không phải là UTF8 nhưng bạn mong đợi nó. Để kiểm tra mã hóa tệp trên Linux:

$ tập tin --mime F_PRDAUFT.dsv

  1. Buộc khách hàng / máy chủ thiết lập mã hóa rõ ràng trong các yêu cầu / phản hồi, đây là các ví dụ:
@Produces("application/json; charset=UTF-8")
@Consumes("application/json; charset=UTF-8")

Hy vọng điều này sẽ hữu ích cho một ai đó.


Không, cài đặt mã hóa toàn cầu duy nhất là được thực hiện bởi env. biến: stackoverflow.com/a/9976788/715269
Gangnus

6

Thử cái này:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.7</version>
        <configuration>
          ...
          <encoding>UTF-8</encoding>
          ...
        </configuration>
      </plugin>
    </plugins>
    ...
  </build>
  ...
</project>

Đặc biệt quan trọng, chúng ta không nên quên rằng không chỉ các nguồn, mà cả các tài nguyên cũng cần cài đặt mã hóa này.
peterh - Tái lập Monica

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.