我在安装JDK时产生的疑惑及说明,文章仅涉及我的体验,后续随着视野宽阔会持续填坑,希望能理清楚这个过程
1.什么是JDK
JDK就是java的开发工具,想要开发java程序,那能运行java程序是最基本要求,这也就是为什么JDK里包含了JRE(java的运行环境)
JDK=JRE+Tools&Tools API+Java Language
如果你想知道这些具体是什么,可以点击上面的链接去官网仔细查看,官网当然是全英文的,你可以在浏览器安装一个页面翻译插件,虽然翻译的差强人意,但对于定位到你想要了解的位置还是很有帮助的,不然全屏英文足以让人头疼不已,定位后就建议阅读英文,你会发现简单很多。
2.安装什么样的JDK
截止目前(21年1月17号),我们已经可以使用JDK15了,那为什么很多人还在使用JDK7、JDK8呢?(推荐使用JDK8)
- 我们在使用上追求的是稳定,jdk8相当稳定
- JDK8相比于之前的版本,有较大的性能提升
- 之后的版本相比于JDK8没有较大的性能提升
- JDK8之后,Oracle就半年推出一个新版本,这谁遭得住
- Oracle公司开始对JDK8以后的版本进行商业收费,大部分公司不会使用收费的JDK,只会基于JDK8进行公司内部的二次开发
- 很多公司不会轻易升级,没有实际利益的话
部分观点来自知乎古时的风筝的回答。
以上只是基于你可以独立正确安装的情况下的一些理由,还有一些派生而来的理由,由于jdk8使用人数广泛,那么基于jdk8进行开发而出现的各种bug就会有更多的人去解决,那么当你有疑惑去搜索“为什么……”的时候,会出现很多答案去帮助你,更大概率解决你的疑惑,这就是正反馈,能激励你一直深入学下去。但是JDK15的很多问题我都没找到答案,例如:
- “为什么JDK15安装时没有选择JRE安装路径?”
- “为什么JDK15文件夹下没有JRE文件夹?”
- “为什么JDK15的lib文件夹里没有tools.jar和dt.jar这些关键的jar包?”
这些都是我最初安装JDK15时遇到的麻烦,我又不知道是我出现了bug还是jdk15本身就是这样,毕竟15与8相差这么多版本,然后我满怀信心去查为什么,结果遇到的是一堆和我一样问着为什么的帖子,就是没有答案,搞了一个晚上,最后走不下去了,早上起来转用JDK8,问题全部迎刃而解,JDK15解惑搜索成本太高了!=
3.下载并安装JDK8
好了我们已经确定要安装JDK8了,我们该去寻找资源。
百度一下,会跳出很多资源网站,固然,大多数都是正确的资源,但我们也不能冒险,去Oracle官网是最好的选择:Java SE Development Kit 8u271(我写文章时JDK8最新的小版本)
会出现很多基于各种系统的版本,我电脑是window x64这是我该下载的

有时候会有.exe还是.zip的选择,我比较倾向于选择.exe方式,因为我有在“卸载安装程序”中查看已安装程序的习惯。
有趣的是,我下载JDK15时,是处于游客模式的,下载没有任何阻碍;但是当我下载JDK8时,Oracle官网要求我登录账号才能下载,换句话说,Oracle靠JDK8的下载来吸引用户,你悟了吗?^V^
点击.exe文件安装,一直下一步,中间调整一下安装路径,如果你C盘足够大,任性,你也可以安装在C盘,安装途中会提示你安装JRE的路径,一般放在JDK旁边,如图我的是这样的:
我截取了安装过程中的一个提示,来提醒我后面用到JMC时注意一下:

