Maven 编译器插件:如何更改 testCompile 的类路径值?

Posted

技术标签:

【中文标题】Maven 编译器插件:如何更改 testCompile 的类路径值?【英文标题】:Maven Compiler Plugin : How to change classpath value of testCompile? 【发布时间】:2016-10-18 03:43:45 【问题描述】:

我需要更改 maven-compiler-plugin 用于编译测试的类路径值,但我找不到任何方法...

我读过:

maven add a local classes directory to module's classpath Maven: add a folder or jar file into current classpath

但这些解决方案对我不利。

更准确地说,我们正在构建客户端 jar 以使用此 API,我们需要构建此客户端两次:

一个源和目标为 1.8 的新客户端 一个源和目标为 1.7 的客户端,仍然使用 JDK7

这是 maven-compiler-plugin 在我父 POM 的 pluginManagement 中的配置:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.5.1</version>
    <configuration>
        <includes>
            <include>**/*.java</include>
        </includes>
        <target>1.8</target>
        <source>1.8</source>
        <fork>true</fork>
        <encoding>UTF-8</encoding>
    </configuration>
    <executions>
        <execution>
            <id>jdk7</id>
            <phase>none</phase>
            <goals>
                <goal>compile</goal>
            </goals>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
                <fork>true</fork>
                <outputDirectory>$project.build.directory/classes/jdk7/</outputDirectory>
            </configuration>
        </execution>
        <execution>
            <id>jdk8</id>
            <phase>none</phase>
            <goals>
                <goal>compile</goal>
            </goals>
            <configuration>
                <fork>true</fork>
                <outputDirectory>$project.build.directory/classes/jdk8/</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

该阶段设置为“无”以默认禁用这些执行,并且它们仅针对客户端执行。

这是我的客户端 POM 的配置:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <executions>
        <execution>
            <id>jdk7</id>
            <phase>compile</phase>
        </execution>
        <execution>
            <id>jdk8</id>
            <phase>compile</phase>
        </execution>
        <execution>
            <id>default-compile</id>
            <phase>none</phase>
        </execution>
    </executions>
</plugin>

如您所见,我已禁用“默认编译”执行,因为它直接在目标/类文件夹中编译源代码的第 3 次,在我的情况下它很脏。 我只想要 target/classes/jdk7 中的 JDK7 类和 target/classes/jdk8 中的 JDK8 类。

问题是 maven-compiler-plugin 用于类路径的“default-testCompile”执行是:

目标/测试类 目标/类 所有依赖项 jars

编译失败,因为 maven-compiler-plugin 不在文件夹 target/classes/jdk8 中寻找类文件。

我尝试将 compilerArguments 和 compilerArgs 添加到配置中,但没有成功...

如何在 default-testCompile 使用的类路径中添加“target/classes/jdk8”或将“target/classes”更改为“target/classes/jdk8”?

注意:我知道如果我不禁用“默认编译”,它将起作用,因为类将在“目标/类”中,但我不想编译源代码的 3 倍...

【问题讨论】:

这些类真的是在target/classes/jdk7(对应jdk8)下生成的吗? maven-compiler-plugin 没有 &lt;outputDirectory&gt; 选项。这通常使用&lt;build&gt;&lt;outputDirectory&gt; 属性进行配置。 确实这个选项不存在,但我在另一篇文章中找到了它并且效果很好。我尝试在 compilerArgs 中添加属性“-d”,但它不起作用。 嗯。您是否使用配置文件从 JDK 切换?如果是这样,您可以发布该配置吗? 不,我没有。我误会了 JDK7 和 JDK8。我用 JDK8 编译,但我想在同一个 maven 构建中构建一个兼容 JDK7(源和目标为 1.7)和另一个兼容 JDK8(源和目标为 1.8)的 jar。 @MatthieuSaleta 在这种情况下执行交叉编译时(使用 JDK 8 和目标 1.7)请仔细阅读this Stack Overflow thread 【参考方案1】:

您可以使用配置文件来使用不同的配置。您必须定义两个配置文件,一个使用 jdk8 配置,另一个使用 jdk 7 配置。例如:

<profiles>
    <profile>
        <id>jdk7</id>
        <activation>
            <property>
                <name>jdk7</name>
            </property>
        </activation>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.5.1</version>
                    <configuration>
                        <source>1.7</source>
                        <target>1.7</target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
    <profile>
        <id>jdk8</id>
        <activation>
            <property>
                <name>jdk8</name>
            </property>
        </activation>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.5.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

所以,当你想使用 jdk7 构建时,只需调用 -P jdk7,而当你想使用 jdk8 构建时,调用 -P jdk8。例如:

mvn clean install -P jdk7

【讨论】:

那肯定行得通,但这不是我想做的。我的目标是在同一个版本中构建 2 个客户端库,所以我需要使用 2 个不同的类文件夹,不同于 ./target/classes。【参考方案2】:

我发现解决问题的唯一方法是修改 maven-compiler-plugin。

我在 TestCompilerMojo 中添加了属性“additionalClasspathElements”。

我很快就会提出一个拉取请求。

【讨论】:

以上是关于Maven 编译器插件:如何更改 testCompile 的类路径值?的主要内容,如果未能解决你的问题,请参考以下文章

Maven--添加jdk编译插件

如何使用 Maven 发布插件更改其他项目?

在本机编译期间,如何在 Quarkus maven 插件中将参数添加到 GraalVM?

Maven编译器重新编译所有文件而不是修改

如何在 IntelliJ 中更改 Maven 的 Java 版本?

maven之使用tomcat7-maven-plugin自动编译的问题