父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】:

在父级中,您需要在 &lt;pluginManagement/&gt; 而不是 &lt;plugins/&gt; 中定义它

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 中有代码。通常情况并非如此。然后,您还需要在父级中添加 块。但是,我建议您不要在父级中添加代码。请注意,它具有 POM 而非 JAR 封装类型,因此在 maven 构建上不会编译任何内容。 我的想法是将 maven-compiler-plugin 保留在一个 pom 中,因此它适用于所有模块并消除重复。如果有多个模块,处理这种情况的最佳方法是什么? 唯一的方法是按照我在文档中明确所述的建议。如文档中所述,子项目还需要参考插件:【参考方案2】:

您应该检查项目的合规性。在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 中的源代码。由于包装是&lt;packaging&gt;**pom**&lt;/packaging&gt; Maven 不会编译它们。你在 Eclipse 中完成了right click on Project -&gt; Maven -&gt; 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 中定义的 Maven 插件

开发遇到的问题---导入别人的工程后,父工程中的pom依赖引入报错

已部署的 Github 包中缺少父 POM

maven父项目pom.xml文件中的报依赖找不到(dependency not found)红线错误

是否可以不在父pom中指定pluginManagement?