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>

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