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>받는다는 - 자원 - 플러그인 또는 받는다는 - 컴파일러 플러그인을 수정하지 않습니다도합니다.

그래서 무엇이 문제입니까?


1
UTF-8 인코딩은 실제로 인코딩으로 지정하려는 것입니다. ISO-8859-1 (일명 Latin-1) 또는 US-ASCII와 같은 간단한 인코딩을 사용하는 것이 좋습니다.
rmp

40
"예를 들어 ...와 같은 간단한 인코딩을 사용하는 것이 더 나을 수 있습니다. 예, 다른 개발자뿐만 아니라 버그 최종 사용자도 있습니다. 요즘에는 UTF-8을 최대한 사용하고 다른 사용자를주의하는 것이 가장 좋습니다. 다중 인코딩 응용 프로그램 요구 사항이 발생하는 경우에만 인코딩합니다. 여기서 우리는 주로 소스 및 구성 파일의 인코딩에 대해 이야기하고 있으며 사용자 입력의 인코딩은 다르게 관리됩니다 ( 'java -Dfile.encoding ...'및 많은 고통스러운 프로그래밍 노력으로).
zakmck

나는 개인적으로 인코딩 문제가 너무 애매하여 pom.xml에서 ASCII를 인코딩 한 다음 인코딩 문제를 미리 결정했습니다. 이것은 자연스럽게 :) 1 일에서 문제를주는 내 이름에 비 ASCII 문자를함으로써하라는 메시지가 표시됩니다
Thorbjørn Ravn 안데르센

부모 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> earneventapi.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 파일의 properties 블록에 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를 사용하는 경우 이클립스를 통해 개별 테스트를 실행하는 경우 이외에도 사용되는 인코딩을 설정해야 할 수도 있습니다.


Maven이 아닌 JVM 설정 이므로이 작업을 수행하는 maven 방법이 있는지 확실하지 않습니다.
Ville Myrskyneva

4
나는 당신이 일을 섞고 있다고 생각합니다. -Dfile.encoding인코딩을 명시 적으로 지정하지 않고 Java에서 I / O를 사용하는 경우 에만 설정 하면됩니다 (권장하지 않음). Java 소스 파일의 스캔 문자와 관련이 없습니다. project.build.sourceEncodingEthan Leroy의 답변에 설명 된 것처럼 Java 소스 파일의 비 ASCII는 Maven과 올바르게 설정 되면 작동 합니다.
sleske

@ sleske 나는 같은 것으로 충분하다고 생각하지만, 여기에서 처음 끝내고 pom.xml 변경을 수행했을 때 문제가 해결되지 않았습니다. 더 많은 검색 후와 시행 착오 후에 설명 된 솔루션이 효과가있었습니다. 필자는 maven이 설치 / 참조 JDK의 javac를 호출하여 기본적으로 O / S 인코딩을 사용하기 때문에 발생하는 이유라고 생각합니다. 누군가가 pom.xml에서 javac 호출에 대한 인코딩을 지정하는 방법을 알고 있다면 "maven way"로이 문제를 해결할 것입니다.
Ville Myrskyneva

4
@VilleMyrskyneva : Maven이 호출하면에 javac의해 설정된 인코딩을 전달하므로 project.build.sourceEncoding(를 사용하여 확인할 수 있음 mvn -X) 설명하는 내용이 어떻게 필요한지 알 수 없습니다. 여전히 프로젝트에서 인코딩 문제가 발생하면 별도의 질문으로 질문하십시오. 다른 문제가 발생하는 것 같습니다. 이상적으로는 재현 가능한 테스트 사례를 게시하십시오.
sleske

@ sleske pom.xml에 project.build.sourceEncoding이 있지만 mvn 테스트에는 여전히 인코딩에 문제가 있습니다. 그 동안 -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-resources-plugin/… , maven.apache.org/general.html#encoding-warning )
George Birbilis

아니요, 코딩의 유일한 글로벌 설정은 env에 의해 수행됩니다. 변수 : stackoverflow.com/a/9976788/715269
Gangnus

7

사람들은 컨텐츠 인코딩을 빌드 된 파일 / 리소스 인코딩과 혼합하는 것 같습니다. 메이븐 속성만으로는 충분하지 않습니다. 데-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에서 파일 인코딩을 확인하려면 다음을 수행하십시오.

$ 파일 --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-Reinstate Monica

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.