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

Ubuntu 20.04 LTS - 配置 OpenJDK 8 开发环境

1. 为什么选择Ubuntu 20.04 LTS和OpenJDK 8

如果你正在搭建一个Java开发环境,特别是需要运行一些老项目或者Hadoop、Spark这类大数据框架,Ubuntu 20.04 LTS和OpenJDK 8的组合是个非常稳妥的选择。Ubuntu 20.04 LTS作为长期支持版本,提供了5年的安全更新,这意味着你可以获得一个稳定可靠的开发平台。而OpenJDK 8虽然已经不算最新版本,但仍然是很多企业级应用的标准配置,特别是那些还没有迁移到新版本Java的项目。

我在实际工作中遇到过不少这样的情况:新项目可以用Java 11甚至17,但维护老项目时还是得老老实实用Java 8。有一次接手一个Spark项目,用Java 11跑起来各种兼容性问题,换回Java 8就一切正常了。这也是为什么很多开发者服务器上都会同时安装多个Java版本的原因。

2. 准备工作:系统更新与检查

在开始安装之前,我们需要确保系统是最新的。这不仅能避免一些潜在的依赖问题,还能提高安全性。打开终端,运行以下命令:

sudo apt update sudo apt upgrade -y

这个步骤可能会花点时间,取决于你的网络速度和系统更新量。我建议在服务器负载低的时候进行,特别是生产环境。有一次我在高峰期更新,结果因为网络问题导致部分包下载失败,后来不得不手动修复依赖关系。

更新完成后,我们可以先检查下系统是否已经安装了Java:

java -version

如果看到类似"Command 'java' not found"的提示,说明系统里确实没有安装Java。但如果已经安装了其他版本的Java,你可能需要考虑是否需要保留多版本共存。我通常会保留多个Java版本,通过update-alternatives来切换,这在开发不同项目时特别有用。

3. 安装OpenJDK 8完整开发环境

现在来到核心步骤 - 安装OpenJDK 8。很多人可能只安装JRE(Java运行时环境),但作为开发者,我们需要完整的JDK(Java开发工具包)。执行以下命令:

sudo apt install openjdk-8-jdk

这个命令会自动安装JDK和所有必要的依赖项。你会看到apt列出了将要安装的包,包括:

  • openjdk-8-jdk:完整的开发工具包
  • openjdk-8-jre:Java运行时环境
  • 各种依赖库和工具

安装过程中,系统会提示你确认磁盘空间使用(大约需要160MB左右)。按'y'继续。这里有个小技巧:如果你只是想试试看,可以先不安装,用apt show openjdk-8-jdk查看详细信息,包括安装大小。

我曾经在一个磁盘空间紧张的服务器上安装,结果因为空间不足失败了。后来发现是因为/var/cache/apt/archives里堆积了太多旧的deb包。清理后顺利安装:

sudo apt clean

4. 验证安装与基本配置

安装完成后,我们需要确认一切正常。首先检查Java版本:

java -version

应该能看到类似这样的输出:

openjdk version "1.8.0_312" OpenJDK Runtime Environment (build 1.8.0_312-8u312-b07-0ubuntu1~20.04-b07) OpenJDK 64-Bit Server VM (build 25.312-b07, mixed mode)

接着检查编译器是否可用:

javac -version

这两个命令都正常工作的话,说明基本环境已经就绪。但要让Java程序能正确运行,还需要设置一个关键环境变量:JAVA_HOME。

5. 设置JAVA_HOME环境变量

很多Java工具(如Maven、Gradle)和应用程序(如Tomcat)都需要知道Java安装位置,这就是JAVA_HOME的作用。首先找出Java的安装路径:

sudo update-alternatives --config java

这会列出系统里所有Java安装,看起来像这样:

There is only one alternative in link group java (providing /usr/bin/java): /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java

记下路径(去掉最后的/bin/java部分),然后编辑/etc/environment文件:

sudo nano /etc/environment

在文件末尾添加:

JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"

保存退出后,运行以下命令使更改生效:

source /etc/environment echo $JAVA_HOME

这里有个容易踩的坑:如果你同时在多个终端窗口工作,记得在每个需要用到JAVA_HOME的窗口都执行source命令,或者干脆注销重新登录。我有次调试了半天为什么Maven找不到JAVA_HOME,结果发现是因为开了新终端窗口没重新加载环境变量。

6. 多版本Java管理(可选)

如果你的系统需要同时安装多个Java版本,可以使用update-alternatives来管理。比如安装Java 11:

sudo apt install openjdk-11-jdk

然后配置默认版本:

sudo update-alternatives --config java

系统会列出所有已安装的Java版本,让你选择默认使用哪个。同样的方法也适用于javac等工具。我在开发机上通常会保留Java 8和11,根据项目需要切换。

