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 编译的问题了,应该说是一个比较好的最佳实践了!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java SPI机制详解

Java SPI机制详解 1、什么是SPI&#xff1f; SPI 全称为 (Service Provider Interface) &#xff0c;是JDK内置的一种服务提供发现机制。SPI是一种动态替换发现的机制&#xff0c; 比如有个接口&#xff0c;想运行时动态的给它添加实现&#xff0c;你只需要添加一个实现。我们…

高中数学:三角函数-4个解题妙招

一、对偶式 1、针对题型 同角三角函数的问题 2、方法定义 对于形如下方的式子&#xff0c;就可以用对偶式方法解 3、练习 例题1 例题2 二、巧用三角函数定义 1、针对题型 没有给出具体三角函数值的问题 2、方法定义 3、练习 例题1 三、诱导公式 1、针对题型 锐…

VK1618 SOP18/DIP18高稳定LED驱动IC防干扰数显驱动控制器计量插座数显芯片 FAE支持

产品型号&#xff1a;VK1618 产品品牌&#xff1a;永嘉微电/VINKA 封装形式&#xff1a;SOP18/ DIP18 原厂&#xff0c;工程服务&#xff0c;技术支持&#xff01; 概述 VK1618是一种带键盘扫描接口的数码管或点阵LED驱动控制专用芯片&#xff0c;内部集成有3线串行接口、数…

高风险IP的来源及其影响

随着互联网的发展&#xff0c;网络安全问题越来越引人关注。其中&#xff0c;高风险IP的来源成为了研究和讨论的焦点之一。高风险IP指的是那些经常涉及到网络攻击、恶意软件传播以及其他不良行为的IP地址。它们的存在不仅对个人和组织的网络安全构成威胁&#xff0c;还可能给整…

2024年4月最新十大地推拉新APP一手接单平台!盘点地推网推项目渠道!

随着移动互联网的蓬勃发展&#xff0c;APP市场的竞争愈发激烈&#xff0c;各类APP需要不断创新&#xff0c;吸引更多用户。在这个背景下&#xff0c;拉新推广市场愈发兴盛。如果您正在寻找最新的APP拉新渠道&#xff0c;或者想了解如何获取和使用地推拉新资源&#xff1f;那么您…

matlab使用教程(44)—绘制带标记的二维曲线图

在线图中添加标记是区分多个线条或突出显示特定数据点的有用方法。使用下面的一种方式添加标记&#xff1a; • 在线条设定输入参数&#xff08;例如 plot(x,y,-s) &#xff09;中包含标记符号。 • 将 Marker 属性指定为一个名称-值对组&#xff0c;例如 plot(x,y,Marker,s…

元强化学习研究综述

源自&#xff1a;软件学报 作者&#xff1a;陈奕宇, 霍静, 丁天雨, 高阳 “人工智能技术与咨询” 发布 摘 要 近年来, 深度强化学习(deep reinforcement learning, DRL)已经在诸多序贯决策任务中取得瞩目成功, 但当前, 深度强化学习的成功很大程度依赖于海量的学习数据与计…

[阅读笔记5][MoCo]Momentum Contrast for Unsupervised Visual Representation Learning

接下来是MoCo这篇论文&#xff0c;facebook于20年2月发表。 这篇论文研究的是对比学习。 受NLP自监督预训练的模型影响&#xff0c;CV这边也希望能有一个自监督预训练的特征提取器&#xff0c;这样就能很方便的在其他下游任务微调了。而对比学习的目的就是能够自监督预训练得到…

postgresql 备份恢复相关知识点整理归纳 —— 筑梦之路

概述 PG一般有两种备份方式&#xff1a;逻辑备份和物理备份 逻辑备份对于数据量大的场景下耗时较长&#xff0c;恢复也会耗时较长 物理备份拷贝文件的方式相对来说耗时较短&#xff0c;跟磁盘读写性能和网络传输性能有关 逻辑备份 pg_dump pg_dump 将表结构及数据以SQL语句…

传感器展会现场直击!道合顺传感邀您共鉴气体传感器前沿技术

