当前位置: 首页 > news >正文

Java历史:从橡树到火星探索,从微软法律战到Spring、Gradle

从诞生到征服星球。本文探索Java的历史:从其第一步和与微软的法律战到每个Java开发者都依赖的必备工具。是的——你会发现为什么橡树、咖啡和一个岛屿扮演着主角。

2025最全Java学习资料

1990年——一棵橡树:坚实的开始

Sun Microsystems启动了Java编程语言项目。工程师James Gosling、Mike Sheridan和Patrick Naughton领导了开发工作。他们的核心使命是创建一种能够在各种电子设备上运行的通用语言——从银行卡和厨房电器到电视遥控器。

一个主要障碍很突出:制造商使用具有不同处理器和架构的控制器。这使得为所有设备创建单一代码库变得不可能。为了克服这个问题,团队优先避免与特定硬件或操作系统的刚性绑定。

他们巧妙的解决方案是什么?Java没有将源代码直接编译成特定处理器的机器代码,而是采用了一种称为字节码的中间表示。这个字节码在Java虚拟机(JVM)内运行,实现了平台独立性。因此,任何具有兼容JVM的设备都可以执行相同的字节码。

最初,Gosling将语言命名为Oak——灵感来自他们办公室外的一棵橡树。但在官方发布准备期间,他们发现Oak Technologies已经持有该商标。

语言重新命名为Java,让人想起来自爪哇岛的印尼咖啡。在一个版本中,咖啡象征着Java最初针对编程的日常技术(如咖啡机)。

经过七年的开发,Java 1.0于1996年首次亮相。这标志着Java作为一个平台独立、灵活且多功能的编程工具的出现。

1997年——Sun Microsystems vs. 微软

从Windows 98开始,微软将其自己的Java虚拟机(MSJVM)捆绑到操作系统和Internet Explorer中(从第三个版本开始)。但MSJVM偏离了Sun的规范,删除了关键组件如远程方法调用(RMI)和Java本地接口(JNI)。更重要的是,微软添加了仅限Windows的功能,与原始规范不兼容,如Java和DCOM集成工具。

这些变化破坏了Java的跨平台基本原则。这引发了Sun Microsystems的严重投诉,导致对微软的诉讼。在诉讼过程中,法院认定Sun Microsystems是正确的,这导致微软终止了对JVM的独立支持。根据协议条款,微软支持其虚拟机直到2007年,随后永久关闭项目。

1998年——J2SE 1.2:超出预期

JDK 1.2引入了如此巨大的变化,以至于Sun将平台重新命名为Java 2 Platform Standard Edition(J2SE 1.2)。这标志着Java生态系统发展的新阶段。

strictfp关键字开启了关键创新列表。这个修饰符限制浮点数的计算。它确保跨平台的一致浮点计算,无论硬件实现和操作系统差异如何。这个功能对Java至关重要,因为它追求完全的平台独立性。

J2SE 1.2还引入了用于创建图形界面的新库Swing。建立在Abstract Windows Toolkit(AWT)之上,Swing在功能上超越了AWT,并提供了扩展的自定义组件集,如按钮、列表、表格和面板。Swing的组件是轻量级的,这增加了价值。这意味着它们不直接依赖于原生OS窗口元素,使界面更便携和可定制。

除了Swing,这个Java版本还添加了Collections Framework,这是一个用于处理不同类型数据集合的基础框架。在此之前,Java只有基本结构,如数组、向量和哈希表。没有统一接口,每个结构都必须以不同方式处理。例如,Vector类不方便扩展,因为其大部分方法都声明为final。集合框架允许在统一接口下统一不同的数据结构,使处理它们更加通用和方便。

Java虚拟机(JVM)又迈出了另一个重大技术步骤——包含即时(JIT)编译。首先使用的Sun JIT编译器通过在运行时将字节码编译为机器代码来提高性能,与解释相比加速了执行。

此外,J2SE 1.2中添加的完整Unicode支持使开发者能够处理各种语言的文本。这为将Java打造成开发全球和多语言应用的通用语言铺平了道路。

2001年——IntelliJ IDEA:JetBrains销售愿景

JetBrains发布了IntelliJ IDEA,这是一个围绕Java语言设计的集成开发环境。当时,IntelliJ IDEA因其竞争对手产品中以前没有的高级功能而脱颖而出。特别是,IntelliJ IDEA通过高级代码导航和重构工具彻底改变了Java IDE,这些工具简化和加速了开发过程。

八年后,在2009年,JetBrains做出了战略决定,开放IntelliJ IDEA源代码并在免费的Apache 2.0许可证下发布。产品分为两个版本。第一个是Community Edition,包含所有作为开源解决方案分发的组件。第二个是Ultimate Edition,保持专有性并提供专为专业开发设计的额外工具。

