Java异常 #IntelliJ IDEA改了项目的Target bytecode version

1.问题现象

用 Intellij IDEA 新建 Java 项目,使用 JDK1.8,设置 Target bytecode version 为 1.8,Language level 为 1.8。但是,每新加一个模块,刚才设置的 Target bytecode version 又全部都变成了 1.5。

再次把 Java Compiler 的 Target bytecode version 或者把 Project Settrings 的 Target bytecode version 设置成 1.8。过了一会儿又会提示 1.5。

 

2.排查分析

Maven 是个项目管理工具,如果我们不告诉它我们的代码要使用什么样的 jdk 版本编译的话,它就会用 maven-compiler-plugin 默认的 jdk 版本来进行处理,这样就容易出现版本不匹配的问题。例如代码中要是使用上了 jdk1.8 的新特性,但是 maven 在编译的时候使用的是 jdk1.6 的版本,那这一段代码是完全不可能编译成 .class 文件。

为什么会这样呢?

编译器插件用于编译项目的源代码。从 3.0 开始,默认编译器是 javax.tools.JavaCompiler(如果使用的是Java 1.6),并且用于编译 Java 源代码。如果你想强制插件使用 javac,你必须配置插件选项 forceJavacCompilerUse。
还要注意,目前默认的源代码设置是 1.5,默认的目标设置是 1.5,与运行 Maven 的 JDK 无关。如果要更改这些默认值,则应按照设置 Java 编译器的 -source 和 -target 中所述设置源和目标。 

 

3.解决方案

3.1. 项目最外层的 pom.xml 配置文件中添加以下配置: 

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <!-- 一般而言,target与source是保持一致的,但是,有时候为了让程序能在其他版本的jdk中运行(对于低版本目标jdk,源代码中需要没有使用低版本jdk中不支持的语法),会存在target不同于source的情况 -->
                    <!-- 源代码使用的开发版本 -->
                    <source>1.8</source>
                    <!-- 需要生成的目标class文件的编译版本 -->
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

3.2. 或者检查一下 maven 安装目录下的 \maven\conf\settings.xml 文件,看看 maven.compiler.source 设置的是哪个版本,然后改成自己使用的版本

	<activation>
		<activeByDefault>true</activeByDefault>
		<jdk>1.7</jdk>
	</activation>
	<properties>
		<maven.compiler.source>1.7</maven.compiler.source>
		<maven.compiler.target>1.7</maven.compiler.target>
		<maven.compiler.compilerVersion>1.7</maven.compiler.compilerVersion>
	</properties>

 

  • 15
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值