4月14日&#xff0c;#深圳国际传感器#与应用技术展览会在深圳会展中心&#xff08;福田&#xff09;如期举办。道合顺传感亮相本届大会并展示了对气体传感器的探索和最新研究成果&#xff0c;获得了传感器业内的广泛关注。 多年来&#xff0c;道合顺传感依托于雄厚的研发实力&a…

有了一站式知识库服务平台,再也不用担心工作效率了!

你是否记得无数次在海量文件和邮件里搜索资料的烦恼&#xff1f;又或者是在急需某个信息时&#xff0c;却发现它埋藏在某个早已遗忘的文件夹深处&#xff1f;如果你的答案是肯定的&#xff0c;那么一站式知识库服务平台的出现&#xff0c;无疑是你提高工作效率的得力助手。 知识…

Android IPC机制

在Android系统中&#xff0c;IPC&#xff08;Inter-Process Communication&#xff0c;进程间通讯&#xff09;是指在不同进程之间传送数据和通讯的机制。Android中的应用通常运行在独立的沙箱环境中的进程里&#xff0c;由于安全限制&#xff0c;这些进程无法直接访问彼此的内…

arxiv文章导出的bibtex格式是misc导致latex引用不正确

问题 在arxiv官网上右下角导出bibtex&#xff0c;发现是misc格式&#xff0c;然后我用的是springer的期刊latex模板&#xff0c;发现引用不正确。 引用效果如下&#xff0c;就只有一个2024。 解决方案&#xff1a; 把上面那个bibtex手动改成下面这个。 article{liu2024in…

2024最新 PyCharm 2024.1 更新亮点看这篇就够了

2024最新 PyCharm 2024.1 更新亮点看这篇就够了 文章目录 2024最新 PyCharm 2024.1 更新亮点看这篇就够了&#x1f680; PyCharm 2024.1 发布&#xff1a;全面升级&#xff0c;助力高效编程&#xff01;摘要引言 &#x1f680; 快速掌握 Hugging Face&#xff1a;模型与数据集文…

Python leetcode 2844 生成特殊字的最少操作,力扣练习,贪心解法代码实践

今天又来练习力扣了&#xff0c;又是向大佬学习的一天&#xff0c;leetcode 2844 生成特殊字的最少操作 1.题目 给你一个下标从 0 开始的字符串 num &#xff0c;表示一个非负整数。 在一次操作中&#xff0c;您可以选择 num 的任意一位数字并将其删除。请注意&#xff0c;如果…

顶切,半顶切是什么意思?

齿轮加工及刀具中有一些特定名词或者叫法&#xff0c;不熟悉的小伙伴可能最开始会有一些困惑&#xff0c;这不&#xff0c;最近有小伙伴问了一个问题&#xff1a;顶切是说齿顶的倒角吗&#xff1f; 今天就给大家说说顶切和半顶切。 一、顶切 Topping 从字面上可以看到可以想到…

Python学习笔记20 - 模块

什么叫模块 自定义模块 Python中的包 Python中常用的内置模块 第三方模块的安装与使用

Python7种运算符及运算符优先级

🥇作者简介:CSDN内容合伙人、新星计划第三季Python赛道Top1 🔥本文已收录于Python系列专栏: 零基础学Python 💬订阅专栏后可私信博主进入Python学习交流群,进群可领取Python视频教程以及Python相关电子书合集 私信未回可以加V:hacker0327 备注零基础学Python 订阅专…

CloudFlare R2 搭建个人图床教程

为什么搭建自己的图床 平时写博客都是使用 md 格式&#xff0c;要在多个平台发布时&#xff0c;图片需要有外链后续如果博客迁移时&#xff0c;国内的博客网站&#xff0c;比如掘金&#xff0c;简书&#xff0c;语雀等都做了防盗链&#xff0c;图片不好迁移 为什么是CloudFla…

AIX7.2上安装mysql-8.0.17

一、安装 提示&#xff1a;不要采用源码编译方式&#xff0c;根本编译不过去&#xff0c;各种bug&#xff0c;需要针对AIX系统添加各种patch才可以&#xff0c;因此最简单的方式就是直接使用已经编译好的rpm包&#xff0c;如果没有rpm直接放弃就可以了。 1.1. 下载软件依赖包…