मावेन में एन्कोडिंग कैसे कॉन्फ़िगर करें?


375

जब मैं 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) है।

<encoding>मावेन-संसाधन-प्लगइन या मावेन-कंपाइलर-प्लगइन के लिए कॉन्फ़िगर करना भी इसे ठीक नहीं करता है।

तो समस्या क्या है?


1
सावधान रहें कि UTF-8 एन्कोडिंग वह है जो आप वास्तव में एन्कोडिंग के रूप में निर्दिष्ट करना चाहते हैं। आप आईएसओ-8859-1 (उर्फ लैटिन -1) या यहां तक ​​कि यूएस-एएससीआईआई जैसे सरल एन्कोडिंग का उपयोग करके बेहतर हो सकते हैं।
rmp

40
"आप एक सरल एन्कोडिंग का उपयोग करने से बेहतर हो सकते हैं जैसे ..." हाँ, और बग एंड-यूज़र्स, साथ ही अन्य डेवलपर्स ... आजकल यूटीएफ -8 का उपयोग करने की कोशिश करना सबसे अच्छा है और अन्य के बारे में परवाह है एन्कोडिंग केवल जब एक बहु-एन्कोडिंग आवेदन की आवश्यकता को आप के लिए फेंक दिया जाता है। यहां, हम ज्यादातर स्रोत और कॉन्फ़िगरेशन फ़ाइलों के एन्कोडिंग के बारे में बात कर रहे हैं, उपयोगकर्ता इनपुट के एन्कोडिंग को अलग-अलग तरीके से प्रबंधित किया जाता है ('जावा -Dfile.encoding ...' और बहुत दर्दनाक प्रोग्रामिंग प्रयास के साथ)।
zakmck

मैंने व्यक्तिगत रूप से निर्णय लिया कि एन्कोडिंग मुद्दे इतने मायावी थे कि मैं ASCII को pom.xml में एन्कोडिंग के लिए गया और फिर एन्कोडिंग मुद्दों को सामने लाया। यह स्वाभाविक रूप से मेरे नाम में एक गैर- ASCII चरित्र होने से प्रेरित है 1 दिन से मुद्दे दे :)
Thorbjørn Ravn Andersen

पैरेंट pom.xml में कौन सा एन्कोडिंग सेट है?
रिपन अल वसीम

जवाबों:


534

ठीक है, मुझे समस्या मिल गई।