- JMV (Java Mission Control)是java代码的性能分析工具,特别是分布式高并发的系统中,这种性能调优工具是必不可少的。
4.执行java程序
有了JDK,现在我们就可以执行java程序了,大功告成!
诶?不对呀!你这都没配置那啥,环境变量,怎么能算大功告成呢?人家都说,要配置环境变量的,你这算什么嘛!垃圾!不看了!
且慢!我有一言,请诸位静听。
如果你手头有电脑,并且对环境变量配置一知半解的话,请打开电脑,做以下步骤,相信你会豁然开朗的。
- 1.不要配置环境变量,若已配置,请删除java相关的环境变量(放心不会有任何影响)
- 2.在某个文件夹中写一个简单的HelloWorld.java程序
- 3.进入安装好的jdk文件夹,进入bin文件夹,里面有很多.exe文件
- 4.找到javac.exe文件,把刚写好的HelloWorld.java程序拖拽至javac.exe上。发生了什么?没错,出现了字节码文件HelloWorld.class,如果你感觉惊奇,请点个赞吧!
兴奋之余,你一定想赶快把HelloWorld.class文件也赶紧拖到java.exe上试试看,结果dos窗口闪一下就无影无踪了,为什么呢?
- 具体原因我不知道,肯定涉及到更底层的东西,先挖个坑吧,再深究下去进度太慢了
没关系,我们可以直接在dos上执行呗!你先在dos里面敲java看看是否有用法提示,如果你是exe安装的,我猜肯定会成功,因为即使你选择了JDK\JRE路径,你的电脑也把一些东西传入了C盘,展开你环境变量Path里面的值,你会有所发现。我发现我的Path里面有一条这样的值:C:\ProgramData\Oracle\Java\javapath
进入上述路径,发现里面是这样的:

这也就解释了什么都不做,也能有java命令可以执行,因为安装jdk时候系统悄咪咪干了一些事情,windows就是鸡贼,这也许就是为什么C盘越来越冗余了
说到这儿,你也许对环境变量是干什么的有点眉目了,但说好了不搞环境变量,就坚决不搞,让什么东西出现不代表你掌握了,再让它消失才会有更深的认识。
- 把环境变量Path里面你觉得与java有关的路径值暂时屏蔽掉(我先截屏保存,再改变它们,免得改不回来了),屏蔽的目的是使dos不再认识java命令。屏蔽那些路径的过程你会知道你的电脑把java.exe复制到了哪些地方。(用户环境变量也可能有Path变量,注意也要屏蔽)
- 现在我们与环境变量脱清干系了,say goodbye,也就是说我们现在不能直接使用java命令了
- 找到你jdk文件里面java.exe的位置,一般是在jdk文件夹下的bin文件夹里,里面还有很多java的命令,诸如javac\java\javadoc等等
- 使用dos命令进入上面的bin文件夹,这样就可以使用java命令了,自己试试看
- 如何熟练使用dos命令?我也只知道一点够用的皮毛,以后会整理出来,先挖个坑
现在我们可以使用 javac编译、java运行了吗?你可以试试,发现出现这样的错误“ 找不到或无法加载主类 HelloWorld”

回忆一下你刚才找java.exe文件的过程,也就是说,我们找到了在什么地方执行java程序,那执行什么样的java程序呢?系统也很茫然,需要你帮他找。
怎么帮系统找到我们要执行什么样的java程序呢?请看:

