จะกำหนดค่าการเข้ารหัสใน Maven ได้อย่างไร


375

เมื่อฉันทำงานmaven installในโครงการ maven โมดูลของฉันฉันมักจะได้รับผลลัพธ์ต่อไปนี้:

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

ดังนั้นฉัน googled รอบเล็กน้อย แต่สิ่งที่ฉันสามารถหาได้คือฉันต้องเพิ่ม:

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

... ถึง pom.xml ของฉัน แต่มันมีอยู่แล้ว (ในแม่pom.xml)

การกำหนดค่า<encoding>สำหรับ maven-resources-plugin หรือ maven-compiler-plugin ยังไม่สามารถแก้ไขได้

แล้วปัญหาคืออะไร


1
ระวังการเข้ารหัส UTF-8 เป็นสิ่งที่คุณต้องการระบุเป็นการเข้ารหัส คุณอาจจะดีกว่าด้วยการเข้ารหัสที่ง่ายกว่าเช่น ISO-8859-1 (aka Latin-1) หรือแม้แต่ US-ASCII
rmp

40
"คุณอาจจะดีกว่าถ้าใช้การเข้ารหัสที่ง่ายกว่าเช่น ... " ใช่และผู้ใช้บั๊กปลายทางรวมถึงผู้พัฒนารายอื่น ... ทุกวันนี้มันเป็นการดีที่สุดที่จะใช้ UTF-8 ให้มากที่สุดและใส่ใจกับเรื่องอื่น ๆ การเข้ารหัสเฉพาะเมื่อมีความต้องการแอปพลิเคชันการเข้ารหัสหลายตัวที่ส่งถึงคุณ ที่นี่เรากำลังพูดถึงการเข้ารหัสแหล่งที่มาและไฟล์การกำหนดค่าส่วนใหญ่การเข้ารหัสการป้อนข้อมูลของผู้ใช้มีการจัดการที่แตกต่างกัน (ด้วย 'java -Dfile.encoding ... ' และด้วยความพยายามเขียนโปรแกรมที่เจ็บปวดมากมาย)
zakmck

ฉันเองตัดสินใจว่าปัญหาการเข้ารหัสนั้นยากมากจนฉันไปเข้ารหัส ASCII ใน pom.xml แล้วจึงนำปัญหาการเข้ารหัสขึ้นด้านหน้า นี่คือพรอมต์ตามธรรมชาติโดยการมีตัวละครที่ไม่ใช่ ASCII ในชื่อของฉันให้ปัญหาตั้งแต่วันที่ 1 :)
39432 Thorbjørn Ravn Andersen

การเข้ารหัสใดที่ถูกตั้งค่าใน parent pom.xml
Ripon Al Wasim

คำตอบ:


535

ตกลงฉันพบปัญหา

ฉันใช้ปลั๊กอินรายงานบางตัว ในเอกสารของ Failafe-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> <activati ​​on> <activeByDefault> จริง </activeByDefault> </activation> </activ>> </id> ท้องถิ่น </id> <properties> <properties> earneventapi.intra1.e1.v2.epaas.aexp.com </ url > <project.build.sourceEncoding> UTF-8 </project.build.sourceEncoding> <project.reporting.outputEncoding> UTF-8 .outputEncoding> </properties> </profile>
Bob Small

ไม่จำเป็นต้องทำการตั้งค่าระดับโลกสำหรับการเข้ารหัสเท่านั้นโดย env ตัวแปร: stackoverflow.com/a/9976788/715269
Gangnus

สิ่งนี้ทำงานได้อย่างที่คาดไว้ในขณะที่เพิ่มคุณสมบัติ 2 ลงในบล็อกคุณสมบัติของไฟล์ pom.xml ขอบคุณ
Jean Paul Ruiz

47

สิ่งนี้จะเป็นเพิ่มเติมจากก่อนหน้านี้หากมีคนพบปัญหากับตัวอักษรสแกนดิชที่ไม่ได้รับการแก้ไขด้วยวิธีการแก้ปัญหาข้างต้น

หากไฟล์ที่มา Java ประกอบด้วยตัวอักษร Scandic พวกเขาจะต้องตีความอย่างถูกต้องโดยJava ใช้สำหรับการรวบรวม (เช่นตัวอักษรสแกนดิชที่ใช้ในค่าคงที่)

แม้ไฟล์จะถูกเก็บไว้ใน UTF-8 และ Maven ก็ถูกกำหนดค่าให้ใช้ UTF-8 แต่ System Java ที่ใช้โดย Maven จะยังคงใช้ค่าเริ่มต้นของระบบ (เช่นใน Windows: cp1252)

