为什么Maven会提醒我编码?
我的目标是从一个项目中创build一个原型。
当我运行一个不涉及maven-archetype-plugin的目标时,我看不到任何警告:
[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]
另一方面,当我运行原型:create-from-project时,我得到了一个:
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maven-archetype-base-archetype --- [WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, ie 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, ie build is platform dependent! [INFO] Copying 2 resources
我知道“标准”的maven方式是使用project.build.sourceEncoding
属性。 为了解决这个问题,我尝试添加一些更多的属性,但没有一个工作。
有任何想法吗? 谢谢。
我有以下的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>
当您运行目标archetype:create-from-project
,Maven会在target/generated-sources/archetype/pom.xml
用于构build原型的POM文件,然后在此POM上运行package
目标(默认情况下)。
生成的POM文件没有project.build.sourceEncoding
或任何其他定义编码的属性,这就是为什么你得到警告。
POM是由org.apache.maven.archetype.creator.FilesetArchetypeCreator#createArchetypeProjectPom
从这个原型生成的,并且从那个代码中似乎没有办法将属性添加到生成的POM文件中。
你没有像这样设置编码的默认属性:
<project> ... <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> ... </project>
这种方法比为每个插件手动定义编码要好,导致所有插件都具有编码的默认值,例如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}
所以这意味着你只需要定义这个属性,插件就会自动使用这个编码。
我很恼火地看到,在上面的input之后,maven一直在抱怨
然后我意识到它的故障安全插件,它需要它自己的属性
所以在这里
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> </properties
要删除这个警告,如果你真的不想让构build依赖于平台,你应该通过执行以下步骤来指定Maven项目中与平台无关的构build的源代码:
- 打开pom文件。
-
添加下面的代码:
<project> ... <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> ... </project>
-
运行以下命令:
mvn包
- 注意警告不再存在。
怎么运行的
project.build.sourceEncoding属性显式指定源文件的编码。 Maven插件从这个属性的值中获取关于编码的信息并使用它。这个值在构build项目的任何平台上都是一样的,因此构build变得与平台无关。