Maven 项目 JDK 8、JDK 17 多版本 Java 编译依赖最佳实践

《大数据平台架构与原型实现:数据中台建设实战》博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,京东购书链接:https://item.jd.com/12677623.html,扫描左侧二维码进入京东手机购书页面。

最近几年,整个 Java 生态圈正在并将长期处于从 JDK 8 到 JDK 17 或更高版本的升级换代中,较为典型案例是:以 Spring 为代表的 Web 应用开发框架大多已经升级到了 JDK 17,而在大数据生态圈,Flink、Spark 还在使用 JDK 8,对于那些多模块的 Maven 项目,会出现不同的 Module 使用不同版本的 JDK 问题,这给构建这类项目造成了一些困难,本文简单梳理一下这一问题的解决方法,给出最佳实践。

首先,为了能编译依赖不同 JDK 版本的项目,你在本地必须安装多个对应的 JDK,然后,选择其中一个较为常用的 JDK 设置为 JAVA_HOME,从目前的情况来看,很多主流的 IDE,例如 IntelliJ 也都升级到子 Java 17, 所以我们建议将 Java 17 或更高版本的 JDK 设置为JAVA_HOME, 而不是 JDK 8。

对于具体的 Maven 项目来说,尽管我们可以通过临时更改 JAVA_HOME 环境变量或在命令行中指定 javac.exe 的路径(具体参考《》),但因为每次构建项目时都执行这些琐碎的工作,所以还是很不方便的,最好的做法还是“固化“到项目的 POM 文件中,这样以后都不需要再关注该问题。

多模块的 Maven 项目通常是包含一个 Parent POM 和若干 Module POM,我们以 JDK 8 和 JDK 17 为例,建议这样修改 POM 配置:

1️⃣ 先梳理一下项目中的所有 Module,有多少是基于 JDK 8 的,多少是 JDK 17 的

2️⃣ 选择 Module 多的 JDK 版本作为 ”主 JDK“,在 Parent 的 pom.xml 中显示设置 Maven Comipler Plugin 使用的 javac.exe 路径,我们假设 ”主 JDK“ 是 JDK 8,则配置如下(注意替换 javac.exe 路径):

<build><pluginManagement><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target><fork>true</fork><executable>C:\Lib\Java\jdk-1.8.391\bin\javac.exe</executable><compilerVersion>1.8</compilerVersion></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><!-- disable test when building. tests will run by external testng cmd!--><configuration><skip>true</skip></configuration></plugin></plugins></pluginManagement>
</build>

surefire 的配置与本文讨论话题无关,只是和我们配置 JDK 版本的思路类似,也是想全局 disable test phase, 所以一并提供出来供复用。

3️⃣ 找到 Module 较少的 JDK 版本,也就是 ”次要 JDK“,在 Parent 的 pom.xml 中显示设置 Maven Comipler Plugin 使用的 javac.exe 路径,我们假设 ”次要 JDK“ 是 JDK 17,则配置如下(注意替换 javac.exe 路径):

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target><fork>true</fork><executable>C:\Lib\Java\jdk-17.0.7\bin\javac.exe</executable><compilerVersion>17</compilerVersion></configuration></plugin></plugins>
</build>

完成上述配置后,各个模块就能使用对应的 JDK 进行编译了,且以后构建项目时也不再需要关注多版本 JDK 编译的问题了,应该说是一个比较好的最佳实践了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/435.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu下交叉编译ffmpeg到目标架构为aarch架构的系统

Ubuntu下FFmpeg的aarch64-linux-gnu架构交叉编译教程 一、前言 有时候真的很想报警的&#xff0c;嵌入式算法部署花了好多时间了&#xff0c;RKNN 1808真是问题不少&#xff1b;甲方那边也是老是提新要求&#xff0c;真是受不了。 由于做目标检测&#xff0c;在C代码中有对视…

Kingbase(人大金仓数据库)(总结全网精华,虚拟机:从安装到操作数据库一条龙)

前言&#xff1a; 前一阵子一直在捣鼓人大金仓数据库&#xff0c;虽然国产化的数据库很值得夸赞&#xff0c;但是网上的资料确实少的可怜。特此记录一下我在学习这个数据库的心酸历程。 安装就看这个大哥的&#xff0c;我之前安装就是看的他的&#xff0c;非常靠谱。 linux安装…

Embedding例子:简单NN网络、迁移学习例子

一、简单例子&#xff1a;构造简单NN网络生成Embedding 1、pytorch例子 2、tensorflow例子 # 1导入模块 import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Embedding import numpy as np# 2构建语料库 corpus[[…

每日两题 / 22. 括号生成 54. 螺旋矩阵(LeetCode热题100)

22. 括号生成 - 力扣&#xff08;LeetCode&#xff09; dfs生成合法的括号序列即可 class Solution { public:vector<string> ans;void dfs(int l, int r, int n, string& s){if (s.size() n * 2){ans.push_back(s);return;}if (l){s "(";dfs(l - 1, …

Burpsuite插件 BurpAPIFinder专为未授权/敏感信息/越权而生

BurpAPIFinder 攻防演练过程中&#xff0c;我们通常会用浏览器访问一些资产&#xff0c;但很多未授权/敏感信息/越权隐匿在已访问接口过html、JS文件等&#xff0c;通过该Burp插件我们可以&#xff1a; 1、发现通过某接口可以进行未授权/越权获取到所有的账号密码、私钥、凭证 …

记录方式重新打开人生