仔细观察,上图包含了编译和运行两步,编译直接罗列出源代码路径就可以了,运行却要指明classpath(cp),这可能就是不能直接拖拽上去的原因之一吧。
什么是classpath?
- 我们在使用java命令时,实际上是执行了java.exe,这个程序会启动jvm(java虚拟机)
- JVM启动之后会启动类加载器ClassLoader
- ClassLoader会在硬盘上的某个位置搜索HelloWorld.class字节码文件
它是怎么去搜索字节码的呢?有四个先后顺序
- 默认的User classes . (dot) 就是指当前目录。
- 系统变量 CLASSPATH 所指定的类库,该变量覆盖(override)默认的User classes。
- 用命令行参数 -cp 或 -classpath指定的类库。这个时候覆盖默认的User classes 和CLASSPATH变量。
- 通过-jar 参数指定的jar文件。此时覆盖上面的三种情况,如果使用这种情况,所有的类文件必须来自指定的jar 文件。
读到这儿你应该就会明白为什么要配置环境变量,因为每次运行程序都要死去活来地找路径,简直太烦了,配置环境变量是为了辅助我们运行java程序,但是没有环境变量我们依然可以正常执行java代码,知道这一点非常关键!下面就开始配置环境变量吧!
5.配置环境变量
咱们上面死去活来找路径的工作主要集中在两块,
1.找javac.exe\java,exe这些文件的位置
2.找咱们要执行的程序的位置
相应的,咱们配置两个环境变量1.Path 2.CLASSPATH
1.设置Path,当然可以直接设置,但推荐使用一个技巧:
添加一个系统环境变量JAVA_HOME,并设置其值为jdk文件路径,这是为了修改方便,因为jdk有可能改变,到时候只用修改一个根就可以了

其实设置一个就可以了,后面两个是系统自动帮我搞得,我怕以后会有什么用,就暂时没有删除。
2.设置CLASSPATH
这是加载类的地方,如果你某一段时间会在某个文件夹里频繁写java程序,那你就可以把这个文件路径传入CLASSPATH中,当然,有时候程序的执行会调用jdk里面的基础类,因此需要把他们也添加上。总之一个原则,需要了再添加,这样会学的更清晰。

只配置系统环境变量即可,用户的不用添加也可以。
终于大功告成了,现在我们在任何位置都可以使用javac、java命令了,若我们在CLASSPATH里面配置了我们常用的java代码文件路径,我们甚至可以随意执行.class文件,
还有一种配置CLASSPATH的办法:在dos窗口中配置
我们进入dos窗口:

- echo %classpath% 是在问classpath你里面有哪些东西呀?
- set classpath=X 是修改classpath的值为X
- set classpath=%classpath%;Y 是一个小技巧,我们的目的是加上Y,但是也不想覆盖原有的classpath,这种技巧使用的非常普遍
- 最重要的是,dos方式设置的classpath仅仅在该dos窗口有用,对新打开的dos窗口无用,可理解为临时的赋值
由此就产生了一个问题,不同的设置方法有什么优劣呢?
-
在高级设置里面改变环境变量的值是永久的,只要不删除系统就会去搜寻,如果你在一段时间内要频繁使用某个目录下的一些文件,当然永久设置会好一些
-
若你需要执行的位置时常变动,那用dos来设置path及classpath会便利一些,唯一麻烦的就是要配置这些路径,不过也有相应的简单方法:
在要执行的文件旁边编写.bat批处理文件,把你在dos里面要执行的命令写入.bat文件,到时候直接执行.bat文件就大功告成了 -
可惜的是没有一个地方可以配置源代码搜索路径
,每次使用javac命令必须进入源代码.java文件所在路径,或指明其明确的路径。
妈妈咪呀,终于把这个过程搞清楚了,虽然中途还留有很多坑,但我现在看也不想看它们,居然不小心就写了6千字,小弟拙作,希望各位大佬指正,我留的那些坑也欢迎大家指教,不胜感激!如果对你有所帮助的话,请不要忘了点赞哦^V^,一键三连我更加喜欢!
学习过程中参看了以下几篇博文:
java不用设定classpath路径,也能找到类库
在dos窗口中编译和运行java文件的方法
jvm之java类加载机制和类加载器(ClassLoader)的详解
Windows下PATH,CLASSPATH等环境变量详解
DOS命令窗口,执行java源文件 的执行原理?
本文详细介绍了JDK的安装过程,重点解析了为何推荐使用JDK8,并讨论了不同版本间的差异。通过实例演示了如何在不配置环境变量的情况下执行Java程序,同时阐述了环境变量配置的必要性和方法,旨在帮助读者更好地理解和掌握Java开发环境的搭建。
8万+

被折叠的 条评论
为什么被折叠?



