ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

JDK 17/8与Eclipse安装:环境变量、汉化插件与Tomcat排错

JDK 17/8与Eclipse安装:环境变量、汉化插件与Tomcat排错 每次接手一台新电脑或者给组里刚来的同事配开发环境我在 Eclipse 和 JDK 上花掉的时间总是比预想的多。这两样东西本身不难装难的是版本对不上、路径里混了中文、环境变量少了一个分隔符随便一个小问题就能把人卡上大半天。2022 年 8 月这个时间点还比较特殊JDK 17 作为长期支持版本已经稳定跑了小半年JDK 8 依然撑着一大批老项目Eclipse 的版本号也彻底改成了年份加月份的写法官网上的下载入口跟几年前完全不是一回事了。这份东西是我这两年在 Windows、Linux、macOS 上来回装、反复踩坑之后整理出来的流程从选版本、拿安装包、配环境变量一路到汉化、离线装插件、接 Tomcat再到几个高频报错怎么定位尽量写细。刚接触 Java 的新人可以照着走一遍隔三差五重装环境的老手也可以拿它当检查清单。1. 装之前先想清楚JDK 选哪个版本、Eclipse 下哪个包1.1 JDK 版本这道选择题比想象中重要很多人装环境的第一个动作就是打开搜索框搜JDK 下载然后闭着眼睛点第一个结果。这一步其实就决定了后面会不会返工因为 JDK 版本和你要跑的项目是强绑定的装错了要么编译不过要么运行时报奇怪的错。2022 年 8 月前后Java 世界里实际并存着三个主流版本我按使用场景拆一下JDK 81.8class file version 52。大量存量项目、老版本中间件、部分行业的内部系统都还锁在 8 上。你如果接手的是别人维护了好几年的工程八成要用它。缺点是官方免费更新早已到期新特性也享受不到。JDK 11LTSclass file version 55。Spring Boot 2.2 之后官方推荐的最低版本很多公司的新项目基线就定在这儿稳定性和生态都很成熟。JDK 17LTSclass file version 61。2021 年 9 月发布G1 回收器已经默认优化得不错ZGC 也能用。新开的、没有历史包袱的项目我一直建议直接上 17省得以后升级。我通常的做法是机器上只留一个主力 JDK 用于 Eclipse 本身和命令行具体项目在 Eclipse 里单独指定 JRE。这样既避免了JAVA_HOME反复改又不会因为全局版本影响别人的工程。提示Eclipse 从 2020-09 版本开始启动就要求 JDK 11 及以上。如果你下的是 2022-06 的 Eclipse却只装了 JDK 8双击图标会直接弹窗报错连界面都进不去。JDK 版本class 文件版本典型使用场景是否建议新手起步JDK 852存量老项目、老中间件视项目而定JDK 1155企业新项目基线、Eclipse 自身运行推荐JDK 1761全新项目、想用新特性推荐1.2 Eclipse 的安装包类型别下错了Eclipse 官网的下载页面上会列出一长串包名新手最容易在这里犯错。常见的有Eclipse IDE for Java Developers、Eclipse IDE for Enterprise Java and Web Developers、Eclipse IDE for C/C Developers等等。关键点在于如果你后面要配 Tomcat、要写 JSP、要写 HTML就得选 Enterprise 那个包。Java Developers 版本砍掉了很多 Web 相关的工具链你照着教程走到配置 Tomcat这一步会发现根本没有 Server 视图那时候再回头重下就浪费时间了。另外还有两种下载形态Installer安装器一个小小的 exe运行后让你选包、选安装目录联网下载。好处是省事坏处是网络不好时容易卡在中途而且它默认会往系统里写一些东西。ZIP 压缩包免安装下载下来解压就能用不写注册表卸载就是删目录多版本共存特别方便。我个人一直用 ZIP 免安装版理由很直接出问题的时候删掉整个目录重来两分钟的事不会留下残余配置。1.3 目录规划一条被无数人忽略的规则安装路径里不要出现中文、空格和特殊符号——这条规则看起来像老生常谈但每年都有人栽在上面。竖线、引号、空格这些字符会让一部分老工具在拼接命令行参数时把路径截断于是你看到的现象是明明文件在那儿它就是找不到。中文路径在某些编码环境下会变成乱码报错信息里全是问号排查起来更痛苦。我习惯这么放WindowsC:\dev\jdk-17、C:\dev\eclipse、C:\dev\workspaceLinux/opt/jdk-17、/opt/eclipse工作空间放用户目录下macOS/Users/你的用户名/dev/下面为什么不直接装到C:\Program Files因为那个目录有额外的访问控制Eclipse 写配置、插件更新、Maven 拉依赖时偶尔会因为权限问题失败报的是拒绝访问但你会以为是别的原因。放到自己建的C:\dev下全程无痛。2. JDK 的下载、安装与环境变量配置2.1 去哪里拿安装包官方渠道是 Oracle 官网和 OpenJDK 的各个发行版。Oracle JDK 8 之后的版本在商用场景有授权要求很多人会转向 OpenJDK 的实现比如 Adoptium原 AdoptOpenJDK、Amazon Corretto、Zulu 这些功能上没有差别日常开发完全够用。如果你的网络访问官方站点比较慢国内高校的开源镜像站是很好的替代比如清华的 TUNA 镜像站就有 Adoptium 的完整目录按版本号分目录存放下载速度很稳。这类镜像站是公开的开源软件分发节点只是把上游的文件同步过来用起来没有任何顾虑。拿包的时候注意两点第一认准JDK而不是JREJRE 只有运行环境没有编译器和调试工具Eclipse 里很多功能会用不了第二Windows 上按系统位数选x64别下成 32 位的。2.2 Windows 下安装的每一步下载下来是一个 exe双击运行。流程里有几个地方值得停一下第一处是安装路径。默认会给你C:\Program Files\Java\jdk-17之类改成前面说的C:\dev\jdk-17。注意安装器有时候会把这个目录再套一层最终变成C:\dev\jdk-17\jdk-17装完一定要去文件管理器里确认bin目录的真实位置。第二处是公共 JRE。在 JDK 8 的安装器里会问你装不装公共 JRE我一般选择不装因为开发机上有完整 JDK 就足够了多装的 JRE 还会干扰后面 Path 的查找顺序。JDK 11 之后的安装器已经取消了这个选项不用担心。第三处是安装完成后的目录结构。正常的 JDK 目录里应该有bin、lib、include、jmods9 以后这些。bin下面有java.exe、javac.exe、javaw.exe、jar.exe。javaw.exe特别关键Eclipse 启动时找的就是它后面还会用到。2.3 环境变量三个变量里有两个其实可以省先说结论Windows 上需要配的是JAVA_HOME和PathCLASSPATH在现代 JDK 上基本不需要配了。JAVA_HOME的作用是给别的工具当锚点。Maven、Gradle、Tomcat 的启动脚本都会先读这个变量去找 JDK所以它的值必须是 JDK 的根目录不能带\bin也不能指向 JRE 目录。这两个是最常见的错误。具体值举例C:\dev\jdk-17Path里加一条%JAVA_HOME%\bin。用变量引用的好处是以后换版本只要改JAVA_HOME一处。CLASSPATH这个变量在 JDK 9 之前确实要配因为那时候tools.jar和dt.jar是独立文件需要显式告诉 JVM 去哪儿找。但 JDK 9 引入模块化之后这两个 jar 已经不存在了配了反而容易出问题。老教程里让你写.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar如果你装的是 JDK 11 或 17直接跳过这一步。配置完了之后一定要新开一个命令行窗口再验证。已经开着的窗口用的是它启动那一刻的环境变量快照不会自动刷新——这个细节坑过太多人明明配对了却一直显示旧版本。验证三条命令java -version javac -version echo %JAVA_HOME%前两条的版本号要一致。如果java -version有输出而javac提示不是内部或外部命令说明 Path 里加的是 JRE 的 bin 而不是 JDK 的 bin。2.4 Linux 和 macOS 的思路不太一样Linux 上我一般直接下tar.gz解压到/opt下面然后在/etc/profile里追加export JAVA_HOME/opt/jdk-17 export PATH$JAVA_HOME/bin:$PATH改完执行source /etc/profile让它生效。注意PATH里 JDK 的 bin 要放在前面否则系统自带的旧版本会抢先被找到。macOS 上如果是tar.gz方式逻辑和 Linux 一样写进~/.zshrc。dmg方式装完会到/Library/Java/JavaVirtualMachines下面用/usr/libexec/java_home -V可以列出机器上所有已安装的 JDKjava_home -v 17能直接拿到 17 的路径写脚本的时候很方便。3. Eclipse 的下载与首次启动配置3.1 解压、启动和 eclipse.iniZIP 包解压出来根目录下会有eclipse.exe、eclipse.ini、plugins、features、dropins、configuration这些东西。双击 exe 之前我建议先把eclipse.ini打开看一眼尤其是这几行-vm C:\dev\jdk-17\bin\javaw.exe -vmargs -Dosgi.requiredJavaVersion11 -Xms512m -Xmx2048m-vm这一行是手动指定 Eclipse 用哪个 JVM 启动。它的位置极其讲究必须写在-vmargs之前而且路径要独占一行。顺序写错了 Eclipse 会静默忽略然后去 Path 里瞎找找到哪个用哪个于是你就遇到了我明明装了 JDK 17它却说版本太低。-Xmx是给 Eclipse 本身的堆内存默认值偏小项目一多就会频繁卡顿。我一般按物理内存的 1/4 来设16G 内存的机器给 2048m 到 4096m 之间够用了。注意这是给 IDE 的不是给你跑的程序用的两者互相独立。如果改完 ini 启动异常可以在命令行里执行eclipse.exe -clean它会强制刷新插件缓存再启动能解决相当一部分启动一半闪退的问题。3.2 工作空间怎么放第一次启动会让你选 workspace 目录。这个目录里存的是你的项目文件加上.metadataIDE 的全部个性化配置。这意味着两件事换工作空间等于换了一套 IDE 设置工作空间损坏了项目文件还在但配置全丢。我的习惯是给每个大方向建一个工作空间比如workspace-main、workspace-demo互相隔离。切换用File Switch Workspace Other。有个细节值得注意工作空间路径同样不要有中文和空格。另外不要放在网盘同步目录里.metadata下面文件极多同步软件会疯狂扫描既慢又容易把配置搞坏。3.3 装完必改的几项默认设置刚装好的 Eclipse 有一批默认值不适合国内开发环境我每次都会先花五分钟改掉后面能省很多事。编码改成 UTF-8。路径是Window Preferences General Workspace Text file encoding选 Other 然后填 UTF-8。不改的话新建文件默认跟着系统走在 Windows 中文环境下可能是 GBK跟同事协作时中文注释会变乱码。指定 Installed JREs。Window Preferences Java Installed JREsAdd 一个 Standard VMJRE home 指向你的 JDK 根目录。加完之后把它勾成默认。这一步不做后面新建项目时编译器版本会跟你预期不一致。调字体和字号。General Appearance Colors and Fonts Basic Text Font换成 Consolas 之类的等宽字体字号 11 到 13。默认字体在中文环境下看着很挤。开自动补全触发。Java Editor Content Assist Auto activation triggers for Java默认只有一个点号改成abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.输入任意字母就开始提示效率提升立竿见影。4. 汉化与插件离线安装才稳4.1 Eclipse 汉化到底怎么做汉化包来自 Eclipse 的 Babel 项目它把 IDE 的界面文本翻译成了各种语言。在线方式是在Help Install New Software里点 Add地址填 Babel 的更新站点勾选中文语言包安装重启后生效。问题是这个站点在国外的服务器上下载经常断。所以更实用的做法是离线装去 Babel 的下载页面按 Eclipse 版本号找到对应的语言包 ZIP下载下来解压会看到features和plugins两个目录。接下来的操作是把这两个目录里的内容分别复制到 Eclipse 安装目录下同名的features和plugins目录里然后带-clean参数重启。这一步的关键点在于只复制内容不要覆盖整个目录否则会把 Eclipse 原有的一大堆插件删掉。汉化只覆盖界面文字代码提示、报错信息这些还是英文的该看的英文文档跑不掉。4.2 离线装插件的两种姿势国内环境下插件市场经常连不上Help Eclipse Marketplace转圈半天没反应是常态。离线安装有两套机制理解它们的区别很重要。第一种dropins 目录。直接把插件包要么是单个 jar要么是解压后的目录丢进 Eclipse 根目录的dropins里重启即可。这种方式最简单缺点是插件多了之后管理混乱卸载就是把文件删掉。Eclipse 对 dropins 的扫描有一定的延迟加了-clean参数启动能强制重新扫描。第二种links 目录。在 Eclipse 根目录建一个links文件夹里面放后缀为.link的文本文件内容是一行path插件所在的绝对路径路径用斜杠。而那个被指向的目录里必须有eclipse/features和eclipse/plugins这样的结构。C:\dev\eclipse\links\mat.link 内容: pathC:/dev/plugins/mat C:/dev/plugins/mat/eclipse/features/... C:/dev/plugins/mat/eclipse/plugins/...links 的好处是插件本体和 IDE 目录完全分离卸载时删掉 link 文件就干净了。我装大插件一律用这种方式。4.3 拿 Activiti 插件和 MAT 走一遍流程Activiti BPMN Designer是画流程图用的做审批流、工作流项目基本跑不掉。它的离线包是一个 ZIP解压后按上面说的两种方式之一放进去就行。这里有个坑要提前说Activiti 的设计器依赖 GEF、EMF 等一堆图形化框架如果你的 Eclipse 是精简版可能会提示缺少依赖。解决办法是先把 GEF 的离线包也装上或者干脆用功能齐全的 Enterprise 版 Eclipse。另外 2022 年前后 Activiti 7 官方已经不再提供设计器很多人转向了 Flowable 或者停留在 Activiti 6 的设计器上选型时要留意。Eclipse MATMemory Analyzer Tool是分析堆内存快照的利器线上 OOM 排查就靠它。它的离线包在 Eclipse 官网的 MAT 页面能下到有独立版和插件版两种。装的时候注意版本匹配MAT 1.13 之后的版本需要 JDK 17 才能运行如果你还在用 JDK 8就下对应的老版本。装完在 Eclipse 里能看到 Heap Dump 相关的视图配合命令行生成快照jmap -dump:formatb,fileheap.hprof 12345其中 12345 是进程号。拿到 hprof 文件后在 MAT 里打开它能算出哪些对象占内存最多、引用链是怎么走的。这个是实战里真正能救命的功能值得专门花时间学一下。顺便回应一个高频问题Eclipse 有没有根据接口 URL 定位 Controller 的插件原生的没有但有两个替代思路。一是用CtrlH打开 File Search搜RequestMapping或者 URL 片段全工作空间扫一遍简单粗暴但有效。二是装 Spring Tools 4 插件它带的 Spring Explorer 和 Request Mapping 视图能把所有映射列出来按 URL 排好比手工搜舒服得多。5. 把 Eclipse 和 Tomcat 接起来5.1 Tomcat 版本怎么挑这一步的第一个坑是版本选错。Tomcat 9 用的是javax.servlet命名空间Tomcat 10 换成了jakarta.servlet。很多老项目里的 Servlet、Filter 代码、第三方库都还是javax的配到 Tomcat 10 上会因为找不到类直接报错。所以除非你的项目从一开始就是jakarta体系否则老老实实用 Tomcat 9。下载同样是 ZIP 免安装解压到C:\dev\tomcat9。解压后别急着关文件管理器先确认lib目录下有bootstrap.jar、catalina.jar这些文件bin下面有startup.bat。下面那一大段排查会用到。5.2 在 Eclipse 里配置服务器运行时入口有两处Window Preferences Server Runtime Environments里 Add或者在Servers视图里右键新建。两者效果一样。新建步骤里会让你选 Tomcat 版本然后填两个东西Tomcat 的安装目录以及用哪个 JRE。JRE 这里一定要选你装的那套完整 JDK不要选 Eclipse 自带的或者已经删掉的路径。Service location 建议选 Use Tomcat installation这样部署目录就是 Tomcat 自己的webapps跟你手工拷 war 包的行为完全一致出问题好对比。默认的 Use workspace metadata 会把项目部署到工作空间的.metadata深处路径又长又难看找日志都费劲。另外配置页上的 Server Locations 区域经常是灰色的点不动。原因通常是这个 Server 里已经挂了项目解决办法是把项目先 remove 掉、服务器 stop 掉再双击 Server 打开配置页就能编辑了。5.3 部署和启动右键 Server Add and Remove把项目加进去。启动后默认访问http://localhost:8080/项目名。想改端口就去 Servers 视图里双击 Server在配置页右侧的 Ports 区域改改完记得保存。启动过程中控制台会打一堆日志如果看到Server startup in xxx ms基本就是成功了。日志不在控制台显示的话检查Window Show View Console以及 Console 右上角那个小图标有没有切换到你当前的 Server 输出。6. 那些年踩过的报错常见问题排查实录6.1 找不到或无法加载主类 org.apache.catalina.startup.bootstrap这条报错在 Tomcat 启动失败的案例里出现的频率最高。它的字面意思是Eclipse 想启动 Tomcat但拿着启动类名去找对应的字节码没找到。我按排查优先级列一下顺序第一看安装目录是否完整。打开C:\dev\tomcat9\lib确认bootstrap.jar在里面。有时候从压缩包里解压时被安全软件拦截了部分文件lib是空的这时候重新解压就行。第二看 Server 配置里的类路径。双击 Server 打开配置页切到 Classpath 选项卡看 Bootstrap Entries 下面有没有一条指向tomcat/lib/bootstrap.jar的条目。缺了就手工 Add External JARs 补上。第三检查路径是否带空格或中文。C:\Program Files\...这种路径在某些版本的 Tomcat 插件下会解析失败换成C:\dev\tomcat9立刻就好。第四检查版本匹配。用老版本 Eclipse 自带的 Tomcat 9 插件去配 Tomcat 10 的服务端也会报这个错因为插件的启动脚本对不上。这时候要么换 Tomcat 9要么给 Eclipse 装新版的服务器适配器。最省事的兜底办法把 Servers 视图里那个 Server 删掉连带里面的项目引用一起清空重新新建一个。我大概有三次是靠这一招解决的比重装 IDE 快得多。6.2 Unsupported class file version 52.0这个错误的含义经常被误解。52.0对应的是 Java 8 编译出来的 class 文件报不支持 52.0说明当前运行这个程序的 JVM 版本低于 8也就是机器上有个 Java 7 甚至更老的运行时被用上了。常见的触发场景有系统里装了 Oracle 客户端、其他 IDE、或者某个绿色软件它们自带了一个java.exe并且加到了 Path 靠前的位置把你自己装的 JDK 挤到了后面。Eclipse 的-vm没配它自己瞎找找错了。某个独立工具比如老版本 MAT用的是它目录里自带的 JRE。解决办法就一句话明确指定用哪个 JVM不要依赖系统自动查找。-vm C:\dev\jdk-17\bin\javaw.exe顺便说一句这个思路在遇到class file version 61.0 不支持之类的报错时同样适用只是方向反过来——那次是运行环境太新工具太老。判断方法很简单看报错里的数字52 是 Java 855 是 Java 1161 是 Java 17。6.3 环境变量配了但就是不生效这个问题的排查清单我总结成这样一张表现象最可能的原因处理方式java -version是旧版本Path 里旧版本排在前面把 JDK 的 bin 移到列表最上面javac命令不存在Path 指向的是 JRE 目录改成 JDK 的 binJAVA_HOME输出为空变量名拼错或改动没保存检查是否误写成JAVA_HOME带空格改了变量但命令行没反应用的是旧命令行窗口关掉重开一个新窗口路径里出现问号乱码用了中文全角的分号或引号全部改成英文半角输入Maven 构建时报找不到 JDK工具读到的是 JRE确认JAVA_HOME指向 JDK 根目录还有一条隐藏坑手工编辑 Path 变量时弹出来的编辑框里如果误点全选然后粘贴会把原有的一堆系统路径全部冲掉。改之前先复制一份原值出来存着出事了能马上还原。6.4 项目版本迁移时的注意事项有时候不是装环境出问题而是项目要从高版本降回 JDK 17或者从 8 升上去这时候要动的点比想象中多光改环境变量是不够的。需要同步调整的地方至少有四处项目编译级别右键项目 Properties Java Compiler把 Compiler compliance level 改成目标版本。它跟 JRE 版本不一致时 Eclipse 会给你黄色警告。构建路径里的 JREJava Build Path Libraries把 JRE System Library 换成目标版本的。Maven 编译插件pom 里的maven-compiler-plugin的source、target或者新的release参数。改完在项目上右键 Maven Update Project勾选 Update project configuration from pom.xml。构建插件版本像maven-jar-plugin这类插件老版本在高 JDK 上可能有兼容问题适当升一下版本号然后在 Maven 的 Update Project 里刷新。特别提醒一句从 8 升到 17 时如果代码里用了javax.xml.bind、sun.misc.Unsafe或者做过深反射很可能会直接编译不过。这不是环境问题是模块化带来的变化得改代码或者单独引依赖别把时间浪费在重装 JDK 上。7. 几个提高效率的小设置装好之后顺手做几件事后面能省不少时间。看类图可以装 ObjectAid UML Explorer 这类插件或者用 Eclipse Marketplace 里的类图工具对着一堆继承关系梳理的时候很直观。装不上插件的时候CtrlT看类型层次也够用。分支合并用内置的 EGit 就行。项目右键 Team Merge选要合进来的分支冲突文件会在编辑器里以对比视图展现左边当前分支右边目标分支逐块选择保留哪边比在命令行里改冲突标记舒服。写 HTML 和预览在 Enterprise 版 Eclipse 里新建 HTML 文件编辑器有语法高亮和提示想看效果就Window Show View Internal Web Browser输入本地文件路径就能预览。当然纯前端页面我还是会开浏览器Eclipse 里预览主要是方便调试 JSP。多 JDK 共存机器上同时留 8、11、17 三个版本是很常见的。我一般把每个都解压到C:\dev\下面JAVA_HOME指向当前主力版本具体项目在 Eclipse 的 Build Path 里单独指定互不干扰。装了这么多年环境我自己最大的体会是所有莫名其妙的失败最后都能归结到一个具体的、可验证的差异上——版本号不对、路径不规范、指定不明确。Eclipse 和 JDK 这类工具链的兼容性问题本质上是它们各自在按自己的一套规则找文件而你要做的就是把这套规则明确下来别让它去猜。所以我现在装完环境的第一件事永远是打开命令行敲一遍java -version和javac -version确认两个数字一致然后再动 IDE。这三十秒的确认比事后花两小时查错划算太多。
返回列表