Dlaczego Maven ostrzega mnie przed kodowaniem?


97

Moim celem jest stworzenie archetypu z projektu.

Kiedy uruchamiam cel, który nie obejmuje wtyczki maven-archetype, nie widzę żadnego ostrzeżenia:

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

Z drugiej strony, gdy uruchamiam archetype: create-from-project, otrzymuję parę:

[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

Wiem, że "standardowym" sposobem maven jest korzystanie z project.build.sourceEncodingnieruchomości. Próbowałem dodać więcej właściwości do pom, aby rozwiązać ten problem, ale żadna z nich nie działała.

Jakieś pomysły? Dzięki.

Mam następujący pom.xml:

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

Odpowiedzi:


18

Kiedy uruchomisz cel archetype:create-from-project, Maven generuje plik POM do budowania archetypu w, target/generated-sources/archetype/pom.xmla następnie uruchamia packagecel (domyślnie) na tym POM.

Wygenerowany plik POM nie ma project.build.sourceEncodingani żadnej innej właściwości definiującej kodowanie, dlatego pojawia się ostrzeżenie.

POM jest generowany na podstawie tego prototypu przez org.apache.maven.archetype.creator.FilesetArchetypeCreator#createArchetypeProjectPomiz tego kodu wydaje się, że nie ma sposobu na dodanie właściwości do wynikowego pliku POM.


146

Nie ustawiłeś domyślnej właściwości kodowania w ten sposób:

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

To podejście jest lepsze niż ręczne definiowanie kodowania dla każdej wtyczki, ponieważ wszystkie wtyczki mają domyślne wartości do kodowania, na przykład 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}

Oznacza to, że wystarczy zdefiniować tę właściwość, a wtyczka automatycznie użyje tego kodowania.


1
Ustawiłem to. Spójrz na mój pom. Dzięki
Marco Ferrari

1
Możesz usunąć wpisy w konfiguracjach wtyczek <encoding>${encoding}</encoding>.
khmarbaise

1
Ok. Dodałem te wpisy, aby sprawdzić, czy problem rozwiązał, ale bez powodzenia
Marco Ferrari

Nie rozumiem, dlaczego rozwiązanie awaryjne używa kodowania platformy zamiast UTF-8. Wsparcie starszej wersji?
msa

@msa, ponieważ nie wszystkie platformy mają domyślnie UTF-8. Najprostszy przykład Windows.
khmarbaise

35

Byłem zirytowany, widząc, że maven dalej narzekał po powyższym wpisie

Potem zdałem sobie sprawę, że jest to bezpieczna wtyczka i potrzebuje własnej właściwości

Więc oto jest

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.