【问题标题】:Facing some problem while defining maven.compiler in pom.xml在 pom.xml 中定义 maven.compiler 时遇到一些问题
【发布时间】:2021-05-04 01:09:45
【问题描述】:

A)总结问题

在 pom maven 中有三种定义编译器版本的方法。 我没有提到 maven.compiler 版本、插件和它工作的版本(意味着 maven 构建成功)然后它是如何选择编译器版本的,我没有提到版本

对于我尝试过的事情,请参阅第 b 部分

1)

<maven.compiler.target>1.8</maven.compiler.target>
  <maven.compiler.source>1.8</maven.compiler.source>
            <plugin> 
            <groupId>org.apache.maven.plugins</groupId> 
            <artifactId>maven-compiler-plugin</artifactId> 
            <version>3.8.1</version> 
            <configuration> 
                <source>1.8</source> 
                <target>1.8</target> 
                <verbose>true</verbose> 
            </configuration> 
    </plugin>
<maven.compiler.release> 8</maven.compiler.release>

B) 我试过的方法

我删除了 maven.compiler 版本和插件,然后它是如何选择编译器版本的

<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>io.flowing.retail</groupId>
    <artifactId>flowing-retail-kafka-shipping</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>

        <spring.boot.version>2.2.5.RELEASE</spring.boot.version>
        <spring-cloud-stream.version>Horsham.RELEASE</spring-cloud-stream.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-stream-dependencies</artifactId>
                <version>${spring-cloud-stream.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-stream-kafka</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <!-- required to add JSR310 time formats for Jackson to ObjectMapper -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-json</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
             <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>              
                <configuration>                         
                      <mainClass>io.flowing.retail.shipping.ShippingApplication</mainClass>
                </configuration>
             </plugin>
             <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                      <goals>
                        <goal>repackage</goal>
                      </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
  1. 我定义了无效的 maven.compiler.release。然后它也可以工作

    4.0.0 io.flowing.retail 流动零售卡夫卡航运 0.0.1-快照 108UTF-81.81.8

             <spring.boot.version>2.2.5.RELEASE</spring.boot.version>
             <spring-cloud-stream.version>Horsham.RELEASE</spring-cloud-stream.version>
         </properties>
         <dependencyManagement>
             <dependencies>
                 <dependency>
                     <groupId>org.springframework.boot</groupId>
                     <artifactId>spring-boot-dependencies</artifactId>
                     <version>${spring.boot.version}</version>
                     <type>pom</type>
                     <scope>import</scope>
                 </dependency>
                 <dependency>
                     <groupId>org.springframework.cloud</groupId>
                     <artifactId>spring-cloud-stream-dependencies</artifactId>
                     <version>${spring-cloud-stream.version}</version>
                     <type>pom</type>
                     <scope>import</scope>
                 </dependency>
             </dependencies>
         </dependencyManagement>
         <dependencies>
             <dependency>
                 <groupId>org.springframework.cloud</groupId>
                 <artifactId>spring-cloud-starter-stream-kafka</artifactId>
                 <exclusions>
                     <exclusion>
                         <groupId>org.springframework.boot</groupId>
                         <artifactId>spring-boot-starter-web</artifactId>
                     </exclusion>
                 </exclusions>
             </dependency>
             <dependency>
                 <!-- required to add JSR310 time formats for Jackson to ObjectMapper -->
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-starter-json</artifactId>
             </dependency>
         </dependencies>
         <build>
             <plugins>
                  <plugin>
                     <groupId>org.codehaus.mojo</groupId>
                     <artifactId>exec-maven-plugin</artifactId>              
                     <configuration>                         
                           <mainClass>io.flowing.retail.shipping.ShippingApplication</mainClass>
                     </configuration>
                  </plugin>
                  <plugin>
                     <groupId>org.springframework.boot</groupId>
                     <artifactId>spring-boot-maven-plugin</artifactId>
                     <executions>
                         <execution>
                           <goals>
                             <goal>repackage</goal>
                           </goals>
                         </execution>
                     </executions>
                 </plugin>
             </plugins>
         </build>
     </project>
    

【问题讨论】:

  • 如果你使用spring boot,设置&lt;java.version&gt;,别无其他。
  • 编译器参数-release 是在Java 9 中引入的。您能edit 您的问题并解释问题所在吗?您想知道哪个参数会覆盖其他参数吗?
  • @dan1st ,在pom maven中定义编译器版本的方法有3种。我没有提到 maven.compiler 版本、插件和它工作的版本(意味着 maven 构建成功)然后它是如何选择编译器版本的,我没有提到版本
  • @PiotrP.Karwasz 你可以参考这个问题的 B 部分吗?我已经做了一些编辑,如果你知道请回答这将是有帮助的
  • 只需设置一个属性java.version,spring boot 就会管理源/目标/发布。

标签: java maven


【解决方案1】:

[让我首先澄清一下您在问题中使用的表达式“选择编译器版本”。您使用的编译器是通过compilerIdcompilerVersion 选项配置的,它通常是您安装的JDK 的编译器。我们正在讨论设置编译器的兼容性选项。]

您提到的属性用于为javac 编译器提供-source-target--release 参数(如果您使用其他编译器,则提供等效参数)。

由于--release 是在 Java 9 中引入的,因此适用于哪个取决于用于运行 maven 的 JDK。如果您提供 --release 参数:

  • 在 JDK 9 及更高版本上,maven 将忽略 -source-target 参数,
  • 在 JDK 8 及更低版本上,编译将严重失败。

ma​​ven-compiler-plugin 指定了提供这些参数的三种方式:

  1. &lt;plugin&gt; 标记的&lt;configuration&gt; 部分中。这个优先于其他,
  2. 作为pom.xml 中的属性。如果您未在 &lt;configuration&gt; 部分中指定参数,则此选项适用,
  3. 如果您未指定上述任何一项,则适用-source-target 的默认值(--release 没有默认值)。

您可以在maven-compiler-plugin.jar(资源META-INF/maven/plugin.xml)中找到默认值:

<configuration>
    ...
    <release implementation="java.lang.String">${maven.compiler.release}</release>
    ...
    <source implementation="java.lang.String" default-value="1.6">${maven.compiler.source}</source>
    ...
    <target implementation="java.lang.String" default-value="1.6">${maven.compiler.target}</target>
</configuration>

因此,由于您使用的是插件的版本 3.8.1,如果您根本不指定任何内容,则适用 Java 6。

TL;DR:如果您使用 Java 9 及更高版本,您的配置选项将按 3.、2.、1 的顺序应用。

编辑:如果你的编译器支持它,在设置-source/-target--release 选项之间,我总是选择后者。使用--release 选项,您将不会遇到this one 之类的问题。发生了什么:源语法与 Java 8 (-source 1.8) 兼容,类可以由 JVM 8 (-target 1.8) 读取,但是方法更改了签名(以向后但不向前兼容的方式)在 Java 8 和 11 之间,并且该库不适用于 JRE 8。

【讨论】:

  • 我只是想再确认一件事,比如我是否使用 release 我应该使用 maven-compiler-plugin 还是不使用
  • 是的,您应该指定您想要插件的 3.8.1 版本。否则你会得到一个非常旧的插件版本(如this question 中所述),它会默默地忽略maven.compiler.version 属性。我相信插件版本3.6.0 是第一个支持这个配置属性的。
猜你喜欢
  • 2013-09-05
  • 2016-12-20
  • 1970-01-01
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多