开放源代码促进了其他基于IntelliJ IDEA的解决方案的开发。其最著名的分支是Android Studio:Google的官方Android应用开发环境,与JetBrains联合创建。2020年,中国公司华为创建了自己的基于IntelliJ IDEA的IDE DevEco Studio,用于开发HarmonyOS应用。

IntelliJ IDEA迅速在专业人士中获得关注。早在2010年,InfoWorld就将这个IDE评为顶级Java工具,与市场上其他解决方案相比给予最高评级。

JetBrains现在是专业开发者工具的领先创造者。它为Java和其他编程语言创建IDE,包括Python、JavaScript、C++、Go等。

同年:Eclipse。日食IDE

2001年11月,Eclipse作为另一个Java IDE出现。Eclipse深受IBM创建的基于SmallTalk语言的VisualAge IDE影响。VisualAge以强大但复杂和整体系统而闻名。因此,在开发Eclipse时,创建者重新设计了其架构:新IDE被设计为具有插件支持的模块化和可扩展平台,这成为其关键优势之一。

Eclipse的发布标志着向开源软件迈出的重要一步。2001年11月,成立了一个专门的联盟——Eclipse Consortium。其任务是协调平台开发工作。主要IT公司加入了这个联盟,包括Borland、IBM、Merant、QNX Software Systems、Rational Software、Red Hat、SuSE、TogetherSoft和WebGain。董事会管理联盟并对平台的未来做出关键决策。会员迅速增长,到2003年,已经包括80多个组织。

多年来,Eclipse因其开源性质、灵活性、大量插件和强大的社区支持而成为Java开发最受欢迎的IDE。然而,在2016年,IntelliJ IDEA最终接管了领导地位。

2002年——Spring。Java EE寒冬后的春天

2002年10月,Rod Johnson出版了《Expert One-on-One J2EE Design and Development》一书,对Java EE——当时构建企业Java应用的主要标准——进行了批判性评估。作者强调了其过度复杂性、笨重性、高成本以及开发者使用平台时面临的困难。作为替代方案,Rod建议了一种基于普通Java类和依赖注入机制的更简单、更灵活的方法。这种方法通过解决Java EE的许多固有问题迅速获得了社区的关注。

早在2003年,Johnson与Jürgen Höller和Yann Caroff一起开始开发一个名为Spring的新开源框架。同年6月,第一个公开版本——Spring 0.9——在Apache 2.0许可证下发布,随后在2004年发布Spring 1.0。由于其简单性、易于配置、使用IoC和AOP原则,以及对POJO的支持(而Java EE依赖有局限性的EJB组件),Spring作为Java EE替代方案迅速获得普及。

与需要重量级容器和严格遵守标准的Java EE不同,Spring提供了更模块化、轻量级和灵活的解决方案。它允许开发者使用普通Java对象(POJO),同时提供强大的依赖注入和面向切面编程功能。

Spring的成功标志着企业Java开发的重大转变。它证明了复杂的企业应用可以用更简单、更直观的方式构建,而不牺牲功能或性能。

2004年——Maven:构建工具的标准化

Apache Maven于2004年发布,彻底改变了Java项目的构建和依赖管理方式。在Maven之前,开发者主要依赖Apache Ant,它需要大量的XML配置和手动依赖管理。

Maven引入了约定优于配置的原则,提供了标准化的项目结构和生命周期。它自动处理依赖解析,从中央仓库下载所需的库,并管理传递依赖。这大大简化了项目设置和维护。

Maven的POM(Project Object Model)文件成为项目配置的中心点,包含所有必要的信息,从依赖关系到构建插件。这种标准化使团队更容易协作,新开发者更容易加入项目。

Maven还引入了强大的插件系统,允许扩展构建过程以包含测试、代码质量检查、部署等功能。这为持续集成和部署实践铺平了道路。

2007年——Gradle:下一代构建系统

Gradle于2007年发布,代表了构建系统的下一个进化步骤。虽然Maven解决了Ant的许多问题,但它仍然受到XML配置的僵化限制。Gradle引入了基于Groovy的DSL(领域特定语言),提供了更灵活和表达性的配置选项。

Gradle的主要优势包括:

  •  灵活性:与Maven的严格约定不同,Gradle允许自定义构建逻辑和项目结构
  •  性能:增量构建和并行执行显著提高了构建速度
  •  可扩展性:强大的插件API允许创建自定义构建功能
  •  多项目支持:优秀的支持用于管理大型多模块项目

