كيفية تكوين الترميز في Maven؟
سؤال
عندما أركض maven install
في مشروع Multi Module 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>
بالنسبة إلى Maven-Resources-Plugin أو Maven-Compiler-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 ، فإن النظام Java المستخدم من قبل Maven لا يزال يستخدم النظام الافتراضي (على سبيل المثال. في Windows: CP1252).
سيكون هذا مرئيًا فقط لإجراء الاختبارات عبر Maven (ربما طباعة قيم هذه الثوابت في الاختبارات. ستظهر الحروف المطبوعة المطبوعة على أنها "<؟ ترك دون أن يلاحظه أحد.
لمنع هذا ، عليك تعيين ملف تستخدم Java للتجميع لاستخدام ترميز UTF-8. لا يكفي أن يكون لديك إعدادات الترميز في maven pom.xml ، فأنت بحاجة إلى تعيين متغير البيئة: java_tool_options = -dfile.encoding = utf8
أيضًا ، إذا كنت تستخدم Eclipse في Windows ، فقد تحتاج إلى تعيين الترميز المستخدم بالإضافة إلى هذا (إذا قمت بإجراء اختبار فردي عبر Eclipse).
إذا قمت بدمج الإجابات أعلاه ، فيجب أن يبدو أن 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>
جرب هذا:
<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 فقط لا يكفي. نأخذ -Dfile.encoding=UTF8
غير فعالة. لتجنب وجود مشكلات في الترميز ، يجب عليك اتباع القواعد البسيطة التالية
- اضبط ترميز Maven ، كما هو موضح أعلاه:
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
قم دائمًا بتعيين الترميز بشكل صريح ، عند العمل مع الملفات والسلاسل ، IO في التعليمات البرمجية الخاصة بك. إذا لم تتبع هذه القاعدة ، فإن تطبيقك يعتمد على البيئة. ال
-Dfile.encoding=UTF8
بالضبط مسؤول عن تكوين بيئة وقت التشغيل ، ولكن يجب ألا نعتمد عليه. إذا كان لديك الآلاف من العملاء ، فإن الأمر يتطلب المزيد من الجهد لتكوين الأنظمة وإيجاد المشكلات بسبب ذلك. لديك فقط اعتماد إضافي على ذلك يمكنك تجنبه عن طريق تعيينه بشكل صريح. يتم تمييز معظم الطرق في Java التي تستخدم الترميز الافتراضي على أنها تم إهمالها بسبب ذلك.تأكد من أن المحتوى ، الذي تعمل معه ، هو أيضًا في نفس الترميز ، الذي تتوقعه. إذا لم يكن الأمر كذلك ، فإن الخطوات السابقة لا تهم! على سبيل المثال ، لن تتم معالجة ملف بشكل صحيح ، إذا لم يكن ترميزه UTF8 ولكنك تتوقع ذلك. للتحقق من ترميز الملف على Linux:
$ file -mime f_prdauft.dsv
- إجبار العملاء/مجموعة الخادم على الترميز بشكل صريح في الطلبات/الردود ، إليك أمثلة:
@Produces("application/json; charset=UTF-8") @Consumes("application/json; charset=UTF-8")
آمل أن يكون هذا مفيدًا لشخص ما.
في حالتي كنت أستخدم maven-dependency-plugin
لذلك من أجل حل المشكلة التي اضطررت لإضافة الخاصية التالية:
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>