สิ่งนี้จะปรากฏให้เห็นเฉพาะการรันการทดสอบผ่านทาง Maven (อาจจะพิมพ์ค่าของค่าคงที่เหล่านี้ในการทดสอบตัวอักษร scandic ที่พิมพ์ออกมาจะแสดงเป็น '<?>') หากไม่ได้ทดสอบอย่างถูกต้อง ไม่มีใครสังเกตเห็น

เพื่อป้องกันสิ่งนี้คุณต้องตั้งค่าJava ที่ใช้สำหรับการคอมไพล์เพื่อใช้การเข้ารหัส UTF-8 ไม่เพียงพอที่จะมีการตั้งค่าการเข้ารหัสใน maven pom.xml คุณต้องตั้งค่าตัวแปรสภาพแวดล้อม: JAVA_TOOL_OPTIONS = -Dfile.encoding = UTF8

นอกจากนี้หากใช้ Eclipse ใน Windows คุณอาจต้องตั้งค่าการเข้ารหัสที่ใช้เพิ่มเติมนอกเหนือจากนี้


ไม่แน่ใจว่ามีวิธี maven ที่จะทำเช่นนี้เพราะนี่คือการตั้งค่า JVM ไม่ใช่ Maven
Ville Myrskyneva

4
ฉันคิดว่าคุณกำลังผสมปนเป คุณต้องตั้งค่า-Dfile.encodingถ้าคุณใช้ I / O ใน Java โดยไม่ต้องระบุการเข้ารหัสอย่างชัดเจน (ซึ่งไม่แนะนำ) ฉันไม่เห็นสิ่งนี้จะทำอย่างไรกับตัวอักษร scandic ในไฟล์ต้นฉบับ Java Non-ASCII ในซอร์สไฟล์ Java ทำงานร่วมกับ Maven เมื่อproject.build.sourceEncodingตั้งค่าอย่างถูกต้องดังอธิบายในคำตอบของ Ethan Leroy
sleske

@sleske ฉันจะถือว่าเหมือนกันจะเพียงพอ แต่เมื่อฉันสิ้นสุดที่นี่ครั้งแรกและทำการเปลี่ยนแปลง pom.xml มันไม่ได้แก้ไขปัญหาของฉัน หลังจากการค้นหาเพิ่มเติมและหลังจากการทดลองและข้อผิดพลาดการแก้ปัญหาที่อธิบายไว้ทำงานได้ ฉันคิดว่าสาเหตุของสิ่งที่เกิดขึ้นคือเพราะ maven เรียก javac ของ JDK ที่ติดตั้ง / อ้างอิงซึ่งจะใช้การเข้ารหัส O / S เป็นค่าเริ่มต้น หากมีคนรู้วิธีระบุการเข้ารหัสสำหรับการโทร javac ใน pom.xml จะแก้ปัญหานี้ใน "วิธี maven"
Ville Myrskyneva

4
@VilleMyrskyneva: เมื่อ Maven เรียกใช้javacมันจะผ่านการเข้ารหัสที่กำหนดโดยproject.build.sourceEncoding(คุณสามารถตรวจสอบการใช้mvn -X) ดังนั้นฉันไม่เห็นว่าสิ่งที่คุณอธิบายเป็นสิ่งที่จำเป็น หากคุณยังคงมีปัญหาการเข้ารหัสในโครงการของคุณให้พิจารณาถามว่าเป็นคำถามแยกต่างหาก - ดูเหมือนว่าคุณกำลังประสบปัญหาอื่น เป็นการดีที่โพสต์กรณีทดสอบที่ทำซ้ำได้
sleske

@sleske ฉันมี project.build.sourceEncoding ใน pom.xml แต่การทดสอบ mvn ยังคงมีปัญหากับการเข้ารหัส ในขณะที่ -Dfile.encoding = UTF8 แก้มัน ฉันไม่เข้าใจว่าทำไม stackoverflow.com/questions/42990644/…
Tiina

41

หากคุณรวมคำตอบข้างต้นสุดท้าย pom.xml ที่กำหนดค่าสำหรับ UTF-8 ควรดูเหมือนว่า

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

ดูเหมือนว่าคนผสมการเข้ารหัสเนื้อหากับการเข้ารหัสไฟล์ / ทรัพยากรที่สร้างขึ้น มีคุณสมบัติ 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 - Reinstate Monica

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.