Mavenでエンコーディングを設定する方法は?


375

maven installマルチモジュールのmavenプロジェクトで実行すると、常に次の出力が得られます。

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

だから、私は少しググったが、私が見つけることができるすべては私が追加しなければならないことです:

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

...私のpom.xmlに。しかし、それはすでに存在しています(親pom.xml)。

設定<encoding>のmaven-リソース・プラグインやMavenコンパイラ・プラグイン、それを修正しないものために。

だから問題は何ですか?


1
UTF-8エンコーディングは、エンコーディングとして実際に指定したいものであることに注意してください。ISO-8859-1(別名Latin-1)やUS-ASCIIなどの単純なエンコーディングを使用したほうがよい場合があります。
rmp

40
「次のような単純なエンコーディングを使用した方がよいかもしれません...」そうです、そしてバグのエンドユーザーや他の開発者たち...今日では、UTF-8をできるだけ使用して他のことに注意することが最善です。エンコーディングは、マルチエンコーディングアプリケーション要件がユーザーにスローされた場合のみです。ここでは、主にソースファイルと構成ファイルのエンコーディングについて説明します。ユーザー入力のエンコーディングは異なる方法で管理されます( 'java -Dfile.encoding ...'を使用し、多くの面倒なプログラミング作業を伴います)。
zakmck 2013

私は個人的に、エンコーディングの問題が非常にわかりにくいため、pom.xmlでASCIIをエンコードすることにし、その後、エンコーディングの問題を最初に取り上げたと判断しました。これは当然、1日目から問題が発生する私の名前に非ASCII文字があることによって促されます。
ThorbjørnRavn Andersen

親pom.xmlにはどのエンコーディングが設定されていますか?
Ripon Al Wasim

回答:


535

問題は見つかりました。

