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
没有 <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
【参考方案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 的类路径值?的主要内容,如果未能解决你的问题,请参考以下文章
在本机编译期间,如何在 Quarkus maven 插件中将参数添加到 GraalVM?