Gradle迅速在企业环境中获得采用,特别是在Android开发中,Google选择它作为官方构建工具。它也成为了Spring Boot项目的默认选择,进一步巩固了其在Java生态系统中的地位。

2012年——Java 8:Lambda和流

Java 8于2012年发布,代表了语言的一个重大里程碑。它引入了函数式编程特性,特别是lambda表达式和Stream API,彻底改变了Java开发者编写代码的方式。

Lambda表达式允许将函数作为参数传递,使代码更简洁和表达性。Stream API提供了强大的数据操作工具,支持声明式编程风格。这些特性使Java更适合现代编程需求,特别是在处理集合和数据转换时。

Java 8还引入了其他重要特性,如Optional类(用于处理空值)、新的日期时间API(java.time包)和默认方法(允许接口包含实现)。这些改进使Java更安全、更易用,并为未来的发展奠定了基础。

2014年——Java 8 LTS:长期支持

Java 8被指定为长期支持(LTS)版本,这意味着它将获得多年的安全更新和错误修复。这个决定对Java生态系统产生了深远影响,因为许多企业选择在生产环境中使用LTS版本以确保稳定性。

LTS概念帮助解决了Java版本碎片化问题,为企业提供了明确的升级路径。它还鼓励了更保守的采用策略,特别是在关键业务应用中。

2017年——Java 9:模块系统

Java 9引入了Java平台模块系统(JPMS),这是对Java架构的重大改变。模块系统允许开发者创建更小、更专注的应用程序,只包含必要的依赖。

模块系统的主要好处包括:

  •  更好的封装:强制的访问控制防止意外使用内部API
  •  改进的性能:更小的运行时和更快的启动时间
  •  更好的安全性:减少攻击面
  •  简化的部署:自包含的应用程序更容易分发

虽然模块系统最初面临一些采用挑战,但它为Java的未来发展奠定了基础,特别是在微服务和云原生应用方面。

2018年——Java 11 LTS:现代Java

Java 11是第二个LTS版本,引入了几个重要特性:

  •  HTTP客户端:现代化的HTTP客户端API,支持HTTP/2和WebSocket
  •  局部变量类型推断:使用var关键字简化变量声明
  •  字符串方法:新的字符串操作方法
  •  改进的垃圾收集器:G1GC成为默认收集器

Java 11标志着向更现代、更高效的Java平台的转变,同时保持了向后兼容性。

2020年——Java 14:记录和模式匹配

Java 14引入了记录(Records),这是一种新的类类型,专门用于表示不可变数据。记录自动生成构造函数、访问器、equals()、hashCode()和toString()方法,大大减少了样板代码。

模式匹配的预览版本也引入了,允许更简洁的条件检查和类型转换。这些特性使Java代码更简洁、更易读,并减少了常见的编程错误。

2021年——Java 17 LTS:密封类和开关

Java 17于2021年9月14日发布,引入了许多语言创新。

最明显的语法变化之一是密封类和接口。这种构造允许限制可以继承或实现给定类型的类列表。这种方法加强了对应用程序架构的控制,使继承模型更可预测,并提高代码安全性和可维护性。

对新的switch语法的支持也得到了扩展,使其更具表达性。现在switch不仅可以使用值,还可以使用对象类型。这简化了实现类型相关逻辑,并使Java更接近模式匹配能力。

Java与本地代码交互的重要一步是实验性的Foreign Function & Memory API。这个API提供了调用本地库和在JVM管理环境外处理内存的安全高效方式,为与系统资源和高性能库的更紧密集成铺平了道路。

标准库中也出现了有用的添加。例如,java.util中的HexFormat类提供了方便的十六进制表示处理,对处理二进制数据很有用。java.time包获得了InstantSource接口并启用了当前时间的模拟。这使得为时间相关组件编写测试更容易。

最后,Java 17继续改进跨平台性能,特别是通过为macOS上的2D图形引入新的Apple Metal图形管道。这提高了渲染效率并改善了与现代图形标准的兼容性。

2023年——Java 21:模式、线程和一些表情符号

下一个LTS版本Java于2023年9月19日发布。Java 21继续发展语言和平台,强调可扩展性、表达性和安全性。这个版本稳定并正式整合了以前实验性的功能,显著扩展了开发者能力。

一个头条事件是虚拟线程的引入——轻量级执行线程,大大简化了创建可扩展并发应用程序。它们能够高效处理数千个并行任务而不超载系统资源,这对服务器和云应用程序至关重要。

Java语法变得更简单和更具表达性。字符串模板和文本块使处理字符串更容易。未命名变量和模式允许从复杂对象中方便地提取值。无需指定类名编写程序的能力(顶级语句)简化了脚本和实用程序的创建。