一部のレポートプラグインを使用しています。failsafe-maven-plugin(http://maven.apache.org/plugins/maven-failsafe-plugin/integration-test-mojo.html)のドキュメントで、<encoding>設定-もちろん- ${project.reporting.outputEncoding}デフォルトで使用することがわかりました。だから私はproject要素の子要素としてプロパティを追加し、すべてが今うまくいきます:

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

こちらもご覧ください http://maven.apache.org/general.html#encoding-warning


だから私はこの問題があり、次のように上記のプロパティを追加しました:<profiles> <profile> <activation> <activeByDefault> true </ activeByDefault> </ activation> <id> local </ id> <properties> <url> Earnapi.intra1.e1.v2.epaas.aexp.com </ url > <project.build.sourceEncoding> UTF-8 </project.build.sourceEncoding> <project.reporting.outputEncoding> UTF-8 </project.reporting .outputEncoding> </ properties> </ profile>
Bob Small

いいえ、コーディングの唯一のグローバル設定は、envによって行われます。変数:stackoverflow.com/a/9976788/715269
Gangnus

これは、pom.xmlファイルのプロパティブロックに2つのプロパティを追加するときに予想どおりに機能します。ありがとう。
Jean Paul Ruiz

47

誰かが上記の解決策で解決されないスカンディック文字の問題に遭遇した場合、これは以前のものに追加されます。

Javaソースファイルにスカンディック文字が含まれている場合、それらはコンパイルに使用されるJavaによって正しく解釈される必要があります。(例:定数で使用されるスカンディック文字)

ファイルがUTF-8で保存されていて、MavenがUTF-8を使用するように設定されている場合でも、Mavenで使用されるシステムJavaは、システムのデフォルトを使用します(Windowsの場合:cp1252など)。

これは、mavenを介してテストを実行しているときにのみ表示されます(テストでこれらの定数の値を印刷する可能性があります。印刷されたスカンディック文字は '<?>'と表示されます)。適切にテストされない場合、コンパイル結果としてクラスファイルが破損し、見過ごされたまま。

これを防ぐには、コンパイルに使用するJavaを UTF-8エンコーディングを使用するように設定する必要があります。maven pom.xmlにエンコード設定を含めるだけでは不十分です。環境変数を設定する必要があります。JAVA_TOOL_OPTIONS = -Dfile.encoding = UTF8

また、WindowsでEclipseを使用している場合は、これに加えて使用するエンコードを設定する必要がある場合があります(Eclipseを使用して個別のテストを実行する場合)。


これはMavenではなくJVM設定であるため、これを行うためのMavenの方法があるかどうかはわかりません。
Ville Myrskyneva 2015

4
混同していると思います。-Dfile.encodingエンコーディングを明示的に指定せずにJavaでI / Oを使用する場合にのみ設定する必要があります(これは推奨されません)。これがJavaソースファイルのスカンディック文字とどう関係しているのかわかりません。project.build.sourceEncodingEthan Leroyの回答で説明されているように、が正しく設定されている場合、Javaソースファイルの非ASCIIはMavenで動作します。
sleske 2015

@sleske私は同じで十分だと思いますが、最初にここで終了してpom.xmlの変更を行ったとき、問題は解決しませんでした。さらに検索した後、試行錯誤した後、説明されている解決策が機能しました。Mavenがインストール済み/参照済みのJDKのjavacを呼び出し、次にJDKがデフォルトでO / Sエンコーディングを使用するため、何が起こるのかと思います。誰かがpom.xmlでjavac呼び出しのエンコーディングを指定する方法を知っている場合は、この問題を「優れた方法」で解決します。
Ville Myrskyneva、2015年

4
@VilleMyrskyneva:Mavenがを呼び出すとjavac、によって設定されたエンコーディングが渡されるためproject.build.sourceEncoding(を使用して確認できますmvn -X)、説明が必要な方法がわかりません。それでもプロジェクトでエンコードの問題が発生する場合は、別の質問として質問することを検討してください。別の問題が発生しているようです。理想的には、再現可能なテストケースを投稿します。
sleske

@sleske pom.xmlにproject.build.sourceEncodingがありますが、mvn testにはまだエンコーディングの問題があります。その-Dfile.encoding = UTF8はそれを解決します。理由がわかりません。stackoverflow.com/questions/42990644/...
Tiina

41

上記の答えを組み合わせると、最終的にはUTF-8用に構成されたpom.xmlはそのように見えるはずです。

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
デフォルトは$ {project.build.sourceEncoding}のようですので、maven-resources-pluginに対して明示的に定義する必要はありません(maven.apache.org/plugins/maven-resources-plugin/examples/…を参照)maven.apache.org / plugins / maven
George Birbilis

いいえ、コーディングの唯一のグローバル設定は、envによって行われます。変数:stackoverflow.com/a/9976788/715269
Gangnus

7

コンテンツエンコーディングとビルドされたファイル/リソースエンコーディングが混在しているようです。mavenプロパティのみでは十分ではありません。持つ-Dfile.encoding=UTF8有効ではありません。エンコーディングの問題を回避するには、次の簡単なルールに従う必要があります

  1. 上記のように、mavenエンコーディングを設定します。
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  1. コードでファイル、文字列、IOを使用する場合は、常に明示的にエンコーディングを設定してください。このルールに従わない場合、アプリケーションは環境に依存します。-Dfile.encoding=UTF8正確に実行時環境の設定に責任があるが、我々はそれに依存するべきではありません。数千のクライアントがある場合、システムを構成し、そのために発生する問題を見つけるのにより多くの労力が必要です。明示的に設定することで回避できる追加の依存関係があります。デフォルトのエンコーディングを使用するJavaのほとんどのメソッドは、そのため非推奨としてマークされています。

  2. 作業しているコンテンツが、期待どおりの同じエンコーディングであることを確認してください。そうでない場合、前の手順は重要ではありません。たとえば、エンコーディングがUTF8でない場合でも、ファイルが正しく処理されません。Linuxでファイルのエンコードを確認するには:

$ file --mime F_PRDAUFT.dsv

  1. リクエスト/レスポンスでクライアント/サーバーセットのエンコーディングを明示的に強制します。以下に例を示します。
@Produces("application/json; charset=UTF-8")
@Consumes("application/json; charset=UTF-8")

これが誰かに役立つことを願っています。


いいえ、コーディングの唯一のグローバル設定は、envによって行われます。変数:stackoverflow.com/a/9976788/715269
Gangnus

6

これを試して:

<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>

特に重要なのは、ソースだけでなくリソースにもこのエンコード設定が必要であることを忘れないでください。
peterh-モニカを2017年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.