10.3.2. Compile

大部分生命周期将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的方式,这是因为如果你的项目遵循大部分的约定,别人会很容易理解你的项目。因此忘掉你自己的想法,别那样做。