Warum warnt mich Maven vor der Codierung?

93

Mein Ziel ist es, aus einem Projekt einen Archetyp zu erstellen.

Wenn ich ein Ziel ausführe, an dem das Maven-Archetype-Plugin nicht beteiligt ist, wird keine Warnung angezeigt:

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

Wenn ich am anderen Ende Archetyp: create-from-project ausführe, erhalte ich ein paar:

[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

Ich weiß, dass der "Standard" -Maven-Weg darin besteht, die project.build.sourceEncodingEigenschaft zu nutzen . Ich habe versucht, dem POM weitere Eigenschaften hinzuzufügen, um dieses Problem zu beheben, aber keine davon hat funktioniert.

Irgendwelche Ideen? Vielen Dank.

Ich habe die folgende 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>

Marco Ferrari
quelle

Antworten:

18

Wenn Sie das Ziel ausführen archetype:create-from-project, generiert Maven eine POM-Datei zum Erstellen des Archetyps unter target/generated-sources/archetype/pom.xmlund führt dann das packageZiel (standardmäßig) auf diesem POM aus.

Die generierte POM-Datei hat project.build.sourceEncodingkeine andere Eigenschaft, die die Codierung definiert, und deshalb erhalten Sie die Warnung.

Das POM wird aus diesem Prototyp von generiert org.apache.maven.archetype.creator.FilesetArchetypeCreator#createArchetypeProjectPom, und aus diesem Code scheint es keine Möglichkeit zu geben, der resultierenden POM-Datei Eigenschaften hinzuzufügen.

izstas
quelle
140

Sie haben die Standardeigenschaft für die Codierung nicht wie folgt festgelegt:

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

Dieser Ansatz ist besser als das manuelle Definieren der Codierung für jedes Plugin, da alle Plugins Standardwerte für die Codierung haben, z. B. das 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}

Das bedeutet, dass Sie nur diese Eigenschaft definieren müssen und das Plugin diese Codierung automatisch verwendet.

khmarbaise
quelle
1
Ich habe es eingestellt. Schau dir meinen Pom an. Vielen Dank
Marco Ferrari
1
Sie können die Einträge in den Plugin-Konfigurationen entfernen <encoding>${encoding}</encoding>.
Khmarbaise
1
OK. Ich habe diese Einträge hinzugefügt, um zu sehen, ob das Problem behoben wurde, aber kein Glück
Marco Ferrari
Ich verstehe nicht, warum der Fallback Plattformcodierung anstelle von UTF-8 verwendet. Legacy-Unterstützung?
msa
@msa weil nicht alle Plattformen UTF-8 als Standard haben. Einfachstes Beispiel Windows.
Khmarbaise
33

Ich war genervt zu sehen, dass sich Maven nach dem obigen Eintrag immer wieder beschwerte

Dann wurde mir klar, dass es das ausfallsichere Plugin ist und eine eigene Eigenschaft benötigt

Also los geht's

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