7. 常见问题排查

即使按照步骤操作,有时也会遇到问题。这里分享几个我遇到过的典型问题及解决方法:

问题1:安装后java命令仍然找不到这通常是因为PATH没设置正确。可以检查:

which java echo $PATH

确保/usr/bin在PATH中。如果没有,可以手动添加:

export PATH=$PATH:/usr/bin

问题2:程序运行时报版本不兼容如果遇到类似"Unsupported major.minor version"的错误,说明编译和运行使用的Java版本不一致。用java -versionjavac -version检查是否匹配。

问题3:内存不足Java程序特别是服务器应用可能需要更多内存。可以编辑/etc/environment添加:

JAVA_OPTS="-Xms512m -Xmx1024m"

8. 开发环境优化建议

基础环境配置好后,还可以做些优化让开发更顺畅:

  1. 安装IDE:推荐IntelliJ IDEA或Eclipse。可以直接用snap安装:
sudo snap install intellij-idea-community --classic
  1. 配置Maven
sudo apt install maven mkdir ~/.m2 cp /etc/maven/settings.xml ~/.m2/
  1. 安装构建工具
sudo apt install gradle
  1. 设置时区:Java应用对时区敏感,建议统一设置:
sudo timedatectl set-timezone Asia/Shanghai
  1. 日志管理:安装logrotate管理Java应用日志:
sudo apt install logrotate

配置完成后,你可以写个简单的HelloWorld程序测试下:

public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, Java 8 on Ubuntu 20.04!"); } }

保存为HelloWorld.java,然后编译运行:

javac HelloWorld.java java HelloWorld

看到输出就说明你的Java开发环境已经完全准备好了。这套配置在我负责的多个生产环境项目中运行稳定,特别是那些使用Hadoop和Spark的大数据项目。对于新接触Ubuntu的Java开发者,建议把常用命令写成脚本,方便下次快速配置。

http://www.jsqmd.com/news/1086317/

相关文章:

  • 如何构建安卓虚拟摄像头:Xposed框架下的完整实战指南
  • 终极B站体验:PiliPlus跨平台第三方客户端的5大核心优势
  • Rimworld Mod开发指南:About文件——从零到一的Mod身份与兼容性设计
  • iperf3安全传输实战:RSA加密与密码保护配置指南
  • 终极免费抖音批量下载指南:如何快速保存无水印高清视频
  • Havenlon 思考录(十):控制先于自动化
  • 让你手机好玩10倍,七个一定要知道的最强App!
  • Web安全测试实战指南:从SQL注入到XSS的手动漏洞挖掘与验证
  • 玉林黄金白银回收铂金旧金回收无套路门店 TOP 榜单 实地测评资料整理
  • 高级 RAG 范式:Self-RAG、CRAG、GraphRAG、Agentic RAG 到底解决什么问题?
  • 终极指南:如何在Mac上轻松运行Windows软件,告别跨平台烦恼
  • 暗黑破坏神3终极解放:D3KeyHelper一键自动化完整指南
  • SPI总线模式故障与欠载错误处理:RA8T2实战解析
  • FileBrowser批量下载功能:告别文件管理中的“逐个下载“噩梦
  • 从零到一:在Windows Server上部署IBM MQ 7.5消息队列服务
  • 鹰潭黄金白银回收铂金旧金回收无套路门店 TOP 榜单 实地测评资料整理
  • 如何在Mac上完美运行Windows软件:Whisky跨平台兼容工具完整指南
  • 瑞萨RA8M1 Flash编程实战:FACI命令、寄存器操作与避坑指南
  • LocalVocal OBS插件深度解析:本地AI语音转字幕技术实现与性能优化
  • 从理论到实践:深度解析静态时序分析中timing derate的设置逻辑与影响
  • 从QStyle到自定义Style:Qt界面定制核心虚函数实战解析与流程图解
  • AD936x接收链路实战:从寄存器配置到频谱验证
  • 30N03-ASEMI中低压大功率通用王者30N03
  • 从再订货点ROP到需求预测+安全库存:库存策略的进阶与场景适配
  • 宜春黄金白银回收铂金旧金回收无套路门店 TOP 榜单 实地测评资料整理
  • Playwright实战:攻克Web自动化测试中的拖拽难题
  • 从Euromap 63到云端:凌顶OPC UA驱动如何重塑注塑车间的数据链路
  • 【Proteus仿真8086实战】从零构建IO接口:LED流水灯与跑马灯的双重演绎
  • GEE实战:一键获取与处理全球高精度NASADEM高程数据
  • Cadence Xrun UVM Makefile:构建高效验证流程的自动化脚本实践