JRE 浅谈

卸载Office 16 Click-to-Run Extensibility Component详细步骤 卸载Office 16 Click-to-Run Extensibility Component详细步骤 第一步:按住键盘上的“Win+R”,打开运行窗口 在运行窗口输入“Installer”回车,打开Installer文件夹 第二步:在Installer文件夹红框最右侧,即“大小”后面,右击选择“其他”,找到“主题”,勾选,点击“确定”,添加主题列成功 第三步:在“主题”列找到“Office 16 Click-to-Run Extensibility Component 阅读详情

Java开发程序,发布时总要考虑的问题就是怎么在使用者的机器上装好JRE。要考虑的问题很多:使用者有没有能力独自安装JRE,使用者已有的 JRE 和我们需要的版本是不是一致,会不会出现版本问题,等等。使用.NET要考虑的问题就少些。现在.NET CLR似乎已经很普及了,看好多D版的 Win XP都会自己安装最新的.NET CLR,而且似乎它的安装界面也比JRE友好些。彻底解决安装JRE的问题的方案,就是让我们的应用程序自己背着JRE!这样,我们的程序就像传统的Win32应用程序一样,双击就可以执行,不用管所在的机器上是否有JRE,是什么版本的JRE,无论怎样,我有我自己的!要做到这一点,其实非常容易。

王森在他的《Java深度历险》(强力推荐这本书,内容少而精)的第一章就解释了JDK,JRE,JVM之间的关系。解释了我们执行java.exe时发生的事情。其中提到,java.exe依照一套逻辑来寻找可以用的JRE,

1、首先查找自己所在的目录下有没有 JRE(据王森讲这样说不确切,我没有JDK全部的源代码,在此无从考证);(注:经过我的实际验证,在windows2003+jdk 6的条件下,java.exe不会在自己的当前目录下寻找JRE目录)

2、其次查找自己的父目录下有没有JRE;(注:当时实验时就这个问题郁闷了半天,原因是开始我把JRE理解为泛的java运行环境概念,而java.exe需要用的内容都在/JRE/LIB目录下,所以我把这个目录的内容放在父目录下,但是不起作用。后来才知道,JRE是固定的目录名称而且必须使用这个名称,并且必须将JRE安装目录下的内容都复制过来才有效。也就是说,java.exe必须要在.../windows/底下找到JRE目录,否则就按第3的逻辑找注册表。sign :-(

3、最后才是查询Windows的注册表(注:HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment)。

注1:思维发散---我这个人考虑问题总是这样,容易涣散。java.exe的版本必须和他找到的JRE版本相匹配,否则会有错误。例如,安装了JDK 6,在console下键入java -jar -verbose pw.zfb.jar, 自然就会用system32目录下的java.exe执行, 并且在当前目录和父目录下没有找到JRE,于是察看注册表发现,CurrentVersion的值是1.4(该值可能被修改了),于是继续在1.4的键值中找到JavaHome,从他的值中得到JRE的路径,于是,1.6版的java使用了1.4版的JRE,so, error is occured. as follow:

C:\javatest>java -jar -verbose pw.zfb.jar >tt.txt
Registry key 'Software\JavaSoft\Java Runtime Environment\CurrentVersion'
has value '1.4', but '1.6' is required.
Error: could not find java.dll
Error: could not find Java 2 Runtime Environment.

同理,如果你发布的java程序中自带了JRE,请务必保证java.exe和JRE配套运行。这样也避免了JRE不一致导致的问题。所以,开发Java程序或是执行Java 程序时,一定要記得两件事:

只要这两件事情确定了,就知道问题发生的来龙去脉,也可以很容易地解決很多貌似的怪异的问题。

注2:思维发散---上面查找规则中说的“首先查找自己所在的目录下”中,自己所在的目录指java.exe所在的目录,比如,我们打开console,进入c:\根目录下,在console中直接键入c:\java.exe,如果c:的根目录下没有java.exe, 那么console怎么找到java.exe呢,肯定是通过遍历console的环境变量的path路径去查找匹配。那么我们当前的工作路径是c:\,但是,java.exe寻找JRE的规则中,是查找自己所在的目录和父目录(也就是java.exe所在的路径),而不是在当前工作路径下寻找。而对于[JDK 5.0以上默认到当前工作目录,以及JDK的lib目录中寻找Java

L:\eclipse\workspace\JavaTest\arrays\IceCream.class 中使用了L:\eclipse\workspace\JavaTest\pw\zfb\marry.class中的类,如果我们在L:\eclipse\workspace\JavaTest\ 目录下键入 java arrays.IceCream   那么执行没有问题,因为按照[java.exe在JDK 5.0以上默认到当前工作目录,以及JDK的lib目录中寻找Java程序]这个规则他在当前工作目录下找到了marry.class。但是如果我将IceCream.class 换个位置C:\javatest\arrays\IceCream.class ,那么我在 c:\javatest下键入 java arrays.IceCream   就会说找不到marry.class. 这是设置classpath即可解决问题。C:\>set classpath=%classpath%;L:\eclipse\workspace\JavaTest。 如果要放在lib目录下,就最好先打包成jar文件,然后再设置好classpath,也可以。(可参考:)

   通常我们在安装好了JRE的机器上的任何一个目录下都可以执行java.exe。因为它在安装时被复制到了windows的system32目录下,而后者无论如何都会在path环境变量中。这个java.exe最终必然会访问注册表来确定真正的JRE的所在地(因为,从windows xp开始,ms宣布不再在OS中支持java,也就是不再在OS中提供JRE,所以,正常情况下,system32目录下只有java.exe,而没有JRE目录及相关内容,上层windows目录下也没有JRE目录及相关内容,所以,在他的当前目录(system32)中,以及父目录中(windows)无法找到JRE目录,安装上面总结的寻找逻辑java.exe只能去注册表中寻找)。若我们要求每一个应用程序都自带JRE,必然不能走这条路。但,逻辑的第二条讲,java.exe会在它的父目录下查找JRE,解决方案就在这一条中。
假设我们的应用程序打好了包,叫做 MyApp.jar,放在MyApp的目录下。我们在MyApp目录下,可以执行java ?jar MyApp.jar来运行我们的程序。我们安装的是 JRE 1.5,在C:\Program Files\Java\jre1.5.0下。现在,我们只需要简单的将jre1.5.0目录搬到MyApp目录下,顺便改个容易写的名字比如叫jre。现在,我们的应用程序的目录结构就象这样:


.../MyApp/
    --MyApp.jar
     --Jre


其中jre中是Jre1.5.0目录下的全部内容。
Java.exe 就在jre目录下的bin目录中。根据第二条逻辑,java.exe会在它的父目录中查找jre,实验证实,它会查找lib目录,而lib就在jre目录下。因此,这样java.exe就会确定jre的所在然后正常执行java程序,不会去管我们是否安装了JRE,注册表中是否有注册项这些杂事了。
试一下,在命令行下进入MyApp的目录下,假设它在C盘,将path指向MyApp下的JRE:
set path=c:\MyApp\jre\bin   (这时已经将原path中的设置清空了,不会再到windows\system32下寻找,如果不清空,那么按照寻找次序,还是会先使用windows\system32下的java.exe。所以,一般情况下,自己的程序运行之前最好先在批处理文件里面临时设置PATH,把自己用的JRE放到PATH路径最前面,所以肯定会运行自己带的JRE,不会造成版本混乱。 )
然后运行:
java -verbose -jar MyApp.jar
加上verbose参数以确定我们确实用了这一套被搬出了家的JRE。
程序可以运行,并且在命令行输出的前几行,可以看到:
[Opened C:\MyApp\jre\lib\rt.jar]
[Opened C:\MyApp\jre\lib\jsse.jar]
[Opened C:\MyApp\jre\lib\jce.jar]
[Opened C:\MyApp\jre\lib\charsets.jar]
因此程序读取的确实是它的私有的JRE。
至此,我们似乎完成了任务。但是现在我们的私有JRE仍不完美,缺点是太大。JRE 1.5有接近70MB,作为我们的私有的JRE,好多内容都是可以抛弃的。Jre目录下的license都可以不要,bin下的执行文件只需要保留java.exe或者javaw.exe,lib下只要保留rt,jsse, jce,charsets几个库就可以了。除了i386和zi两个子目录外,其余的子目录都可以不要。Zi下只需要保留自己地区的子目录和其下的一些文件就可以。Lib下除了库之外的属性文件等等都要保留。这样清理一番,JRE仍然有接近50MB。还可以继续清理几个库文件里面不需要的内容,这需要仔细的整理,会很费功夫。最好能写出一个自动工具帮助我们整理它们。从Sun公司上下到的JMF里面附带的用Java写的媒体播放器就自带了JRE,只有几个 MB。
清理过后需要运行几遍我们的应用程序,以确保我们的JRE不缺少东西。
如果我们希望能有一个程序直接启动我们的应用程序,那就还要费些功夫。最简单的方法是弄出一个快捷方式来,但是快捷方式的路径不能是相对的,不方便我们安装。我想到的方案就是用Win32程序包装一下。在VS.NET下写一个Win32小程序:
int PASCAL WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpszCmdLine,
int nCmdShow )
{
STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( π, sizeof(pi) );

// Start the child process. 
if( !CreateProcess( "jre\\bin\\javaw.exe",//执行的程序名,该Win32小程序是和MyApp.jar放在一个目录下的,所以,这里使用相对路径可以指定使用自己的JRE。同时注意,该win32程序必须在包装的路径(即MyApp\)中运行才有效, 因为他用的是相对路径。有人问为何不用注册表?首先,这个程序的发布是没有安装的过程的,那么我怎么知道用户把它放在什么路经下? 如果仅是针对windows平台发布,那么MyApp.jar 是我们真正的java程序他保证了平台无关性,而针对windows平台的发布,我们可以使用一个win32 wrapper,设置注册表、环境变量等win32平台特有的配置来解决anywhere runable的问题。            

"jre\\bin\\javaw.exe -jar MyApp.jar", // 带参数的执行程序
NULL, // Process handle not inheritable. 
NULL, // Thread handle not inheritable. 
FALSE, // Set handle inheritance to FALSE. 
0, // No creation flags. 
NULL, // Use parent's environment block. 
NULL, // Use parent's starting directory. 
&si, // Pointer to STARTUPINFO structure.
π ) // Pointer to PROCESS_INFORMATION structure.
) 
{
ErrorExit( "CreateProcess failed." );
}

// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );

// Close process and thread handles. 
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
基本上是按照MSDN文档中的例子照搬的。将它编译成一个EXE文件,我们的任务才全部完成。双击这个EXE文件,我们的程序启动了,看起来和传统的Win32程序没有两样,JRE完全被隐藏在底层。

GOM引擎单机传奇架设全攻略——从DBC2000配置到登录器生成 本文详细解析了使用GOM引擎架设单机传奇的完整流程,从DBC2000的安装配置、服务端部署、引擎控制器设置,到登录器生成与客户端补丁放置。文章重点解决了单机架设中的常见问题,如数据库路径配置、IP地址设置及Key.lic文件处理,旨在帮助玩家快速搭建稳定的个人游戏环境,体验GM乐趣。 阅读详情

相关推荐

雷达工程师避坑指南:STAP处理中,间歇采样转发干扰为什么这么难对付?

本文深入解析了STAP处理中间歇采样转发干扰(ISRJ)的挑战与应对策略。通过分析ISRJ的工作机制和自由度消耗问题,结合仿真数据对比,揭示了其与传统压制干扰的本质差异。文章还探讨了在工程实践中如何构建有效的防御体系,包括降维处理技术选择和混合架构设计,为雷达工程师提供了实用的避坑指南。

weixin_30530339的博客 267

浅谈java程序发布之 JRE篇

Java开发程序,发布时总要考虑的问题就是怎么在使用者的机器上装好JRE。要考虑的问题很多:使用者有没有能力独自安装JRE,使用者已有的 JRE 和我们需要的版本是不是一致,会不会出现版本问题,等等。使用.NET要考虑的问题就少些。现在.NET CLR似乎已经很普及了,看好多D版的 Win XP都会自己安装最新的.NET CLR,而且似乎它的安装界面也比JRE友好些。彻底解决安装JRE的问题的方案

598

从零搭建一个AF架构项目:基于TIA Portal V19和S7-PLCSIM的仿真调试全流程

本文详细介绍了如何在TIA Portal V19环境中从零搭建西门子Automation Framework(AF架构)项目,包括环境准备、硬件组态、核心组件创建、项目架构分层实现以及仿真调试全流程。通过模块化编程和标准化接口设计,AF架构显著提升工业自动化项目的开发效率和维护便利性,特别适合S7-1500系列PLC的应用开发。

weixin_29313547的博客 672

Java将swing程序打包成exe,在无jre环境中运行

在idea中将使用swing开发的应用程序打包成可执行文件exe,并在其他电脑(无jre环境)中运行。

qq_43792037的博客 7579

从指令到坐标:深度解析307系列基站定位的AT指令实战与排错

本文深度解析了ML307系列模组基站定位的AT指令实战应用与排错方法。重点剖析了AT+MLBSCFG和AT+MLBSLOC两条核心指令的配置、执行流程及异步响应机制,并针对高德与OneOs两种主流定位服务提供了完整的配置指南。文章结合常见错误码(如126、127)和硬件注意事项,分享了确保定位成功的实战经验与稳健的程序框架。

weixin_29057695的博客 487

闲鱼虚拟商品自动发货神器XianYuAutoDeliveryX:从配置到对接大模型的完整指南

本文提供了一份关于闲鱼虚拟商品自动发货神器XianYuAutoDeliveryX的完整配置与实战指南。详细介绍了从环境搭建、账号安全配置到核心自动化流程的设置,并重点讲解了如何对接大语言模型API,实现智能对话回复,从而构建一套无人值守的闲鱼店铺自动化运营系统。

gray5的博客 1371

java+swing打包jar转成exe并动态绑定jre再打包成安装文件

java打包jar成exe并动态绑定jre再打包成安装檔 注:以下所有步骤的前提是,把jar文件,ico图示(pngImage文件夹),第三方jar包(lib活页夹),jre活页夹,放到同一个活页夹中。 本例放在exe4j Install4j Inno setup活页夹下,如图0 如图0 首先,我们选用exe4j把jar执行文件转成exe文件 exe4j.exe下载地址: http://...

王仁一的博客 1354

RK3568—基于GM8775C的MIPI转双通道LVDS屏幕调试

Rockchip RK3568 原生显示接口不支持双通道LVDS屏幕的数据输出,因此需要借助显示转换芯片才能实现双通道LVDS屏幕的驱动。本文介绍使用GM8775C芯片方案,在 RK3568 平台实现单路 MIPI DSI 信号输出来驱动双通道LVDS显示屏。 关于GM8775C GM8775C 型 DSI 转双通道 LVDS 发送器产品主要实现将 MIPI DSI 转单/双通道 LVDS功能,MIPI 支持 1/2/3/4 通道可选,每通道最高支持 1Gbps 速率,最大支持 4Gbps 速率。LV.

Industio_优快云的博客 1万+

此安装程序必须使用 Java 开发工具包 (JDK) 执行, 但 C:Program FilesJavajre1.8.0_172 不是有效的 JDK Java 主目录。

https://blog.youkuaiyun.com/HezhezhiyuLe/article/details/95960479

m0_55902316的博客 1121

告别 DIFY 构建卡顿 / 失败!巧用 Makefile 一键构建本地 WEB 镜像,附核心避坑指南

本文详细介绍了DIFY本地源码构建WEB镜像的完整流程,重点解决因官方npm源不稳定导致的构建失败问题。通过修改web/Dockerfile文件启用国内npmmirror镜像源,可大幅提升依赖下载速度和稳定性。在DIFY根目录执行封装好的make build-web命令即可一键完成构建,无需手动编写复杂docker命令。文章还提供了前置环境准备、构建结果验证等实用指导,帮助开发者高效完成DIFY前端二次开发后的镜像构建验证。

2501_93651177的博客 181

Cesium 实战 19 - 使用 gltf-vscode 查看、预览以及编辑 glTF 和 GLB 模型

Cesium 实战 - 使用 gltf-vscode 查看、预览以及编辑 glTF 和 GLB 模型。

非科班Java出身GISer的博客 6434

解决cmd运行java程序时报错Error: could not open `C:\Program Files\Java\jre1.8.0_271\lib\amd64\jvm.cfg‘

windows使用java命令时报错处理

李长渊的博客 1万+

[Dify 案例实战] 构建一个基于 Dify 的个人写作助理工具-带绑定资源

想要一个懂你风格、能帮你写文章、润色文字、生成大纲的 AI 写作助手? 本文将带你从 0 到 1,完整实现一个 基于 Dify 工作流的个人写作助理工具。 我们会利用 Dify 的 LLM 节点、变量传递、文本处理、知识库与多轮对话能力.

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 273

浅谈JDK、JRE、JVM区别与联系

关键字:JDK,JRE,JVM 摘要:JDK是 Java 语言的软件开发工具包(SDK)。在JDK的安装目录下有一个jre目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib合起来就称为jre。 一、JDK JDK(Java Development Kit) 是整个JAVA的核心,包括了Java运行环境(Java R...

ancientear的博客 8万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

浅谈JDK,JRE,JVM

JDK(Java Development Kit)-------Java开发工具包 包含了Java的开发工具,也包括了JRE。所以安装了JDK就不用单独安装JRE了。使用JDK开发完成的java程序,交给JRE运行。 JRE(Java Runtime Environment)--------Java运行环境 包含了JVM 和java程序所需的核心代码类库等。 JVM(Java Virtua...

The_Best_Hacker的博客 248

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

浅谈JDK,JRE,JVM

我们大致的可以把他们看作一种包含关系,即JDK里包含了JRE,JVM。JRM里也包含了JVM。 我们可以看到在我的JDK中是包含JRE的 首先我们讨论JVM是什么,JVM(Java虚拟机)。 用来干什么呢?用来编译(.class)文件的,我们知道计算机只能识别机器语言也即是biexia01010101001,这样的二进制字节码文件,但那时我们使用这样的机器语言进行编码是一件十分困难的事,所以高级...

weixin_45152986的博客 397

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

浅谈JDK JRE JVM三者的区别

首先,我们分别对这三者进行阐述。 JVM :英文名称(Java Virtual Machine),就是我们耳熟能详的 Java 虚拟机。它只认识 xxx.class 这种类型的文件,它能够将 class 文件中的字节码指令进行识别并调用操作系统向上的 API 完成动作。所以说,jvm 是 Java 能够跨平台的核心,具体的下文会详细说明。 JRE :英文名称(Java Runtime Environment),我们叫它:Java 运行时环境。它主要包含两个部分,jvm 的标准实现和 Java 的一些基本类库

weixin_46402869的博客 2208

浅谈JDK、JRE、JVM

JVM(Java Virtual Machine ):Java虚拟机,简称JVM,是运行所有Java程序的假想计算机,是Java程序的运行环境,是Java 最具吸引力的特性之一。我们编写的Java代码,都运行在JVM 之上。 跨平台:任何软件的运行,都必须要运行在操作系统之上,而我们用Java编写的软件可以运行在任何的操作系统上,这个特性称为Java语言的跨平台特性。该特性是由JVM实现的,我们...

qq_19586619的博客 173

浅谈JVM、JDK以及JRE

JVM Java 虚拟机(JVM- Java Virtual Machine)是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。 那么什么是字节码?采用字节码的好处是什么? 在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释

qq_44980917的博客 148

JVM - 浅谈JVM、JRE、JDK

浅谈JVM、JRE、JDK JDK、JRE、JVM之间的关系示意图 一、Java虚拟机 JVM(Java Virtual Machine):Java虚拟机,简称JVM,是Java程序的运行环境。所有的Java程序都运行在JVM上。 跨平台特性:Java编写的软件可以运行在任何操作系统上,只要这台机器上安装了与之操作系统对应JVM,这称为Java语言的跨平台特性。也就是Java程序运行在JVM上,JVM运行在操作系统上。 注意:JVM本身不具备跨平台特性,每种操作系统下都有与之适配的JVM。

xing123456jl的博客 199

浅谈JDK,JRE,JVM的联系

小故事 - 习惯人生: 父子两住山上,每天都要赶牛车下山卖柴。老父较有经验,坐镇驾车,山路崎岖,弯道特多,儿子眼神较好,总是在要转弯时提醒道:“爹,转弯啦!”   有一次父亲因病没有下山,儿子一人驾车。到了弯道,牛怎么也不肯转弯,儿子用尽各种方法,下车又推又拉,用青草诱之,牛一动不动。   到底是怎么回事?儿子百思不得其解。最后只有一个办法了,他左右看看无人,贴近牛的耳朵大声叫道:“爹,转弯啦!...

weixin_45302340的博客 244

安装JDK后JRE与JVM联系浅谈

转自安装JDK后JRE与JVM联系浅谈 安装JDK后JRE、JVM之间的关系是什么呢?那么我们要从安装JDK慢慢说起。 如果安装了JDK,会发同你的电脑有两套JRE: 一套位于 \jre 另外一套位于 C:\Program Files\Java\j2re1.4.1_01 目录下 后面这套比前面那套少了Server端的Java虚拟机,不过直接将前面那套的Se

Think,Make 1227

浅谈JVM、JRE、JDK的作用和联系

浅谈JVM、JRE、JDK的作用和联系 JVM(Java Virtual Machine) JVM(Java Virtual Machine),Java虚拟机。所有的.java程序都不能被机器的操作系统直接识别并执行,而是先被编译为.class的字节码文件,但此时字节码文件仍然不能和机器的操作系统产生交互,而是经过虚拟机将字节码文件解释成本地操作系统可执行的机器指令,这时程序才会被执行。 所以JVM是Java实现跨平台(Windows、macOS、Linux)最核心的部分。图为:Java程序的执行过程 J

weixin_43400607的博客 397

浅谈JDK,JRE, JVM

1、JVM(Java  Virtual Machine) JVM就是我们常说的Java虚拟机,用来执行我们的.class文件,.class文件是.java源码编译产生的一种字节码文件。.class文件不是直接与我们的操作系统相对应,它运行在虚拟机上,由虚拟机将程序解释成本地系统可以识别运行的二进制文件。 JVM和实际的操作系统一样,有自己的指令集和内存区域,JVM提供了一种与平台无关的代码执行

apple_of_eye的博客 302
上一篇: Add unit test for unmanaged code
下一篇: DataGrid 自定义DataGridColumnheader
泉水老叮当
博客等级 码龄10年 9粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值