【发布时间】:2023-04-07 01:16:02
【问题描述】:
我需要更改 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没有<outputDirectory>选项。这通常使用<build><outputDirectory>属性进行配置。 -
确实这个选项不存在,但我在另一篇文章中找到了它并且效果很好。我尝试在 compilerArgs 中添加属性“-d”,但它不起作用。
-
嗯。您是否使用配置文件从 JDK 切换?如果是这样,您可以发布该配置吗?
-
不,我没有。我误会了 JDK7 和 JDK8。我用 JDK8 编译,但我想在同一个 maven 构建中构建一个兼容 JDK7(源和目标为 1.7)和另一个兼容 JDK8(源和目标为 1.8)的 jar。
-
@MatthieuSaleta 在这种情况下执行交叉编译时(使用 JDK 8 和目标 1.7)请仔细阅读this Stack Overflow thread
标签: maven classpath maven-compiler-plugin