[java] Maven에서 인코딩을 구성하는 방법은 무엇입니까?

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

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



답변

좋아, 나는 문제를 발견했다.

일부보고 플러그인을 사용합니다. 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


답변

누군가가 위의 해결책으로 해결되지 않는 스캔 같은 글자의 문제를 만난다면 이전에 추가되었을 것입니다.

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


답변

위의 답변을 결합하면 마지막으로 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>


답변

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

이것이 누군가에게 도움이되기를 바랍니다.


답변

이 시도:

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


답변

내 경우 maven-dependency-plugin에는 문제를 해결하기 위해 그렇게 사용하고 있었고 다음 속성을 추가해야했습니다.

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

Apache Maven Resources 플러그인 / 문자 인코딩 체계 지정을 참조하십시오.


답변