Maven'de kodlama nasıl yapılandırılır?


375

Koştuğumda maven installÇoklu modül maven projemde her zaman aşağıdaki çıktıyı alıyorum:

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

Yani, biraz googled, ama bulabildiğim tek şey eklemek zorunda olduğum:

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

... pom.xml'ime. Ama zaten orada (ebeveynte)pom.xml ).

yapılandırma <encoding>Maven-resources-plugin veya maven-compiler-plugin için da sorunu çözmez.

Peki sorun ne?


1
UTF-8 kodlamasının kodlama olarak belirtmek istediğiniz şey olduğuna dikkat edin. ISO-8859-1 (diğer adıyla Latin-1) ve hatta US-ASCII gibi daha basit bir kodlama kullanarak daha iyi olabilirsiniz.
rmp

40
"Daha basit bir kodlama kullanmaktan daha iyi olabilirsiniz ..." evet, hata son kullanıcıları ve diğer geliştiriciler ... Günümüzde UTF-8'i mümkün olduğunca kullanmaya ve diğerlerine özen göstermeye çalışmak en iyisidir yalnızca size bir çoklu kodlama uygulaması gereksinimi atıldığında kodlanır. Burada, çoğunlukla kaynak ve yapılandırma dosyalarının kodlanmasından bahsediyoruz, kullanıcı girişinin kodlaması farklı şekilde yönetiliyor ('java -Dfile.encoding ...' ve çok acı verici programlama çabasıyla).
zakmck

Şahsen kodlama sorunlarının o kadar zor olduğuna karar verdim ki pom.xml'de ASCII kodlamak için gittim ve sonra kodlama sorunlarını ön plana çıkardım. Bu, doğal olarak benim
adımda

Ana pom.xml dosyasında hangi kodlama ayarlanır?
Ripon Al Wasim

Yanıtlar:


535

Tamam, problemi buldum.

Bazı raporlama eklentileri kullanıyorum. Failsafe-maven-eklentisinin belgelerinde ( http://maven.apache.org/plugins/maven-failsafe-plugin/integration-test-mojo.html ), <encoding>yapılandırmanın ${project.reporting.outputEncoding}varsayılan olarak kullanıldığını buldum . Böylece özelliği elemanın alt öğesi olarak ekledim ve projectşimdi her şey yolunda:

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

Ayrıca bakınız http://maven.apache.org/general.html#encoding-warning


Bu sorunu yaşadım ve yukarıdaki özellikleri şöyle ekledim: <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 Küçük

Hayır, kodlamanın tek küresel ayarı env tarafından yapılmalıdır. değişken: stackoverflow.com/a/9976788/715269
Gangnus

Bu, pom.xml dosyasının özellikler bloğuna 2 özellik eklenirken beklendiği gibi çalışır. Teşekkürler.
Jean Paul Ruiz

47

Birisi yukarıdaki çözümle çözülemeyen İskandinav harfleriyle bir sorunla karşılaşırsa, bu öncekine ek olacaktır.

Java kaynak dosyalarında scandic harfler varsa, derleme için kullanılan Java tarafından doğru yorumlanması gerekir . (örneğin sabitlerde kullanılan scandic harfler)

Dosyalar UTF-8'de depolanmış ve Maven UTF-8 kullanacak şekilde yapılandırılmış olsa bile, Maven tarafından kullanılan Sistem Java hala sistem varsayılanını kullanacaktır (örn. Windows'ta: cp1252).

Bu sadece testler maven üzerinden gerçekleştirilebilir (muhtemelen bu sabitlerin değerlerini testlerde yazdırılır. Basılı İskandinav harfleri '<?>' Olarak gösterilir) Düzgün test edilmezse, sınıf dosyalarını derleme sonucu olarak bozar ve fark edilmeden bırakıldı.

Bunu önlemek için, derleme için kullanılan Java'yı UTF-8 kodlamasını kullanacak şekilde ayarlamanız gerekir . Kodlama ayarlarının maven pom.xml dosyasında olması yeterli değildir, ortam değişkenini ayarlamanız gerekir: JAVA_TOOL_OPTIONS = -Dfile.encoding = UTF8

Ayrıca, Windows'ta Eclipse kullanıyorsanız, buna ek olarak kullanılan kodlamayı ayarlamanız gerekebilir (eclipse aracılığıyla bireysel test çalıştırırsanız).


Maven değil, bir JVM ayarı olduğu için bunu yapmanın maven bir yolu olup olmadığından emin değilim.
Ville Myrskyneva

