Tại sao Maven cảnh báo tôi về mã hóa?


93

Mục tiêu của tôi là tạo một nguyên mẫu từ một dự án.

Khi tôi chạy một mục tiêu không liên quan đến maven-archetype-plugin, tôi không thể thấy bất kỳ cảnh báo nào:

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

Mặt khác, khi tôi chạy archetype: create-from-project, tôi nhận được một vài:

[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

Tôi biết rằng cách maven "tiêu chuẩn" là sử dụng thuộc project.build.sourceEncodingtính. Tôi đã thử thêm một số thuộc tính khác vào pom để giải quyết vấn đề này nhưng không có cái nào hoạt động.

Bất kỳ ý tưởng? Cảm ơn.

Tôi có pom.xml sau:

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

Câu trả lời:


18

Khi bạn chạy mục tiêu archetype:create-from-project, Maven tạo tệp POM để xây dựng kiểu mẫu tại target/generated-sources/archetype/pom.xmlvà sau đó chạy packagemục tiêu (theo mặc định) trên POM này.

Tệp POM được tạo không có project.build.sourceEncodinghoặc bất kỳ thuộc tính nào khác xác định mã hóa và đó là lý do tại sao bạn nhận được cảnh báo.

POM được tạo ra từ nguyên mẫu này bởi org.apache.maven.archetype.creator.FilesetArchetypeCreator#createArchetypeProjectPomvà từ mã đó dường như không có cách nào để thêm thuộc tính vào tệp POM kết quả.


140

Bạn chưa đặt thuộc tính mặc định mã hóa như sau:

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

Cách tiếp cận này tốt hơn là xác định mã hóa theo cách thủ công cho mọi plugin, vì tất cả các plugin đều có giá trị mặc định để mã hóa, ví dụ: 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}

Vì vậy, điều này có nghĩa là bạn chỉ cần xác định thuộc tính này và plugin sẽ tự động sử dụng mã hóa này.


1
Tôi đặt nó. Hãy nhìn vào quả bóng của tôi. Cảm ơn
Marco Ferrari

1
Bạn có thể xóa các mục trong cấu hình plugin <encoding>${encoding}</encoding>.
khmarbaise

1
Đồng ý. Tôi thêm vào những mục để xem nếu giải quyết vấn đề này, nhưng không may mắn
Marco Ferrari

Tôi không hiểu tại sao dự phòng lại sử dụng mã hóa nền tảng thay vì UTF-8. Hỗ trợ kế thừa?
msa

@msa vì không phải tất cả nền tảng đều có UTF-8 làm mặc định. Ví dụ đơn giản nhất về Windows.
khmarbaise

33

Tôi rất khó chịu khi thấy con maven đó liên tục phàn nàn sau mục nhập trên

Sau đó, tôi nhận ra rằng nó là plugin an toàn dự phòng và nó cần thuộc tính riêng

Vì vậy, nó đi

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.