首页 > 解决方案 > maven-compiler-plugin:如何告诉它源目录的位置?

问题描述

我有一个使用 Eclipse 开发的 Java 项目。下面是我的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mbm</groupId>
    <artifactId>properties</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Properties</name>
    <description>Define and process program arguments</description>

    <dependencies>
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>2.2.11</version>
        </dependency>
    </dependencies>

    <pluginRepositories>
        <pluginRepository>
            <releases>
                <enabled>true</enabled>
                <updatePolicy>never</updatePolicy>
            </releases>
            <snapshots>
                <enabled>false</enabled>
                <updatePolicy>daily</updatePolicy>
            </snapshots>
            <id>apache-maven-repository</id>
            <name>Apache Maven repository maven2</name>
            <url>https://repo.maven.apache.org/maven2</url>
        </pluginRepository>
    </pluginRepositories>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>jaxb2-maven-plugin</artifactId>
                <version>2.2</version>
                <executions>
                    <execution>
                        <id>xjc</id>
                        <goals>
                            <goal>xjc</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <!-- Configuration for version 2.2 -->
                    <arguments>
                        <argument>-Xlocator</argument>
                    </arguments>
                    <outputDirectory>${basedir}/target/generated-sources/jaxb</outputDirectory>
                    <packageName>com.mbm.properties.jaxb</packageName>
                    <sources>
                        <source>${basedir}/src/main/java/com/mbm/properties/schema/Properties.xsd</source>
                    </sources>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>sablecc-maven-plugin</artifactId>
                <version>2.4-SNAPSHOT</version>
                <configuration>
                    <sourceDirectory>${basedir}/src/main/java/com/mbm/properties/grammar</sourceDirectory>
                    <outputDirectory>${basedir}/target/generated-sources/sablecc</outputDirectory>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

此 POM 调用 SableCC(通过 sablecc-maven-plugin),这是一个编译器生成器,可生成要与项目的其余部分一起编译的 Java 源代码。这有效并且确实生成了可行的 Java 源代码。

POM 还调用 XJC(通过 jaxb2-maven-plugin),这是另一个生成 Java 源代码以与项目的其余部分一起编译的实用程序。这也可以工作并生成可行的 Java 源代码。

这是在编译阶段生成的 Maven 输出片段:

[INFO] Changes detected - recompiling the module!
[DEBUG] Classpath:
[DEBUG]  C:\Users\mbmas_000\workspace\Properties\target\classes
[DEBUG]  C:\Users\mbmas_000\.m2\repository\org\glassfish\jaxb\jaxb-core\2.2.11\jaxb-core-2.2.11.jar
[DEBUG]  C:\Users\mbmas_000\.m2\repository\javax\xml\bind\jaxb-api\2.2.12-b140109.1041\jaxb-api-2.2.12-b140109.1041.jar
[DEBUG]  C:\Users\mbmas_000\.m2\repository\org\glassfish\jaxb\txw2\2.2.11\txw2-2.2.11.jar
[DEBUG]  C:\Users\mbmas_000\.m2\repository\com\sun\istack\istack-commons-runtime\2.21\istack-commons-runtime-2.21.jar
[DEBUG] Source roots:
[DEBUG]  C:\Users\mbmas_000\workspace\Properties\src\main\java
[DEBUG]  C:\Users\mbmas_000\workspace\Properties\target\generated-sources\sablecc
[DEBUG]  C:\Users\mbmas_000\workspace\Properties\target\generated-sources\annotations
[DEBUG] Command line options:
[DEBUG] -d C:\Users\mbmas_000\workspace\Properties\target\classes -classpath C:\Users\mbmas_000\workspace\Properties\target\classes;C:\Users\mbmas_000\.m2\repository\org\glassfish\jaxb\jaxb-core\2.2.11\jaxb-core-2.2.11.jar;C:\Users\mbmas_000\.m2\repository\javax\xml\bind\jaxb-api\2.2.12-b140109.1041\jaxb-api-2.2.12-b140109.1041.jar;C:\Users\mbmas_000\.m2\repository\org\glassfish\jaxb\txw2\2.2.11\txw2-2.2.11.jar;C:\Users\mbmas_000\.m2\repository\com\sun\istack\istack-commons-runtime\2.21\istack-commons-runtime-2.21.jar; -sourcepath C:\Users\mbmas_000\workspace\Properties\src\main\java;C:\Users\mbmas_000\workspace\Properties\target\generated-sources\sablecc;C:\Users\mbmas_000\workspace\Properties\target\generated-sources\annotations; -s C:\Users\mbmas_000\workspace\Properties\target\generated-sources\annotations -g -nowarn -target 1.8 -source 1.8

注意源根。第一个:

C:\Users\mbmas_000\workspace\Properties\src\main\java

我并不感到惊讶。Maven 期望 Java 源代码位于该目录中是有道理的。

后两行确实让我感到惊讶:

C:\Users\mbmas_000\workspace\Properties\target\generated-sources\sablecc C:\Users\mbmas_000\workspace\Properties\target\generated-sources\annotations

我从来没有在 POM 中指定这些额外的目录(我什至不知道该怎么做,因为这inputDirectory是一个明显缺失的参数被 接受maven-compiler-plugin)。Maven 怎么知道要包含这些?还有,为什么

C:\Users\mbmas_000\workspace\Properties\target\generated-sources\jaxb

也包括在内,因为这是jaxb2-maven-plugin指定的输出目录?

如何修改此 POM 文件,以便

C:\Users\mbmas_000\workspace\Properties\target\generated-sources\jaxb

是否包含在Java编译阶段?

标签: javaeclipsemavenjaxbxjc

解决方案


您正在使用的特定插件org.codehaus.mojo:sablecc-maven-plugin- 碰巧添加了<outputDirectory>作为编译源根目录。这就是为什么maven-compiler-plugin能够找到它。

您可以org.codehaus.mojo:build-helper-maven-plugin按照插件文档中的说明添加其他源:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <version>3.2.0</version>
        <executions>
          <execution>
            <id>add-source</id>
            <phase>generate-sources</phase>
            <goals>
              <goal>add-source</goal>
            </goals>
            <configuration>
              <sources>
                <source>some directory</source>
                ...
              </sources>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

推荐阅读