标准集合库获得了新的SequencedCollection、SequencedSet和SequencedMap接口,确保元素顺序保持。这在数据序列影响应用程序逻辑时特别重要。

从安全角度来看,Java 21引入了密钥封装机制(KEM)API——一种现代加密工具,专为对称密钥的安全传输而设计。这是实现安全协议和网络交互的关键更新。

此外,语言继续移除遗留元素,简化平台支持,并减少技术债务。

2025年——现在:Java 25、Project Valhalla和Project Loom

Java 25——下一个LTS版本——预计在2025年9月发布,继续发展语言和虚拟机。

Project Valhalla正在开发中——一个主要的OpenJDK计划,旨在现代化Java的对象模型。

在Java的当前模型中,所有对象都存储在堆上。访问堆通常比访问直接放在栈上或连续内存中的原始类型或结构更慢。此外,许多堆对象增加了垃圾收集器负载。

Project Valhalla引入值对象。这些对象按内容而不是引用进行比较,并像原始类型一样直接存储在内存中,无需额外包装。

这些变化将加速内存操作,减少垃圾收集器负载,并提高集合性能。

尽管仍在开发中,一些计划的Valhalla变化已经出现在以前的Java版本中(JEP 181、JEP 309、JEP 334、JEP 390、JEP 371)。

Project Loom也在开发中。其目标是简化和增强Java并发,使其更具可扩展性、高效性和直观性。

Java的当前线程模型依赖于操作系统管理的平台线程。这些线程资源密集且难以扩展:创建数万或数十万个线程成本高昂且效率低下。

Project Loom的重要部分已经实现:虚拟线程成为平台的稳定部分(在Java 21部分中提到),但同样重要的部分仍未完成。

结构化并发正在开发中——一种所有子线程在特定代码块内开始和结束的方法。这简化了线程生命周期管理,使代码更安全、更可预测。

作用域值也在开发中——ThreadLocal的替代方案,安全地将值传递到虚拟线程中,没有泄漏或冲突风险,对上下文敏感任务很有用。

结论

我们穿越Java历史的旅程到此结束。这是一次激动人心的冒险:我们探索了各种技术创新和技术,以及围绕语言及其发展的背景。

请注意,本文中事件的选择反映了作者的观点,可能与您在此类注释中期望的不同。如果您认为我们遗漏了什么,请在下面的评论中分享!

2025最全Java学习资料

http://www.dtcms.com/a/262955.html

相关文章:

  • [6-02-01].第05节:配置文件 - 读取配置文件的内容
  • 一、(基础)构建一个简单的 LangChain 应用
  • 对称非对称加密,https和http,https通讯原理,Charles抓包原理
  • macos 使用 vllm 启动模型
  • WIFI 低功耗保活知识系列---三.WiFi AP如何广播自己的缓存区信息
  • OpenCV CUDA模块设备层----计算向量的平方根函数sqrt
  • 基于Spring Boot的绿园社区团购系统的设计与实现
  • Python 安装使用教程
  • Spring Boot 启动性能优化实战指南
  • 基于 SpringBoot+Vue.js+ElementUI 的 Cosplay 论坛设计与实现7000字论文
  • 【硬核数学】2.7 理论与现实的鸿沟:深度学习的数值稳定性挑战《从零构建机器学习、深度学习到LLM的数学认知》
  • 【Spring】——事务、整合、注解
  • 后台管理系统模板Art Design Pro
  • js代码03
  • Karmada 多集群服务发现
  • Apache Doris Profile 深度解析:从获取到分析,解锁查询性能优化密码
  • RedhatCentos挂载镜像
  • LeetCode Hot100(图论)
  • SQL参数化查询:防注入与计划缓存的双重优势
  • 使用 Sqlcmd 高效导入大型 SQL Server 数据库脚本 (.sql)
  • 深入理解 B+ 树:数据库索引的脊梁
  • AI初学者如何对大模型进行微调?——零基础保姆级实战指南
  • vscode一个文件夹有残余的git仓库文件,已经失效了,怎样进行清空仓库残余文件并重新初始化git--ubuntu
  • 【stm32】HAL库开发——CubeMX配置RTC,单片机工作模式和看门狗
  • 炸鸡派-基础测试例程
  • Linux入门篇学习——Ubuntu 系统介绍和Ubuntu启用root用户
  • 在线五子棋对战项目
  • 1.1_2 计算机网络的组成和功能
  • python+uniapp基于微信小程序的食堂菜品查询系统
  • Deepoc 大模型:无人机行业的智能变革引擎