web-dev-qa-db-ja.com

Mavenでエンコーディングを設定するにはどうすればいいですか?

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

[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)。

Maven-resources-pluginまたはmaven-compiler-plugin用に<encoding>を設定しても修正されません。

だから問題は何ですか?

324
Ethan Leroy

さて、私は問題を見つけました。

私はいくつかの報告プラグインを使います。 failafe-maven-plugin( http://maven.Apache.org/plugins/maven-failsafe-plugin/integration-test-mojo.html )のドキュメントで、<encoding>が見つかりましたconfiguration - もちろん - デフォルトでは${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 もご覧ください。

479
Ethan Leroy

上記の解決策では解決できないスカンディックレターの問題に誰かが遭遇した場合、これは以前のものに追加されるでしょう。

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

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

これは、mavenでテストを実行している場合にのみ表示されます(おそらくテストでこれらの定数の値を表示します。印刷されたスカンディック文字は '<?>'と表示されます)。気づかれないままに。

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

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

40

上記の答えを組み合わせると、最後に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>
33
bhdrk

これを試して:

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

私の場合はmaven-dependency-pluginを使用していたので、この問題を解決するために次のプロパティを追加する必要がありました。

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

Apache Maven Resources Plugin /文字エンコーディングスキームの指定 をご覧ください。

1
isapir

人々はコンテンツのエンコーディングとビルドされたファイル/リソースのエンコーディングを混ぜ合わせているようです。 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")

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

0
Alexandr