1.下载maven
https://maven.apache.org/download.cgi
2.解压tar包到/usr/local目录:
tar -zxvf apache-maven-3.6.3-bin.tar.gz
3.配置环境变量
vim /etc/profile
JAVA_HOME=/usr/local/jdk
MAVEN_HOME=/usr/local/maven
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
4.修改maven配置文件
cd /usr/local/maven/conf
vim settings.xml
- 修改maven仓库地址
<localRepository>/usr/local/maven/repository</localRepository>
- 设置镜像仓库地址为阿里云
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
- 配置jdk版本
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
5.验证是否安装成功
mvn -v
6.在 JDK 9+ 中,推荐使用 <maven.compiler.release>
替代传统的 <maven.compiler.source>
和 <maven.compiler.target>
在 JDK 9+ 中,推荐使用 <maven.compiler.release>
替代传统的 <maven.compiler.source>
和 <maven.compiler.target>
,主要基于以下原因:
1. 解决跨版本兼容性问题
• source/target
的缺陷:
当使用 <source>1.8</source>
和 <target>1.8</target>
时,编译器只会确保生成的字节码兼容 Java 8,但不会限制使用 Java 9+ 的新 API。如果代码中误用了高版本 API(如 JDK 11 的 var
),编译会通过,但在运行时(若环境是 Java 8)会抛出 LinkageError
。
• release
的严格限制:
<release>8</release>
会同时限制:
• 字节码版本(等同于 target
)
• 可用的 API 范围(禁止使用 JDK 9+ 的新 API)
• 语言语法检查(禁止使用高版本语法,如 var
)
示例:
// 如果使用 <release>8</release>,以下代码会编译失败(JDK 10+ 的 `var`)
var list = new ArrayList<String>();
2. 避免“类文件版本不一致”问题
• target
的局限性:
即使设置 <target>1.8</target>
,如果开发者本地用 JDK 11 编译,生成的 .class
文件可能包含高版本格式(如模块化信息),导致在 Java 8 环境运行时出现 UnsupportedClassVersionError
。
• release
的严格一致性:
<release>
会强制编译器生成完全符合指定版本的字节码文件,包括移除高版本特有的元数据(如模块化描述符)。
3. 简化配置
• 传统方式:
需要同时配置 source
、target
和 bootstrap classpath
(确保使用正确的核心库):
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.bootclasspath>${java.home}/lib/rt.jar</maven.compiler.bootclasspath>
• release
方式:
一行配置解决所有问题:
<maven.compiler.release>8</maven.compiler.release>
4. 支持模块化(JPMS)
如果项目使用 Java 9+ 的模块系统(module-info.java
),<release>
能正确处理模块路径(--module-path
)和模块化约束,而 source/target
可能引发模块化兼容性问题。
如何迁移?
在 pom.xml
中的配置:
<properties>
<!-- JDK 9+ 推荐方式 -->
<maven.compiler.release>8</maven.compiler.release>
<!-- 传统方式(不推荐) -->
<!-- <maven.compiler.source>1.8</maven.compiler.source> -->
<!-- <maven.compiler.target>1.8</maven.compiler.target> -->
</properties>
注意事项:
• 版本号格式:
<release>
使用整数(如 8
、11
、17
),而 source/target
使用 1.8
、11
均可。
• 最低要求:
需 Maven 3.6.0+ 和 maven-compiler-plugin
3.6.0+。
• IDE 兼容性:
IntelliJ/ Eclipse 需同步更新项目配置(可能需要重新导入 Maven 项目)。
总结
特性 | source/target | release |
---|---|---|
限制字节码版本 | ✔️ | ✔️ |
限制高版本 API | ❌ | ✔️ |
限制高版本语法 | ❌ | ✔️ |
支持模块化 | 部分支持 | ✔️ |
配置复杂度 | 高 | 低 |
结论:在 JDK 9+ 环境中,<release>
是更安全、更简洁的编译选项,能有效避免跨版本兼容性问题。