当前位置: 首页 > 知识库问答 >
问题:

maven编译器插件源代码未按预期工作

明阳旭
2023-03-14

我在本地安装了java11,我正在使用maven编译器插件将其源/目标设置为1.8,在我的代码中我正在使用对象。requireNonNullElse(null,new Object()) 在java 8中不支持。当我运行mvn包时,它可以正常工作。我知道maven编译器插件中的source param指定了您想要用来编译源代码的java版本,我将其设置为1.8,但mvn包仍然能够成功编译源代码,即使我使用了java 8中不支持的某些方法。怎么会这样?谢谢

你可以在这里找到我的本地设置

            <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>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
$ java -version
openjdk version "11.0.12" 2021-07-20
OpenJDK Runtime Environment 18.9 (build 11.0.12+7)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.12+7, mixed mode)

共有1个答案

党权
2023-03-14

语言级别(例如lambda的存在或不存在)与标准库之间存在差异。你的问题是后者。

Maven(委托给javac)将始终使用您用来编译的任何JDK的标准库,因为它怎么可能使用其他任何东西?

假设你试图以8Java为目标,但你使用的是JDK 17。假设你使用了一个存在于8Java但在9Java被删除的类。Java17应该如何优雅地处理它?它没有那个类,因为它被删除了。它怎么能针对不存在的东西进行类型检查呢?它不能。

你的情况恰恰相反:你依赖的是一个类,这个类是在一个比你目标更新的Java版本中引入的,但从根本上来说,问题是一样的。

Java真的无法跟踪哪些类和方法是在哪个阶段引入的,除了不能表达全部可能更改的注释(例如我已经提到的删除情况——您不能为不存在的东西添加注释)。为了能够正确支持您期望的行为,JDK需要了解所有以前版本的所有类的所有方法的所有签名,而它没有。

如果这对您来说是一个问题,我可以理解为什么会这样,那么您应该使用与您实际目标版本匹配的JDK版本进行编译。

可能还有一个额外的插件你可以使用,但如果有那么我不知道它。IntelliJ的检查意识到了API的不兼容,这至少证明了通过编程检测这种不兼容在技术上是可行的。

 类似资料:
  • 我目前正在用maven 3.1.1和maven war插件2.4建立一个web项目(http://maven.apache.org/plugins/maven-war-plugin/war-mojo.html). 特别是,我正在尝试用maven war插件复制和过滤资源,这种方式我在过去已经做过了,而且很有效。以下是相关pom配置: WAR插件配置 激活的配置文件定义: META-INF/上下文。

  • 在使用Maven Shade插件构建uber jar时,我试图排除一系列工件。下面是我用于此的配置: 排除没有版本信息的软件包: 但不幸的是,这不是一个选项,因为需要包含不同版本的工件。

  • 更新:我尝试将过滤器实现为OncePerRequestFilter,但仍然不起作用。有人能在这里进一步帮助我吗? 更新2:也试过这个,http://software.dzhuvinov.com/cors-filter-installation.html,运气不好 更新#3:这是我在控制台中的输出,我可以看到响应没有添加任何标题: register.html

  • 我正在使用spring Roo并希望访问Controller类中的一个bean,该类在ApplicationContext.xml中具有以下配置: 配置类本身是: 在我的Controller中,我认为一个简单的Autowired注释应该可以完成这项工作 在启动过程中,spring在setSkipWeeks方法中打印消息。不幸的是,每当我在控制器中调用config.getSkipWeeks()时,它

  • 当我运行以下程序时,它只打印 然而,从Java 8的equalsIgnoreCase文档中我们发现: 如果以下至少一项为真,则两个字符c1和c2被视为相同的忽略情况: •对每个字符应用java.lang.character.ToUpperCase(char)方法会产生相同的结果 所以我的问题是为什么这个程序不打印 在这两种操作中,都使用了大写字符。

  • 我试图使用来传输我根据前面的问题设置的自定义标头。 我在文件中读到... 我的属性包括: