
Java环境配置——JDK的选择、下载、安装与配置环境变量JDK的简介与包含内容JDK下载地址JDK版本选择除最新版以外的版本java平台移植性的原因解释执行和编译执行JDK的Linux版本ubantuJDK的Windows版本安装JDK后JDK的官方讲解文档核对压缩包里的文件此部分为回忆版环境变量的配置Windows配置环境变量Linux配置环境变量本台服务器全机生效本台服务器对应用户下的生效静态链接库和动态链接库JDK的简介与包含内容安装Eclipse需要提前安装JDK否则会在刚开始安装程序运行之后就弹出对话框提示尚未安装JDK。JDK包括了JREJava Runtime EnvirnmentJava运行环境、一堆Java工具和Java基础的类库(rt.jar)。JDK下载地址此处给出JDK官网的下载地址。我在视频中还见到了自称JAVA的中文官方网站待确认。JDK版本选择除最新版以外的版本如果需要找JDK之前的所有版本点击前面给出的“JDK官网链接后进入如下页面。点击下图红框进入的页面下滑即可见到下图二的JDK各个版本”。如果要选择历史版本比如JDK1.8在前面给出的JDK官网链接页面中下滑下滑至如下图所示。第一红框上方即为最新的JDK版本下滑后到JDK1.8JDKJavaDevelopment Kit又名Java Platform这个是我看官网上给的详见下面的第二张截图即Java 开发工具包是针对Java的免费软件开发工具包是面向开发人员使用的SDK为Java程序的开发提供支持Java开发的核心。JDK提供了Java的开发环境和运行环境包括JRE 和一些好用的小工具例如javac.exejava.exejar.exe 等。需要配置环境变量。SDKSoftwareDevelopment Kit即软件开发工具包。是为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时所需要用的开发工具的集合通常从目标系统开发者那里获得。自认可以理解为一个已经实现好的现成函数功能库。JREJava Runtime Environment即Java 运行时环境是运行JAVA程序所必须的环境的集合面向Java程序的使用者。主要包含两个部分Java虚拟机JVM的标准实现和 Java核心类库它相对于 jvm 来说多出来的是一部分的 Java 核心类库。java平台移植性的原因JVMJava Virtual Machine即Java虚拟机。它只认识 xxx.class 类型的文件即文件中的字节码指令并能够按class 文件中的字节码指令调用操作系统提供的 API 完成相关操作。针对不同的系统有不同的 jvm 实现——有 Linux 版本的 jvm 实现也有 Windows 版本的 jvm 实现——但是同一段代码在编译后的字节码是一样的。比如在 Java层面我们调用系统声音设备的代码是唯一的和哪个操作系统无关编译生成的字节码也是唯一的。但是这一段字节码在不同的 jvm 实现上会映射到不同的操作系统API上调用从而实现Java可跨平台运行——即换环境但是不必再编译一次——“一次编译到处运行”的效果。自认Java之所以具有平台移植性是因为Java程序运行在JVM中而与底层操作系统的交互全部交由JVM实现——即Java跨平台靠的是JVM能跨平台。—————————————————————————————————————————————————————注以下与C间的比较是我在网上看到的是否正确待确认C底层直接调用操作系统而java是在操作系统之上加了一层JVM所以一般来说C性能更好。与操作系统的强锁定即C直接调用操作系统使C在不同操作系统或者硬件平台运行时都要对程序进行改进和调整即需要重新编译C代码是否还用改呢而Java在这种情况下就不用再重新编译了。当然JVM在让Java获得跨平台的可移植性的同时也造成了Java在性能上一定程度的下降。但是随着Java版本的不断更新——技术的提高、数据结构算法的应用JVM的性能也一直在升级普通应用场景下已经和C性能相关不大。—————————————————————————————————————————————————————解释执行和编译执行解释执行类似于“同声翻译”。解释一句后就提交计算机执行一句并不形成目标程序。解释执行的优势在于不用等待但效率较低不生成可独立执行的可执行文件——下次执行时还是需要逐行解释——应用程序不能脱离其解释器但这种方式比较灵活可以动态地调整、修改应用程序适合于人通过终端设备与计算机会话。编译执行由编译程序将目标代码一次性编译成目标代码的程序再由机器运行因此目标程序可以脱离其语言环境独立执行而且下次运行时若无代码修改、不更换所执行的环境无需重新编译。编译执行的优势在于实际运行中效率更高但程序一旦需要修改必须先修改源代码再重新编译生成新的目标文件.obj才能执行。只有目标文件而没有源代码时修改很不方便。java程序是解释执行or java混合执行补。下面四段为博客所见待验证。①Java有多个编译器。编译器归谁是在JVM里的。②mixed模式下Java代码经过javac编译成class文件字节码class字节码文件经过JVM编译成机器码后进行解释执行解释执行在这同时若计算机资源充足对于热点代码JITJustInTime编译器会在解释运行的同时将其编译为机器码执行编译运行。③主流JVM的实现都是混合形式的以Oracle JDK提供的HotSpot虚拟机为例【Oracle Hotspot JVM 中有两个JIT compiler 一个是C1对应的模式是client 一个是C2对应的模式是server。client一般在我们进行开发的时候使用server模式一般在生产环境使用。JVM有不同的运行模式mixed模式是默认模式用-Xmixed开启int模式是解释模式即全部采用解释执行用-Xint开启comp模式用-Xcomp开启是编译模式JVM关闭解释模式采用编译模式运行】那就是说还有别的JDK它提供了两种编译模式解释执行 和 即时编译JITJust-In-Time。即时编译就是我们前面所说的编译执行。即时编译存在的意义在于它是提高程序性能的重要手段之一。根据“二八定律”即百分之二十的代码占据百分之八十的系统资源对于大部分不常用的代码我们采用解释执行的方式用到就去逐条解释运行对于一些仅占据小部分的热点代码可认为是反复执行的重要代码则采用编译执行将之翻译为机器码高效执行提高程序的效率。在计算机资源充足的情况字节码的解释执行和编译执行可以同时进行编译好的机器码会在下次调用该方法时启动替换原本的解释执行。还有博客说“它首先由编译器编译成.class字节码文件然后在通过JVM从.class文件中读一行解释执行一行”。④Java将源码编译为.class文件字节码文件JVM解释执行.class文件。注机器码是CPU直接读取运行的机器指令运行速度非常快但是不具有可读性。计算机所能识别的语言只有机器语言即由0和1构成的代码。字节码是Java语言中的一种中间状态的二进制代码需要直译器转译后才可能成功的成为机器码Java的编译过程就是将源程序编译为字节码文件——.class文件的过程。JDK的Linux版本Linux系统的JDK又根据硬件架构分为了两种架构如下图所示——Arm 64和×64具体可通过指令uname -a来查询自己计算机的架构。Linux系统需要注意的是JDK有两种版本我看网上博客的解释是对应两种硬件架构待确认。通过指令uname -a来查询自己计算机的架构。比如下图所示的情况则应选择Linux Arm 64详见此博客。而如果指令后的结果是Linux ubuntu20 5.4.0-107-generic #121-Ubuntu SMP Thu Mar 24 16:04:27 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux则应选择Linux ×64。ubantu选择×64版本JDK的Windows版本打开官网首页如下图所示在左侧导航栏处根据自己的需要找到相应的JDK即可。JDK版本的选择首先确定下版本的叫法。看简书上的说法下面的版本应该叫1.12。其次我在网上看到一篇博客博客链接介绍了Java版本的选取文中将Java的所有版本分为两种CPU、PSU并在文中提到 “ Oracle 强烈建议所有 Java SE 用户升级到相应版本系列的最新 CPU 版本。大多数用户应当选择 CPU 版本。”这个分法是否正确待确认。这里简单总结一下该博客的内容PSU补丁集更新包含相应 CPU 中的所有修复以及其他非重要修复。CPU 重要补丁更新包含安全漏洞修复和重要漏洞修复。后续 CPU 版本将包含当前 PSU 的所有修复。 版本号采用奇数编号即 7u71、7u65 — 有关 Java SE 版本编号方式的详细信息详细信息链接。最后我看了一些关于介绍Java各版本区别的博客和百度百科JDK版本区别这是其中一篇只给出了1.5到1.10版本大家可以参考。安装JDK后JDK的官方讲解文档可以查看JDK的官方讲解文档核对压缩包里的文件此部分为回忆版.pack文件要解压成.jar文件unpack200 文件名.pack 文件名.jar环境变量的配置JAVA_HOME操作系统寻找JDK的路径JDK安装的根目录比如C:\Users\administrator\Desktop\jdk-19.0.1。PATH操作系统使用指令时寻找对应指令用到的路径JDK安装根目录下的bin文件夹下比如%JAVA_HOME%\bin。CLASSPATHJava编译后存放class文件的路径即运行字节码文件时会查找的路径自认待确认.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jartools.jar是系统执行javac 编译一个类的时候会用到。JRE_HOME有些软件会用到JRE_HOME比如Tomcat7.0版本如果没有设置此环境变量就会闪退在安装JDK19时发现安装后里面没有JRE从网上看到有博客使用jlink.exe --module-path jmods --add-modules java.desktop --output jre指令会在当前路径下生成一个jre但自己在JDK17版本时尝试、暂没有反应。cdC:\Users\lu\Desktop\ljh\jdk-19.0.1\bin C:\Users\lu\Desktop\ljh\jdk-19.0.1\bin安装JDK后之所以需要配置环境变量是因为用户变量新建JAVA_HOME名称是以Apache JMeter中的官方安装要求为准值为JDK的安装根目录此篇博客系统变量中的path变量设置后在命令提示行中可以直接输入Java命令而不必输入JDK的完整路径。path变量需要将JDK的bin目录的安装路径存入即可。系统变量配置path如下图所示官网解释如下详情见JDK官网解释。有的博客会要求设置ClasspathClasspath在于告诉Java执行环境在哪些目录下可以找到您所要执行的Java程序所需要的类或者包。classpath的作用补入此篇博客。事实上JDK 5.0默认就会到当前工作目录(上面的.设置)以及JDK的lib目录(这里假设是C:\Program Files\Java\jdk1.5.0_06\lib)中寻找Java程序。所以如果Java程序是在这两个目录中则不必设置Classpath变量也可以找得到将来如果Java程序不是放置在这两个目录时则可以按上述设置Classpath。这里给大家展示一下JDK的bin文件夹下的内容都是一些dll文件Windows配置环境变量Linux配置环境变量本台服务器全机生效配置环境变量后source /etc/profile使配置生效。本台服务器对应用户下的生效/home/该用户的用户名/配置多个环境变量的方法补入这篇博客可以吗。静态链接库和动态链接库dll文件Dynamic Linkable Library即动态链接库文件简称“库文件”又称“应用程序拓展”是软件文件类型。是一个包含可由多个程序同时使用的代码和数据的库提供了一些可以直接拿来用的变量、函数或类。例如在 Windows 操作系统中Comdlg32 DLL 执行与对话框有关的常见函数。因此每个程序都可以使用该 DLL 中包含的功能来实现“打开”对话框。这有助于促进代码重用和内存的有效使用。在Windows中许多应用程序并不是一个完整的可执行文件而是被分割成一些相对独立的dll文件。当我们执行某一个程序时相应的DLL文件就会被调用。自认即dll文件是一种只能等待被调用无法向.exe文件那样可以自己执行的文件。好处通过dll文件程序可以实现模块化——由相对独立的组件组成。①提高程序加载速度可以根据需要只将需要的模块加载而不必全部加载。例如一个计帐程序可以按模块来销售。可以在运行时才将各个模块加载到主程序中——模块是彼此独立的所以程序的加载速度更快模块只在相应的功能被请求时才加载而不必在最一开始就将所有模块不管是否需要就全部加载节省了加载的工作量。②数据统一管理更新更方便。可以更为容易地将更新应用于各个模块而不会影响该程序的其他部分。例如你可能具有一个工资计算程序而税率每年都会更改。当这些更改被隔离到 DLL 中以后您无需重新生成或安装整个程序就可以应用更新。经历了“无库静态链接库动态链接库”这个过程的发展。静态链接库与动态链接库都是共享代码的方式。静态链接库.lib文件库中的代码最后需要链接到你的可执行文件中去所以静态连接的可执行文件一般比较大一些。在静态库情况下函数和数据被编译进一个二进制文件通常扩展名为*.LIBVisual C的编译器在链接过程中将从静态库中恢复这些函数和数据并把他们和应用程序中的其他模块组合在一起生成可执行文件。这个过程称为静态链接此时因为应用程序所需的全部内容都是从库中复制了出来所以静态库本身并不需要与可执行文件一起发行。动态链接库动态链接提供了一种方法使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 文件中该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个 DLL 副本的内容。使用动态链接库可以更为容易地将更新应用于各个模块而不会影响该程序的其他部分。共享dll文件一个应用程序可使用多个DLL文件一个DLL文件也可能被不同的应用程序使用这样的DLL文件被称为共享DLL文件。