文章目录 引言节省生命感知细节的能力正视痛苦总结 引言 你是否遇到以下问题 时间过得很快&#xff0c;不知道过去在忙什么事情很多很杂&#xff0c;感觉一直都很忙但是好像也没啥收获生活、工作中不顺心的事情很多&#xff0c;心里比较烦躁压抑 那么可以尝试参考《奇特的一…

python环境引用《解读》----- 环境隔离

首先我先讲一下Anaconda&#xff0c;因为我用的是Anaconda进行包管理。方便后面好理解一点。 大家在python中引用环境的时候都会经历下面这一步&#xff1a; 那么好多人就会出现以下问题&#xff08;我就是遇到了这个问题&#xff09;&#xff1a; 我明明下载了包&#xff0c…

吴恩达深度学习笔记:深度学习的 实践层面 (Practical aspects of Deep Learning)1.1-1.3

目录 第一门课&#xff1a;第二门课 改善深层神经网络&#xff1a;超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第一周&#xff1a;深度学习的 实践层面 (Practical aspects of Deep Learning)…

阶段性学习汇报 4月19日

一、毕业设计和毕业论文 毕业设计后端功能基本实现&#xff0c;但是还有些具体的细节需要优化&#xff0c;例如这些图片的显示问题&#xff0c;前端只有个前端页面以及部分交互逻辑&#xff0c;还需进一步完善。我想在疾病预测这里加一个创新点&#xff0c;基于推荐算法。小程序…

测绘管理与法律法规 | 中华人民共和国测绘法 | 学习笔记

《中华人民共和国测绘法》笔记&#xff1a; 第一章 总则 第一条&#xff1a;立法目的&#xff0c;即加强测绘管理&#xff0c;促进测绘事业发展&#xff0c;保障测绘事业为经济建设、国防建设、社会发展和生态保护服务&#xff0c;维护国家地理信息安全。 第二条&#xff1a;…

网络爬虫软件学习

1 什么是爬虫软件 爬虫软件&#xff0c;也称为网络爬虫或网络蜘蛛&#xff0c;是一种自动抓取万维网信息的程序或脚本。它基于一定的规则&#xff0c;自动地访问网页并抓取需要的信息。爬虫软件可以应用于大规模数据采集和分析&#xff0c;广泛应用于舆情监测、品牌竞争分析、…

ollama大语言模型

查看已经安装的大语言模型 ollama list运行大语言模型 ollama run llama2:latest

Qt实现Mysql数据库的连接,查询,修改,删除,增加功能

Qt实现Mysql数据库的连接&#xff0c;查询&#xff0c;修改&#xff0c;删除&#xff0c;增加功能 安装Mysql数据库&#xff0c;QtCreator Mysql选择Mysql Server 8.1版本安装。 Mysql Server 8.1安装过程 1.首先添加网络服务权限&#xff1a; WinR键输入compmgmt.msc进入…

Linux【实战】—— LAMP环境搭建 部署网站

目录 一、介绍 1.1什么是LAMP&#xff1f; 1.2LAMP的作用 二、部署静态网站 2.1 虚拟主机&#xff1a;一台服务器上部署多个网站 2.1.1 安装Apache服务 2.1.2 防火墙配置 2.1.3 准备网站目录 2.1.4 创建网站的配置文件 2.1.5 检查配置文件是否正确 2.1.6 Linux客户端…

web自动化系列-selenium的3种等待方式(十一)

在ui自动化测试中&#xff0c;几乎出现问题最多的情况就是定位不到元素 &#xff0c;当你的自动化在运行过程中 &#xff0c;突然发现报错走不下去了 。很大概率就是因为找不到元素 &#xff0c;而找不到元素的一个主要原因就是页面加载慢 &#xff0c;代码运行速度快导致 。 …

深入理解MySQL中的UPDATE JOIN语句

在MySQL数据库中&#xff0c;UPDATE语句用于修改表中现有的记录。有时&#xff0c;我们需要根据另一个相关联表中的条件来更新表中的数据。这时就需要使用UPDATE JOIN语句。最近我们遇到了这样的需求&#xff1a;我们有一张历史记录表&#xff0c;其中一个字段记录了用,连接的多…

【转】关于vsCode创建后,不显示NPM脚本解决

刚刚使用vue ui新建了个vue项目&#xff0c;打开vs-code发现&#xff0c;无论怎么设置都找不到NPM脚本显示&#xff0c;苦恼了很久&#xff0c;突然发现&#xff01;打开了package-lock.json&#xff0c;然后立马把vs-code关闭&#xff0c;重新打开&#xff0c;就显示了npm脚本…

DePT: Decoupled Prompt Tuning 论文阅读

DePT: Decoupled Prompt Tuning 了论文阅读 Abstract1. Introduction2. Methodology2.1. Preliminaries2.2. A Closer Look at the BNT Problem2.3. Decoupled Prompt Tuning 3. Experiments5. Conclusions 文章信息&#xff1a; 原文链接&#xff1a;https://arxiv.org/abs/…

【行为型模式】模板方法模式

一、模板方法模式概述 模板方法模式定义&#xff1a;在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。(类对象型模式) 模板方法中的基本方法是实现算法的各个步骤&#xff0c;是模板方法的…

rocketmq-dashboard打包测试报错

rocketmq-dashboard运行的时候没问题&#xff0c;但是打包执行测试的时候就是报错 这时候跳过测试就可以成功 报错为 There are test failures. Please refer to D:\CodeEn\rocketmq-dashboard\target\surefire-reports for the individual test results. 你只需要跳过测试就…