父pom中的maven-compiler-plugin
Posted
技术标签:
【中文标题】父pom中的maven-compiler-plugin【英文标题】:maven-compiler-plugin in parent pom 【发布时间】:2016-09-17 22:20:00 【问题描述】:我在为父子 pom 文件设置 java 编译器版本时遇到问题。我在 1.7 版本的子 pom 中添加了 maven-compiler-plugin 并注意到子模块的 java 版本从默认的 1.5 更改为 1.7,而父项目仍然是 1.5。然后,我将编译器插件从子 pom 移动到父 pom。预计父 Maven 模块和子 Maven 模块的编译器版本都将更改为 1.7。但奇怪的是没有观察到变化,子模块仍然是 1.7,父项目是 1.5。我从 Eclipse IDE 执行了“maven-> update project”。但没有用。仅供参考:构建父子项目工作正常,没有问题。有什么帮助吗?这是我的父子 POM
父 POM
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mymaven.parentpom.example</groupId>
<artifactId>ParentPOMProj</artifactId>
<packaging>pom</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>ParentPOMProj</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>ParentPOMProj</finalName>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<compilerVersion>1.7</compilerVersion>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
<modules>
<module>ModuleOne</module>
</modules>
</project>
儿童 POM
<?xml version="1.0"?>
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mymaven.parentpom.example</groupId>
<artifactId>ParentPOMProj</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.mymaven.parentpom.example.module</groupId>
<artifactId>ModuleOne</artifactId>
<version>0.0.2-SNAPSHOT</version>
<name>ModuleOne</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<finalName>ModuleOne</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
----------------------------------------------- ------
【问题讨论】:
您是否已经点击了屏幕截图中显示的链接Change project compliance and JRE to 1.7
。这是一个 Eclipse 项目设置。
我可以从 IDE 设置中做到这一点。但是,我的主要想法是通过 POM 来控制它,而不是通过任何 IDE 设置。
但是您无法从 POM 控制 IDE。无论如何,您都在 IDE 中工作。
对不起kornisb。你的建议我不方便。如果我不能通过 POM 来控制,那还需要 maven-compiler-plugin 吗?
从命令行mvn compile
运行编译并检查是否正常。如果没问题,你的 Meven 设置没问题。如果它仍然没有在 Eclipse 中编译,那肯定不是 Maven 设置。不是吗?
【参考方案1】:
在父级中,您需要在 <pluginManagement/>
而不是 <plugins/>
中定义它
https://maven.apache.org/pom.html#Plugin_Management
pluginManagement: 是一个可以在侧面插件中看到的元素。 插件管理以几乎相同的方式包含插件元素, 除了为此配置插件信息 特定的项目构建,它旨在配置项目构建 继承自这个
<build>
<finalName>ParentPOMProj</finalName>
<pluginManagement>
<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>
</pluginManagement>
</build>
如文档中所述,子项目也需要引用插件:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<!-- inherits config from parent: can override if required -->
</plugin>
</plugins>
</build>
【讨论】:
更新您的问题以显示两个 pom 的新内容。 更新了我的问题。请看一看。 所以你实际上在父 pom.xml 中有代码。通常情况并非如此。然后,您还需要在父级中添加您应该检查项目的合规性。在Eclipse的Project Explorer中右键点击该项目,然后进入Properties,如图设置(如果安装了合适的JDK,也可以设置为1.7版本):
【讨论】:
我想通过pom来控制这个。我相信,这毕竟是使用 maven-compiler-plugin 的目的。【参考方案3】:经过进一步研究,我了解到父 pom 中的 maven-compiler-plugin 中的 java 版本适用于子 POM,但不适用于父 POM。基本上,大多数时候,不建议在父项目中保留任何源代码,它只是勉强处理子模块的所有构建配置。以下是更新后的 POMS:
父 POM
http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0
<groupId>com.mymaven.parentpom.example</groupId>
<artifactId>ParentPOMProj</artifactId>
<packaging>pom</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>ParentPOMProj</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>ParentPOMProj</finalName>
<pluginManagement>
<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>
</pluginManagement>
</build>
<modules>
<module>ModuleOne</module>
</modules>
儿童 POM
http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 4.0.0
<parent>
<groupId>com.mymaven.parentpom.example</groupId>
<artifactId>ParentPOMProj</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.mymaven.parentpom.example.module</groupId>
<artifactId>ModuleOne</artifactId>
<packaging>jar</packaging>
<version>0.0.2-SNAPSHOT</version>
<name>ModuleOne</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
【讨论】:
我几乎不相信你可以用mvn compile
编译ParentPOMProj/src/main/java
中的源代码。由于包装是<packaging>**pom**</packaging>
Maven 不会编译它们。你在 Eclipse 中完成了right click on Project -> Maven -> Update project
吗?在 Eclipse Luna 中,您甚至无法更改 ParentPOMProj
的 Java 编译器设置。
我正在使用 Eclipse MARS v4.5.2。我在父项目上做了“更新项目”,甚至可以在构建成功的情况下执行 mvn compile。正如我在回复中所说,不建议将 java 源文件保留在父 pom.xml 中。父项目是保留子模块所需的构建配置。您不能在 ParentPOMProj/src/main/java 中编译源代码。我希望这可以消除您的疑虑。
You can't compile sources in ParentPOMProj/src/main/java.
这就是我所说的。 :-)
@SubOptimal.:: 同意... :)以上是关于父pom中的maven-compiler-plugin的主要内容,如果未能解决你的问题,请参考以下文章
如何通过父pom中的dependencyManagement强制maven依赖版本?
开发遇到的问题---导入别人的工程后,父工程中的pom依赖引入报错