4
Bence işleri karıştırıyorsun. -Dfile.encodingJava'da yalnızca bir kodlama belirtmeden (önerilmez) G / Ç kullanıyorsanız ayarlamanız gerekir . Bunun Java kaynak dosyalarındaki scandic harflerle ne ilgisi olduğunu anlamıyorum. Java kaynak dosyalarındaki ASCII olmayan project.build.sourceEncoding, Ethan Leroy'un cevabında açıklandığı gibi doğru ayarlandığında Maven ile çalışır .
sleske

@sleske Ben de aynı olacağını varsayacağım, ama burada ilk sona erdiğinde ve pom.xml değişiklikleri yaptım, sorunumu çözmedi. Daha fazla aramadan ve deneme yanılma işleminden sonra açıklanan çözüm işe yaradı. Ben ne olduğunu nedeni maven yüklü / yönlendirilen JDK javac çağırır çünkü sırayla O / S kodlama varsayılan olarak kullanmak olduğunu düşünüyorum. Birisi pom.xml'deki javac çağrısının kodlamasını belirtmenin bir yolunu biliyorsa, bu sorunu "maven" biçiminde çözecektir.
Ville Myrskyneva

4
@VilleMyrskyneva: Maven çağırdığında javac, tarafından ayarlanan kodlamayı geçecektir project.build.sourceEncoding(kullanarak kontrol edebilirsiniz mvn -X), bu yüzden tarif ettiğiniz şeyin nasıl gerekli olduğunu görmüyorum. Projenizde hala kodlama sorunları yaşıyorsanız, bunu ayrı bir soru olarak sormayı düşünün - farklı bir sorunla karşılaşıyorsunuz. İdeal olarak, tekrarlanabilir bir test vakası yayınlayın.
sleske

@sleske pom.xml dosyasında project.build.sourceEncoding var, ancak mvn testinin kodlamada hala bir sorunu var. -Dfile.encoding = UTF8 bunu çözer. Nedenini anlamıyorum. stackoverflow.com/questions/42990644/…
Tiina

41

Yukarıdaki cevapları birleştirirseniz, sonunda UTF-8 için yapılandırılmış bir pom.xml böyle görünmelidir.

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
varsayılan $ {project.build.sourceEncoding} gibi görünüyor, bu yüzden maven-resources-plugin için açıkça tanımlamanız gerekmemelidir (bkz. maven.apache.org/plugins/maven-resources-plugin/examples/… , maven.apache.org/plugins/maven-resources-plugin/… , maven.apache.org/general.html#encoding-warning )
George Birbilis 29:18

Hayır, kodlamanın tek küresel ayarı env tarafından yapılmalıdır. değişken: stackoverflow.com/a/9976788/715269
Gangnus

7

İnsanlar bir içerik kodlamasını yerleşik bir dosya / kaynak kodlaması ile karıştırıyor gibi görünüyor. Sadece maven özelliklerine sahip olmak yeterli değildir. Having -Dfile.encoding=UTF8değil etkili. Kodlama ile ilgili sorun yaşamamak için aşağıdaki basit kurallara uymalısınız

  1. Maven kodlamasını yukarıda açıklandığı gibi ayarlayın:
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  1. Kodunuzdaki dosyalar, dizeler, IO ile çalışırken kodlamayı her zaman açıkça ayarlayın. Bu kurala uymazsanız, uygulamanız ortama bağlıdır. Çalışma -Dfile.encoding=UTF8zamanı ortam yapılandırmasından tam olarak sorumludur, ancak buna bağlı olmamalıyız. Binlerce istemciniz varsa, sistemleri yapılandırmak ve bu nedenle sorunları bulmak daha fazla çaba gerektirir. Açık bir şekilde ayarlayarak önleyebileceğiniz ek bir bağımlılığınız var. Java'da varsayılan kodlama kullanan çoğu yöntem, bu nedenle kullanımdan kaldırılmış olarak işaretlenir.

  2. Üzerinde çalıştığınız içeriğin, beklediğiniz kodlamayla aynı olduğundan emin olun. Değilse, önceki adımlar önemli değil! Örneğin, kodlaması UTF8 değilse ancak beklediğiniz bir dosya düzgün işlenmeyecektir. Linux'ta dosya kodlamasını kontrol etmek için:

$ dosya --mime F_PRDAUFT.dsv

  1. İstemcileri / sunucu kümesini kodlamayı isteklerde / yanıtlarda açıkça zorlayın, işte örnekler:
@Produces("application/json; charset=UTF-8")
@Consumes("application/json; charset=UTF-8")

Umarım bu birisi için yararlı olur.


Hayır, kodlamanın tek küresel ayarı env tarafından yapılmalıdır. değişken: stackoverflow.com/a/9976788/715269
Gangnus

6

Bunu dene:

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

Özellikle önemli olan, sadece kaynakların değil, kaynakların da bu kodlama ayarına ihtiyaç duyduğunu unutmamalıyız.
peterh - Monica

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.