Mengapa Maven memperingatkan saya tentang pengkodean?

97

Tujuan saya adalah membuat pola dasar dari sebuah proyek.

Ketika saya menjalankan tujuan yang tidak melibatkan maven-archetype-plugin, saya tidak dapat melihat peringatan apa pun:

[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maven-archetype-base ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ maven-archetype-base ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO]

Di sisi lain, ketika saya menjalankan arketipe: buat-dari-proyek, saya mendapatkan pasangan:

[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maven-archetype-base-archetype ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 10 resources
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ maven-archetype-base-archetype ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 2 resources

Saya tahu bahwa cara ahli "standar" adalah menggunakan project.build.sourceEncodingproperti. Saya mencoba menambahkan beberapa properti lagi ke pom untuk mengatasi masalah ini tetapi tidak ada yang berhasil.

Ada ide? Terima kasih.

Saya memiliki pom.xml berikut:

<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>my.group.id</groupId>
<artifactId>my-artifact</artifactId>
<version>0.0.1</version>
<packaging>maven-archetype</packaging>

<properties>

    <!-- Compiler properties -->
    <maven.compiler.target>1.7</maven.compiler.target>
    <maven.compiler.source>1.7</maven.compiler.source>
    <encoding>UTF-8</encoding>
    <project.build.sourceEncoding>${encoding}</project.build.sourceEncoding>
    <project.reporting.outputEncoding>${encoding}</project.reporting.outputEncoding>
    <project.resources.sourceEncoding>${encoding}</project.resources.sourceEncoding>
    <archetype.encoding>${encoding}</archetype.encoding>

    <!-- Maven plugins version -->
    <maven-archetype-plugin-version>2.2</maven-archetype-plugin-version>
    <maven-resources-plugin-version>2.6</maven-resources-plugin-version>

    <!-- Maven extentions version -->
    <maven-archetype-packaging-extension-version>2.2</maven-archetype-packaging-extension-version>
</properties>
<dependencies>
[...]
</dependencies>

<build>
    <extensions>
        <extension>
            <groupId>org.apache.maven.archetype</groupId>
            <artifactId>archetype-packaging</artifactId>
            <version>${maven-archetype-packaging-extension-version}</version>
        </extension>
    </extensions>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>${maven-resources-plugin-version}</version>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-archetype-plugin</artifactId>
            <version>${maven-archetype-plugin-version}</version>
            <extensions>true</extensions>
        </plugin>

    </plugins>

    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

Marco Ferrari
sumber

Jawaban:

18

Saat Anda menjalankan tujuan archetype:create-from-project, Maven membuat file POM untuk membangun arketipe di target/generated-sources/archetype/pom.xmldan kemudian menjalankan packagetujuan (secara default) di POM ini.

File POM yang dihasilkan tidak memiliki project.build.sourceEncodingatau properti lain yang menentukan pengkodean, dan itulah mengapa Anda mendapatkan peringatan.

POM dihasilkan dari prototipe ini oleh org.apache.maven.archetype.creator.FilesetArchetypeCreator#createArchetypeProjectPom, dan dari kode itu sepertinya tidak ada cara untuk menambahkan properti ke file POM yang dihasilkan.

Izstas
sumber
146

Anda belum menyetel properti default pengkodean seperti ini:

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

Pendekatan ini lebih baik daripada mendefinisikan encoding secara manual untuk setiap plugin, karena semua plugin memiliki nilai default untuk encoding, misalnya maven-resources-plugin :

encoding:

The character encoding scheme to be applied when filtering resources.
Type: java.lang.String
Required: No
User Property: encoding
Default: ${project.build.sourceEncoding}

Jadi ini berarti Anda hanya perlu menentukan properti ini dan plugin akan secara otomatis menggunakan pengkodean ini.

khmarbaise
sumber
1
Saya mengaturnya. Lihat pom saya. Terima kasih
Marco Ferrari
1
Anda dapat menghapus entri dalam konfigurasi plugin <encoding>${encoding}</encoding>.
khmarbaise
1
Baik. Saya menambahkan entri tersebut untuk melihat apakah masalah telah diselesaikan, tetapi tidak berhasil
Marco Ferrari
Saya tidak mengerti mengapa fallback menggunakan encoding platform, bukan UTF-8. Dukungan warisan?
msa
@msa karena tidak semua platform memiliki UTF-8 sebagai default. Contoh paling sederhana Windows.
khmarbaise
35

Saya kesal melihat maven terus mengeluh setelah entri di atas

Kemudian saya menyadari bahwa itu adalah plugin yang tidak aman dan membutuhkan propertinya sendiri

Jadi begini

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