ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Java JDK运行库合集:环境变量、版本选型与报错排查

Java JDK运行库合集:环境变量、版本选型与报错排查 做Java开发的人应该都有印象新手阶段头一道坎不是语法不是框架而是把JDK装好、把环境跑通。标题里“Java jdk运行库合集”这串词看着像随手搜出来的但它确实点中了一个经常被忽视的真相JDK并不仅仅是javac和java两个命令它背后是一整套编译、运行、调试、打包的工具链还连带依赖操作系统层面的运行库体系。很多新人卡在“javac不是内部或外部命令”“找不到jdk”“启动Java程序报缺少MSVCP140.dll”这些报错上本质都是对JDK和运行库之间的关系没理清。这篇内容我会以实操笔记的形式把JDK是什么、版本怎么选、下载安装、环境变量配置、系统运行库修复到最后高频报错排查完整过一遍。适合刚接触Java的新手照着做也适合老手在配新环境时回来查一查毕竟JDK版本那么多运行库坑也不少能一次配通就别反复折腾。1. 先把概念理清JDK、JRE、运行库到底谁管谁1.1 JDK、JRE、JVM三层关系JDK全称Java Development Kit是Java开发工具包。JRE是Java运行环境JVM是Java虚拟机。按包含关系看JDK里包含了JREJRE里包含了JVM。换句话说你装了完整的JDK就等于同时拿到了编译器和运行环境javac编译出的.class字节码就跑在JVM之上。这三层关系我平时喜欢用一个厨房的类比来讲JDK是整个厨房——锅碗瓢盆、灶台、菜刀全都有JRE是灶台和锅只管把菜做熟JVM就是那口锅本身所有菜都在锅里翻炒至于菜是红烧还是清蒸锅本身不关心它只提供一套“加热”的机制。Java号称的“一次编译到处运行”本质就是不同平台装不同的JVM实现但.class文件格式统一。这也解释了一个常见现象为什么有人电脑上没装JDK也能运行Java程序因为对方可能只装了JRE。但如果你要写代码、要编译那就必须装JDK。从JDK 11开始Oracle官方不再单独提供面向普通用户的JRE安装包你要运行程序直接用JDK里的JRE就行这也是“Java jdk运行库”这个概念越来越被统一化的原因。1.2 运行库不止是Java自家的事“运行库”这个词在Windows环境下有两种指向。一种是JDK自带的Java类库——rt.jar、tools.jar这些老面孔另一种是Windows系统层面的微软运行库包括VC运行库Visual C Redistributable和VB运行库比如msvbvm60.dll。很多Java项目其实不只需要JDK还会通过JNI调用底层原生组件最常见的就是涉及图像处理、加密、串口通信、音视频解码这类场景。这些原生组件的dll文件依赖VC运行库才能加载成功。所以我会在后面的章节里专门讲系统运行库因为“运行库修复”这类动作在Java开发环境排查中确实经常被用到。顺便提一个热词相关的点PCL这类Java版启动器当年折腾过不少玩家启动器本身是Java写的里面又嵌了原生库很多人游戏启动失败最后发现不是显卡问题是VC运行库缺了。所以说“运行库合集”这件事跟Java程序的稳定运行关系非常紧密别觉得只是装个JDK就万事大吉。1.3 环境变量在中间扮演什么角色JDK装好之后系统怎么知道你在命令行里敲的java是指向哪个目录里的java.exe靠的就是环境变量。Windows系统在执行命令时会去PATH环境变量指定的目录里挨个查找可执行文件。你输入java系统就在PATH列出的路径里找java.exe。所以环境变量配置失败的直观表现就是系统说“java不是内部或外部命令也不是可运行的程序”。这句话本身不是JDK坏了而是系统根本没找到java.exe。理解了这层机制后面排查思路就清晰了配置环境变量就是告诉系统“我的JDK在这里请从这里找java.exe”。2. JDK版本怎么选从JDK 8到JDK 21的实用标准2.1 主流版本对应的典型场景搜索热词里“jdk 17”“jdk 17下载”“jdk降级到17”出现频次很高说明17是目前Java社区非常主流的长期支持版本。现在Oracle对JDK的版本策略是每半年发布一个功能版本但只有LTS长期支持版本才提供数年维护目前真正被生产环境广泛接受的LTS版本是JDK 8老项目的绝对主力Spring Boot 1.x、老版Hadoop、旧版Android构建工具都在用。很多企业系统至今跑在JDK 8上升级意愿低因为Java生态里“能跑就不动”的惯性很强。JDK 11当初是Spring Boot 2.x推荐基线比JDK 8多了ZGC实验性、局部变量类型推断完善等特性。但现在算是承上启下的“过渡版本”新项目选它的比例在下降。JDK 17目前的新项目首选。Spring Boot 3.x强制要求JDK 17起步Java 17本身也带了不少好消息密封类、强封装JDK内部API、vector API孵化等。加上Spring Framework 6和Jakarta EE 10的加持17已经成了事实上的开发标准。JDK 212023年9月发布的LTS有虚拟线程、记录模式等重磅特性。如果你是全新项目、团队技术栈不保守选21也合理。我的建议很简单公司项目跟公司走自己学新东西直接上17如果只看教程且教程是基于旧版Spring的可以先装8。版本之间不是互相排斥的后面我会讲到多JDK共存方案换版本比你想象中方便。2.2 一个容易踩坑的细节JDK版本与类库版本匹配热词里有一个“jdk 17 增加bcprov-jdk 选择什么版本”这是BouncyCastle加密库的命名习惯。BouncyCastle的jar包名往往带有jdk15on、jdk18on这样的后缀它表示这个jar针对哪个JDK基线编译、能在哪个JDK版本上运行。你用JDK 17选bcprov-jdk15on或jdk18on通常都能用但如果你强行选一个只支持JDK 8以下的旧版加密库运行时会报UnsupportedClassVersionError。这个报错的本意是class文件编译版本比你当前JDK能识别的版本高或者反过来。它跟运行库无关纯粹是版本兼容问题。所以下载任何第三方jar之前先看一眼它的编译版本。可以用一条命令快速查看javap -verbose xxx.jar 2/dev/null | grep major version看到的major version数字对应关系是52JDK 855JDK 1161JDK 1765JDK 21。这条命令我每次排查依赖冲突都会用效果很直接。2.3 Java POI这类库对JDK版本也有要求热词里“java poi word能生成图表吗”看起来是个功能性问题但它背后也牵扯JDK版本。Apache POI是操作Office文档的Java库POI 5.x要求JDK 8以上POI 5.2.x系列对JDK 17的支持更友好。能不能用POI生成Word图表答案是能但需要自己构造DrawingML图表数据再配合XWPFChart等API写入。这类第三方库的运行依赖可以通过Maven或Gradle声明实际运行时会通过SPI机制动态加载。如果你在一个老旧的JDK 8环境里强行用了最新版POI大概率会在启动阶段碰到方法找不到或者类版本错误。所以版本匹配这件事不只是JDK版本的选择也是第三方库版本的选择两条线一起看才稳。3. JDK获取与安装实操官网、镜像与多平台步骤3.1 下载渠道怎么选更省心搜索热词里有“jdk下载官网”“jdk镜像网站”“java最新网站更新入口”说明下载这一关确实劝退了不少人。Oracle官网下载JDK需要点几次页面登录Oracle账号才能下载LTS版本这让很多新人一脸懵。更稳的做法是去AdoptiumEclipse Adoptium项目下载OpenJDK发行版页面布局直接不用登录Windows/macOS/Linux各平台安装包都有。如果你在国内网络环境下访问官方站点慢可以优先选择大厂维护的OpenJDK镜像源比如华为云、阿里云、腾讯云等都有开源软件镜像站。以Adoptium的OpenJDK为主要候选对比几个来源的文件SHA256校验值一致再决定安装。这里多说一句下载JDK尽量别碰来路不明的“绿色版”“一键版”你不知道里面被塞了什么而且手动搬运JDK文件很容易出现路径不完整、注册表残留的问题。3.2 Windows下安装步骤与一个实用习惯Windows安装JDK有安装包方式.msi或.exe和压缩包方式.zip。安装包方式会自动写入注册表、配置部分环境变量对新手最友好。但有一个细节值得注意安装路径不要装在Program Files目录。理由很简单路径里有空格虽然现代工具大多能处理空格但在一些Shell脚本、批处理文件、老的构建工具里带空格路径是隐患。我习惯统一装到D:\Java\jdk-17这类无空格、无中文的路径下。安装完成后先打开CMD验一下java -version javac -version如果连java命令都识别不了说明环境变量还没配。如果java能识别但是javac识别不了可能是只装了JRE或者PATH里指到了JRE目录。我在帮人排查时发现很多人把JAVA_HOME配好了PATH里却写成了C:\Program Files\Java\jdk-17而不是%JAVA_HOME%\bin导致换JDK版本时PATH里永远是旧的。所以这里养成习惯PATH里永远引用%JAVA_HOME%\bin不要直接写死路径。3.3 Linux和macOS的配置方式Linux上安装JDK最简单的方式是包管理器比如Ubuntu下sudo apt install openjdk-17-jdkCentOS用yum install java-17-openjdk-devel。但包管理器不好控制版本细节老玩家更常用tar.gz解压到/opt目录再用update-alternatives去设置默认版本。macOS用户直接用Homebrew最省心brew install openjdk17装完看一眼提醒Homebrew有时候不会自动把JDK目录加到系统PATH里需要自己把路径export到~/.zshrc里。macOS的Java路径一般是/usr/local/opt/openjdk17/bin或/opt/homebrew/opt/openjdk17/bin取决于芯片是Intel还是Apple Silicon。再三强调一个Point不管你用什么系统安装之后第一件事永远是跑java -version和javac -version。很多人只跑前者然后跟我说“装好了”结果一编译就报找不到javac原因就是装了个JRE而不是JDK。4. 环境变量配置一次跑通的写法与常见失败点4.1 到底要配哪几个变量不少教程会让人配三个变量JAVA_HOME、PATH、CLASSPATH。现代JDK环境下CLASSPATH其实可以不用手动配了因为从JDK 5开始编译器就能自动加载当前目录下的类类越来越多之后大家都用Maven/Gradle管理依赖更不需要手写CLASSPATH。这里我采用的推荐做法是只配JAVA_HOME和PATH两个JAVA_HOME指向JDK安装目录比如D:\Java\jdk-17PATH在原有值中新增%JAVA_HOME%\bin为什么JAVA_HOME这么重要因为很多基于Java的中间件——Tomcat、Maven、Gradle、Jenkins——启动脚本都会去读取JAVA_HOME这个约定俗成的变量。你只配PATH不配JAVA_HOME命令行能编译运行但启动Tomcat时它会找不到Java。所以老教程让两个都配是对的但很多人把JAVA_HOME写错了、写成了jre目录或者路径结尾多了斜杠就导致其他软件怎么都起不来。4.2 Windows环境变量配置的具体步骤Windows 10/11下右键“此电脑”→“属性”→“高级系统设置”→点击“环境变量”。在弹出的界面里分两个区域用户变量和系统变量。如果你只是自己用配置用户变量即可如果希望所有用户都生效配置系统变量。实际建议是配系统变量因为很多IDE和服务是以服务账户启动的读不到用户变量。新建用户变量或系统变量变量名JAVA_HOME变量值D:\Java\jdk-17然后在系统变量的Path一行找到后点击编辑选择“新建”填入%JAVA_HOME%\bin有些旧版Windows的Path是一行文本需要用分号跟前面的路径隔开。配完后尽量“确定”关闭所有窗口再重新打开CMD因为已打开的终端不会自动刷新环境变量。这一步很多人漏了配完还在旧终端里测试结果永远报“不是内部或外部命令”。4.3 热词里的“jdk环境变量配置失败”到底败在哪我帮着排查过的环境变量问题90%能归到下面几类变量名拼错JAVA_HOME被写成了JAVA_HMOE、JAVA_HOM这类低级错误只有重新建立变量才能生效。路径指向错误JAVA_HOME指向了bin目录或者指向了jre目录。记住JAVA_HOME应该是JDK的根目录不是根目录下的bin。符号大小写问题Windows环境变量不区分大小写但Linux严格区分。在Linux下你必须保证引用时的大小写跟定义时完全一致。用户变量和系统变量冲突两个区域各配了一个JAVA_HOME系统优先取用户变量的值但你的PATH取的系统变量于是两个地方的JDK版本不一样出现版本错乱的问题。没有点“确定”对话框右上角的关闭和“确定”是不一样的有些路径在未点击“确定”时根本不会写进注册表。还有一个环境变量配置失败的隐性原因安装了多个JDKPATH里多个条目互相冲突。前面%JAVA_HOME%\bin写好了但后面又残留一个C:\Program Files\Java\jdk-11\bin系统按Path顺序找先命中哪个就是哪个。所以多JDK场景下要么把其他的bin路径全部删掉要么彻底依赖JAVA_HOME。4.4 多JDK共存与切换思路有朋友问“jdk降级到17”怎么操作本质上就是换JAVA_HOME的值。我在Windows下维护多个JDK的经验是把JDK分别解压到不同的目录比如D:\Java\jdk8D:\Java\jdk11D:\Java\jdk17然后JAVA_HOME指向当前需要的版本。切换时直接把JAVA_HOME改一下新开终端立即生效。如果你频繁切换也可以写一个小批处理脚本比如在CMD里手输switch_jdk.bat 17。脚本核心就两行setx JAVA_HOME D:\Java\jdk17 set PATH%JAVA_HOME%\bin;%PATH%注意setx设置的变量在当前终端不会立即生效要新开终端才能让JAVA_HOME改掉。所以我通常把脚本里第二行写了保证当前会话也能用新版本。5. 系统运行库那些事VC、VB与Java程序的恩怨5.1 Java程序为什么会扯上VC运行库这个问题我在帮人排查时遇到过不少。一个纯Java程序按理说只在JVM里跑但程序运行时突然弹窗说找不到MSVCP140.dll或VCRUNTIME140.dll一堆人懵了我没写过C代码啊。原因通常是程序里通过JNI加载了原生动态库最常见的是加密组件、数据库驱动自带的原生驱动、音视频处理库。这些原生库是用C写的链接时依赖微软的VC运行库。如果系统里没有对应的VC Redistributabledll加载就失败。MSVCP140.dll对应的是Visual Studio 2015-2022时代的C运行时。旧一点的库可能依赖MSVCP120.dllVS 2013、MSVCP110.dllVS 2012更早在依赖MSVCR71.dllVS 2003时代。说白了你需要的是“运行库合集”让系统中各自版本的运行时都存在老程序新程序都能跑。5.2 VC运行库各版本该如何安装微软官方提供Visual C Redistributable的独立下载页面你搜“Visual C Redistributable”就能找到。需要注意每年都有新版本合并包从2015到2022年的运行库其实是用同一个安装文件覆盖的。但2005、2008、2010、2012、2013这些老版本需要单独装它们之间互不兼容不能靠新版弥补老程序的依赖。装的时候有一个容易出问题的地方x86和x64。很多人在64位Windows上只装了x64版本结果32位的Java程序或32位的原生dll就少依赖。我的建议是x86和x64都装因为Java进程最终是否被识别为32位取决于你用的JDK发行版——如果你装的是32位JDKJVM本身是32位进程它加载的原生库必须是32位否则会报java.lang.UnsatisfiedLinkError之类的错误。加一句VB6运行库常见文件是msvbvm60.dll也是一样的道理。虽然VB6很老但很多国企老系统、工业控制组件的OCX控件依赖它。运行修复工具里检测VB6运行库缺失就是指这个文件不在系统目录里。安装方式建议去微软官方下载VBRun60.exe或直接让修复工具帮你放入对应目录。5.3 “运行库修复工具”能用吗怎么用更保险网络热词里有“运行库修复工具免费”“星空运行库修复大师”等这些工具我用过几种说实话有效但水也很深。原理其实不复杂就是检测系统缺失哪些运行库文件然后从打包好的资源里拷回去或执行对应的安装包。我的建议是使用这类工具时注意三点第一不要下载来路不明的所谓绿色版运行库修复工具需要管理员权限这正好是木马最爱的权限级别第二修复之前先用系统事件查看器看看具体错误日志确认缺失的到底是哪几个dll没准只是某个应用目录内缺少文件重装应用比修复系统更合适第三工具检测出的“异常”未必是真正的“异常”有些会被误报因为工具是根据注册表和文件存在性判断的不了解软件安装的上下文。更稳妥的基础操作其实很简单去微软官方把所有版本的VC Redistributable都下载之后依次装一遍。装完后不需要重启大多数情况下直接生效。如果某个具体dll还是缺失就用sfc /scannow命令扫描一遍系统文件这是Windows自带的校验机制不会引入额外风险。5.4 安装顺序有没有讲究网上有说法是先装旧版再装新版防止新版“覆盖”旧版导致老库失效。按我用下来的经验2005-2013版本的库和2015-2022的库在安装机制上互不干扰安装顺序问题不大。但有一个操作确实要注意不要以“覆盖安装”的心态去强行把新版运行库安装包当作升级补丁来对待如果报已经安装那就认定系统里已经有这个版本的runtime不用纠结。批量部署多台机器时我习惯把各版本运行库安装包放在同目录用命令行静默安装vc_redist.x64.exe /install /quiet /norestart vc_redist.x86.exe /install /quiet /norestart加上/quiet参数就不会弹UI加/norestart避免装一个重启一次。这个操作在公司内网批量装Java客户端运行环境时很实用。6. 高频报错排查与实录记录6.1 “java不是内部或外部命令”的排查清单这条报错我列一下排查顺序按命中概率从高到低排新开终端了吗没有就重新开CMD试一次旧终端不会读新环境变量。JAVA_HOME写对了吗检查路径根目录下是否存在bin/java.exe。PATH里有%JAVA_HOME%\bin吗注意是bin不是JAVA_HOME本身。PATH里是不是有别的java路径排在前面用where java在Windows下查看解析结果它会列出所有命中的java.exe路径按Path顺序排。系统变量和用户变量是否冲突把用户变量的JAVA_HOME先删了再看。在CMD里用echo %JAVA_HOME%可以立即看到当前生效的JAVA_HOME值。这招比反复点系统面板快得多。如果echo出来的值是空的说明变量没配上或者配在了另一个作用域。6.2 找不到jdk或Build Tools读不到JDKMaven、Gradle跑不起来提示找不到JDK或JAVA_HOME场景很典型。这类工具读取JAVA_HOME的方式和命令行不太一样有些会读取当前终端进程继承的环境变量。如果你是通过IDE直接跑MavenIDE可能没有继承你在系统面板里设的最新变量重启IDE通常就好了。如果你用的是IDEA还有一个IDEA自己的JDK设置项File → Project Structure → SDK它允许你用项目级别或IDE级别的JDK覆盖系统JAVA_HOME。热词里idea配置jdk就是这么来的。实操时注意区分SDK列表里显示的jdk路径必须真实存在如果你切换了JDK版本但IDEA还指向旧路径就会报Invalid SDK。6.3 javac能编译但java运行报NoClassDefFoundError这个报错在初学者里非常常见。简单说javac编译文件时能根据源码找到相互引用的类但java命令运行为时需要手动指定classpath告诉JVM去哪找.class文件。虽然现代开发很少用纯命令行运行Java程序但面试和笔试题里经常出现算是Java基础必答项。规避方法很简单用jar包或IDE跑不要裸java命令。如果非要裸跑命令行里加上-cp .表示把当前目录加入classpathjava -cp . MainClass6.4 版本错乱编译用JDK 17运行用JDK 8这种问题多发于你改了JAVA_HOME但IDE还在用旧版本的JDK或者终端里PATH顺序没控制好。表现通常是javac -version显示17但java -version显示8。这个分裂局面就是我前面反复强调“PATH引用JAVA_HOME”的原因。排查时分别跑java -version javac -version where java where javac对比输出的路径和版本是否一致。如果不一致把PATH里无关的java目录清掉统一改成通过JAVA_HOME引用。版本错乱还会引发UnsupportedClassVersionError类是用JDK 17编译的运行时却是JDK 8的JVMJVM会直接拒绝加载。反过来JDK 8编译的类拿到17上运行通常没问题这是向下兼容的。6.5 实战问题速查表现象可能原因解决办法java不是内部或外部命令PATH未配置或配置错误重配JAVA_HOME和PATH新开CMDjavac不是内部或外部命令装了JRE而不是JDK安装完整JDK检查JAVA_HOMEjava -version和javac版本不一致PATH中多个Java目录统一用%JAVA_HOME%\binIDEA报Invalid SDKSDK路径已被移动Project Structure里重新指定Maven/Gradle找不到JDKJAVA_HOME未被读取重启IDE或重登系统运行报缺少MSVCP140.dll缺VC运行库安装VC 2015-2022 Redistributable运行报缺少msvbvm60.dll缺VB6运行库安装VB6运行库或修复工具补齐运行报UnsupportedClassVersionError编译版本高于运行版本降低编译版本或用高版本JDK运行7. 给新手的扩展JDK自带工具与几个值得养成的习惯7.1 JDK里平时容易忽略的实用命令很多人只知道java和javac其实JDK自带了一整套排查工具用好了能省大量时间。我挑几个最常用的jar打包和查看jar包jar tf xxx.jar可以快速看里面有什么类。jps列出当前系统的Java进程和启动类排查“我启动的服务到底起没起”很方便。jstack打印Java线程堆栈线程卡死、死锁排查必备。jstat看GC情况jstat -gc pid 1000每秒吐一次GC统计线上调优入门必备。jmap导堆内存快照jmap -dump生成堆dump拿到MAT里分析内存泄漏。javap反汇编class文件回答“这个版本编译的、方法签名是什么”这类问题。这些命令在IT行业面试时经常被问很多候选人说是“八股文”其实是没真正上手用。我强烈建议新手安装JDK后就拿jps看几个正在运行的Java进程再拿jstack看一个线程概念瞬间就立体了。7.2 Java学习路线与面试常考点的关联热搜词中“java学习路线”“java面试题”“java基础”出现频率高说明很多人在自学Java。我的体会是切忌直接学Spring Boot。先把Java基础语法、面向对象、集合、异常、IO、多线程过一遍再了解JVM内存模型和GC基础之后上手Spring Boot才不吃力。面试常考的JDK相关知识其实都建立在你对JDK工具和环境的理解上JVM内存结构堆、栈、方法区、类加载机制双亲委派、垃圾回收算法、JDK 8和JDK 17的默认GC变化。这些知识点不是背出来的而是在你亲手排查过几次内存问题、看过几份线程Dump、用javap研究过字节码之后自然沉淀出来的。7.3 “JDK为什么那么难下载”这个魔咒怎么破热词里“java的jdk为什么那么难下载”基本代表了很多新人的心声。Oracle官网下载页面确实不友好但解决方案很简单记住两个渠道就够了。第一个是Adoptium官网拿OpenJDK第二个是常用IDE自带的JDK下载功能IDEA的Project Structure里可以直接下载JDK版本下载链路相对稳定。打开IDEA进入Project Structure在SDK处选择“Add JDK”再点“Download JDK”它会弹出一个版本列表选好版本后自动下载并解压。这个功能对新手极其友好不用面对浏览器、不用处理环境变量装完直接用。唯一注意点是它默认下载的可能是特定发行版如果公司项目有要求还是手动下载后指定路径更灵活。7.4 给多版本环境配一个“默认JDK”的心得我自己在多JDK环境里会额外设一个JDK_HOME变量有些老软件用它然后把JAVA_HOME指向同一路径。这样无论软件读JAVA_HOME还是JDK_HOME最终指向同一个JDK。另外准备一个记事本文件记录当前机器上装了哪些JDK及版本主要是为了头脑清醒。这个做法听着简单但真的能避免“我明明装了17为什么又在用8”的混乱感。Maven和Gradle这类工具本身需要JDK运行它们也能通过配置指定编译用的JDK。比如Maven可以配置JAVA_HOME环境变量来让Maven进程使用特定版本但编译Java代码时用的是pom.xml里的maven.compiler.source/target属性。也就是说运行Maven的JDK和编译目标的JDK可以不同这一点很容易造成困惑。新人如果遇到“Maven跑得好好的但生成的class文件版本不对”这类问题去pom.xml检查release或source/target就好。8. 结尾一个实用的小习惯配环境的次数多了我发现自己最受益的一个习惯是每次装完JDK不只是跑java -version验证而是顺手编译运行一个带第三方依赖的最小程序比如用POI生成一个最简单的Word文档或者用BouncyCastle做一个加解密调用。因为环境配不配得通确实是“垂直领域”说了算的——JDK本体和具体依赖库之间配合默契才说明整套“运行库合集”是齐活的。如果哪天你的机器突然报缺少MSVCP140.dll先别急着重装Java按我上面说的方法把VC运行库补一遍80%的情况就好了。剩下20%再回头查JDK路径和版本匹配。这套“先系统运行库、再JDK环境变量、最后第三方库兼容性”的排查顺序帮我节省了大量时间希望对正在跟环境变量和dll报错搏斗的人也有用。
返回列表