大部分生命周期将Compiler插件的compile
目标绑定到compile
阶段。该阶段会调用compile:compile
,后者被配置成编译所有的源码并复制到构建输出目录。如果你没有自定义超级POM中的值,compile:compile
将会编译src/main/java
中的所有内容至target/classes
。Compiler插件调用javac
,使用的source设置为1.3,默认target设置为1.1。换句话说,Compiler插件会假设你所有的Java源代码遵循Java
1.3,目标为Java 1.1
JVM。如果你想要更改这些设置,你需要在POM中为Compiler插件提供source和target配置,如Example 10.9, “为Compiler插件设置source和target版本”所示。
Example 10.9. 为Compiler插件设置source和target版本
<project> ... <build> ... <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> </plugins> ... </build> ... </project>
要注意我们配置的是Compiler插件,而不是compile:compile
目标。如果我们只要为compile:compile
目标配置source和target,就要将configuration
元素放到compile:compile
目标的execution
元素下。我们为整个插件配置source和target,是因为compile:compile
并不是我们唯一我们感兴趣配置的目标。当Maven使用compile:testCompile
目标编译测试代码的时候,Compiler插件会被重用,因此在插件级别配置source和target,一次就能配置该插件所有的目标。
如果你想要自定义源码的位置,你也可以更改构建配置。如果你想要存储项目的源码至src/java
而非src/main/java
,让构建输出至classes
而非target/classes
,你可以覆盖定义在超级POM中的sourceDirectory
的默认值。
Example 10.10. 覆盖默认的源码和输出目录
<build> ... <sourceDirectory>src/java</sourceDirectory> <outputDirectory>classes</outputDirectory> ... </build>
Warning
虽然让Maven屈服于你自己的项目目录结构可能看起来很有必要,但我们还是要不断强调你应该牺牲自己关于目录结构的想法,而遵循Maven的默认值。这不是说我们要给你洗脑,要你接受Maven的方式,这是因为如果你的项目遵循大部分的约定,别人会很容易理解你的项目。因此忘掉你自己的想法,别那样做。