मैं कुछ रिपोर्टिंग प्लग इन का उपयोग करता हूं। फेलसेफ-मावेन-प्लगइन ( 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


इसलिए मेरे पास यह मुद्दा था और मैंने इस तरह के ऊपर से गुण जोड़े: <प्रोफाइल> <प्रोफाइल> <सक्रियण> <सक्रियबीडफॉल्ट> सच </ सक्रियबाइफॉल्ट> </ सक्रियता> <आईडी> स्थानीय </ आईडी> <गुण> <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> </ प्रोफाइल>
बॉब स्माल

नहीं, कोडिंग की एकमात्र वैश्विक सेटिंग env द्वारा की जानी है। चर: stackoverflow.com/a/9976788/715269
गंगानुस

Pom.xml फ़ाइल के गुण ब्लॉक में 2 गुण जोड़ते समय यह अपेक्षा के अनुरूप काम करता है। धन्यवाद।
जीन पॉल रुइज़

47

यह पिछले के अतिरिक्त होगा, यदि कोई व्यक्ति स्कैंडिक पत्रों के साथ एक समस्या को पूरा करता है जो उपरोक्त समाधान के साथ हल नहीं हुआ है।

यदि जावा स्रोत फ़ाइलों में स्कैंडिक अक्षर होते हैं, तो उन्हें संकलन के लिए उपयोग किए जाने वाले जावा द्वारा सही ढंग से व्याख्या करने की आवश्यकता होती है । (जैसे स्थिरांक में प्रयुक्त होने वाले परिमार्जन पत्र)

यहां तक ​​कि फाइलें यूटीएफ -8 में संग्रहित की जाती हैं और मावेन को यूटीएफ -8 का उपयोग करने के लिए कॉन्फ़िगर किया गया है, मावेन द्वारा उपयोग किया जाने वाला सिस्टम जावा अभी भी सिस्टम डिफॉल्ट का उपयोग करेगा (जैसे विंडोज में: cp1252)।

यह केवल मावेन के माध्यम से परीक्षण चलाते हुए दिखाई देगा (संभवतः परीक्षणों में इन स्थिरांक के मूल्यों को मुद्रित करना। मुद्रित स्कैंडिक पत्र '<?>' के रूप में दिखाई देंगे) यदि ठीक से परीक्षण नहीं किया गया है, तो यह वर्ग फ़ाइलों को संकलन परिणाम के रूप में भ्रष्ट कर देगा और होगा किसी का ध्यान नहीं गया।

इसे रोकने के लिए, आपको UTF-8 एन्कोडिंग का उपयोग करने के लिए संकलन के लिए उपयोग किए जाने वाले जावा को सेट करना होगा । Maven pom.xml में एन्कोडिंग सेटिंग्स होना पर्याप्त नहीं है, आपको पर्यावरण चर सेट करने की आवश्यकता है: JAVA_TOOL_OPTIONS = -Dfile.encoding = UTF8

इसके अलावा, यदि विंडोज में ग्रहण का उपयोग कर रहे हैं, तो आपको इसके अलावा उपयोग किए जाने वाले एन्कोडिंग को सेट करने की आवश्यकता हो सकती है (यदि आप ग्रहण के माध्यम से व्यक्तिगत परीक्षण चलाते हैं)।


यकीन नहीं होता अगर ऐसा करने का कोई मावेन तरीका है, क्योंकि यह जेवीएम सेटिंग है, मावेन नहीं।
विले मिरस्किनवा

4
मुझे लगता है कि आप चीजों को मिला रहे हैं। -Dfile.encodingयदि आपको स्पष्ट रूप से एन्कोडिंग निर्दिष्ट करने की अनुशंसा नहीं है (जो अनुशंसित नहीं है) तो आपको केवल जावा में I / O का उपयोग करने की आवश्यकता है । मुझे नहीं लगता कि जावा स्रोत फ़ाइलों में स्कैंडिक पत्रों के साथ इसका क्या करना है। गैर-ASCII जावा स्रोत फ़ाइलों में मावेन के साथ काम करता है जब project.build.sourceEncodingसही ढंग से सेट किया जाता है, जैसा कि एथान लेरॉय के उत्तर में वर्णित है।
सलेस्के

@ साल्सेक मुझे लगता है कि वही पर्याप्त होगा, लेकिन जब मैंने पहली बार यहाँ समाप्त किया और pom.xml परिवर्तन किया, तो इससे मेरी समस्या ठीक नहीं हुई। अधिक खोज के बाद और परीक्षण और त्रुटि के बाद वर्णित समाधान काम किया। मुझे लगता है कि क्या होता है इसका कारण यह है कि मावेन स्थापित / संदर्भित JDK के जेवैक को कॉल करता है जो बदले में डिफ़ॉल्ट रूप में ओ / एस एन्कोडिंग का उपयोग करता है। अगर कोई pom.xml में javac कॉल के लिए एन्कोडिंग निर्दिष्ट करने का एक तरीका जानता है, तो "maven way" में इस समस्या को हल करेगा।
विले मिरस्किनवा

4
@VilleMyrskyneva: जब मैवेन आक्रमण करता है javac, तो यह project.build.sourceEncodingआपके द्वारा सेट किए गए एन्कोडिंग के साथ गुजरेगा (आप उपयोग कर सकते हैं mvn -X), इसलिए मैं नहीं देखता कि आप कैसे वर्णन करते हैं, यह आवश्यक है। यदि आपको अभी भी अपने प्रोजेक्ट में एन्कोडिंग समस्याएँ आती हैं, तो पूछें कि एक अलग प्रश्न के रूप में - ऐसा लगता है कि आप एक अलग समस्या में चल रहे हैं। आदर्श रूप से, एक प्रतिलिपि प्रस्तुत करने योग्य परीक्षण मामला पोस्ट करें।
sleske

@ sleske मेरे पास pom.xml में project.build.sourceEncoding है, लेकिन mvn टेस्ट में अभी भी एन्कोडिंग की समस्या है। जबकि वह -Dfile.encoding = UTF8 इसे हल करता है। मुझे समझ नहीं आता क्यों। stackoverflow.com/questions/42990644/…
तिवारी

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.apache.org/plugins/maven-resources-plugin/examples/… , maven.apache.org/plugins/maven-resources-plugin/… , maven.apache.org/general.html#encoding-warning )
जॉर्ज बिर्बिलिस

नहीं, कोडिंग की एकमात्र वैश्विक सेटिंग env द्वारा की जानी है। चर: stackoverflow.com/a/9976788/715269
गंगानुस

7

ऐसा लगता है कि लोग किसी अंतर्निर्मित फ़ाइल / संसाधन एन्कोडिंग के साथ सामग्री एन्कोडिंग को मिलाते हैं। केवल मावेन गुण होने के लिए पर्याप्त नहीं है। बीत रहा है -Dfile.encoding=UTF8प्रभावी नहीं। एन्कोडिंग के साथ समस्या होने से बचने के लिए आपको निम्नलिखित सरल नियमों का पालन करना चाहिए

  1. जैसा कि ऊपर वर्णित है, मावेन एन्कोडिंग सेट करें:
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  1. जब आपके कोड में फ़ाइलें, स्ट्रिंग्स, IO के साथ काम करते हैं, तो हमेशा स्पष्ट रूप से एन्कोडिंग सेट करें। यदि आप इस नियम का पालन नहीं करते हैं, तो आपका आवेदन पर्यावरण पर निर्भर करता है। -Dfile.encoding=UTF8वास्तव में रन-टाइम वातावरण विन्यास के लिए जिम्मेदार है, लेकिन हम इस पर निर्भर नहीं रहना चाहिए। यदि आपके पास हजारों ग्राहक हैं, तो सिस्टम को कॉन्फ़िगर करने और इसके कारण समस्याओं को खोजने के लिए अधिक प्रयास करना पड़ता है। आपके पास बस इस पर एक अतिरिक्त निर्भरता है जिसे आप स्पष्ट रूप से सेट करके इससे बच सकते हैं। जावा में अधिकांश तरीके जो एक डिफ़ॉल्ट एन्कोडिंग का उपयोग करते हैं, इसे इसके कारण पदावनत के रूप में चिह्नित किया जाता है।

  2. सुनिश्चित करें कि जिस सामग्री के साथ आप काम कर रहे हैं, वह भी उसी एन्कोडिंग में है, जिसकी आप अपेक्षा करते हैं। यदि ऐसा नहीं है, तो पिछले चरण मायने नहीं रखते हैं! उदाहरण के लिए, किसी फ़ाइल को सही ढंग से संसाधित नहीं किया जाएगा, यदि उसका एन्कोडिंग UTF8 नहीं है, लेकिन आप इसकी अपेक्षा करते हैं। लिनक्स पर फ़ाइल एन्कोडिंग की जाँच करने के लिए:

$ फ़ाइल - Mime F_PRDAUFT.dsv

  1. फोर्स क्लाइंट / सर्वर सेट एन्कोडिंग को अनुरोधों / प्रतिक्रियाओं में स्पष्ट करते हैं, यहाँ उदाहरण हैं:
@Produces("application/json; charset=UTF-8")
@Consumes("application/json; charset=UTF-8")

आशा है कि यह किसी के लिए उपयोगी होगा।


नहीं, कोडिंग की एकमात्र वैश्विक सेटिंग env द्वारा की जानी है। चर: stackoverflow.com/a/9976788/715269
गंगानुस

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>

विशेष रूप से महत्वपूर्ण, हमें यह नहीं भूलना चाहिए कि न केवल स्रोत, बल्कि संसाधनों को भी इस एन्कोडिंग सेटिंग की आवश्यकता है।
पीटर - मोनिका

1

मेरे मामले में मैं maven-dependency-pluginनिम्नलिखित संपत्ति को जोड़ने के लिए समस्या को हल करने के लिए उपयोग कर रहा था:

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

Apache Maven Resources प्लगइन देखें / एक चरित्र एन्कोडिंग योजना निर्दिष्ट करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.