[转载]让Java程序自带JRE

让Java程序自带JRE
用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,首先查找自己所在的目录下有没有JRE(据王森讲这样说不确切,我没有JDK全部的源代码,在此无从考证);其次查找自己的父目录下有没有JRE;最后才是查询Windows的注册表。
通常我们在安装好了JRE的机器上的任何一个目录下都可以执行java.exe。因为它在安装时被复制到了windows的system32目录下,而后者无论如何都会在path环境变量中。这个java.exe最终必然会访问注册表来确定真正的JRE的所在地。若我们要求每一个应用程序都自带JRE,必然不能走这条路。但,逻辑的第二条讲,java.exe会在它的父目录下查找JRE,解决方案就在这一条中。
假设我们的应用程序打好了包,叫做MyApp.jar,放在MyApp的目录下。我们在MyApp目录下,可以执行java –jar MyApp.jar来运行我们的程序。我们安装的是JRE 1.5,在C:Program FilesJavajre1.5.0下。现在,我们只需要简单的将jre1.5.0目录搬到MyApp目录下,顺便改个容易写的名字比如叫jre。现在,我们的应用程序就象这样:
MyApp
MyApp.jar
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:MyAppjrein
然后运行:
java –verbose –jar MyApp.jar
加上verbose参数以确定我们确实用了这一套被搬出了家的JRE。
程序可以运行,并且在命令行输出的前几行,可以看到:
[Opened C:MyAppjrelib t.jar]
[Opened C:MyAppjrelibjsse.jar]
[Opened C:MyAppjrelibjce.jar]
[Opened C:MyAppjrelibcharsets.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( &pi, sizeof(pi) );

// Start the child process.
if( !CreateProcess( "jre\bin\javaw.exe",//执行的程序名
"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.
&pi ) // 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完全被隐藏在底层。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/374079/viewspace-130962/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/374079/viewspace-130962/

Java程序自带JRE                          标  题: 让Java程序自带JRE 发信站: 四川大学蓝色星空站 (Fri Jul  8 10:26:29 2005), 站内        用Java开发程序,发布时总要考虑的问题就是怎么在使用者的机器上装好JRE。要考虑的问题很多:使用者有没有能力独自安装JRE,使用者已有的JRE和我们需要的版本是不是一致,会不会出现版本问题,等等。使用.N 阅读详情

相关推荐

安装microsoft store

windows10安装microsoft store

NanshanGly的博客 4824

找不到接受实际参数的位置形式参数

1、检查路径是否包含空格特殊转义字符等,加上“”或者\转义 2、windows下powershell和cmd使用命令行有所不同 我使用powershell的copy命令提示 改用linux语法的cp就行了

HideInTime的博客 3万+

【实测通过】win10应用商店被卸载后如何重新安装

之前手贱卸载了,想修改桌面主题都不行,网上方法的代码有点小bug,请参考下面的方法。首先使用http://www.xitongcheng.com/jiaocheng/win10_article_25698.html介绍方法获取权限再参考https://jingyan.baidu.com/article/ca41422f247e691eae99ed8e.html找到appxmanifest.xml所...

smileglaze的博客 4万+

[转载]Eclipse编程Tips-让RCP自带JRE

Eclipse编程Tips-让RCP自带JRE有些时候我们编写的程序可能会用到其它一些库,比如JAI, J3D等,而在默认JRE中并没有这些库。一种方法是在用户的客户端上安装这些库,但是还有另外一种简单的方法,那就是自带JRE...

congji3817的博客 193

Android Studio 自带jre 和甲骨文(Oracle)的 JDK

Android Studio安装后自带jre,这个自带jre的版本号肯定比最新的版本号要小。 但是如果项目中没有用到新版本jdk的特性功能,那么可以直接使用Android studio自带jre,不用安装jdk。 如果想要使用自己安装的jre,那么就需要安装部署JDK开发环境。  JDK包含JRE。  JRE包含虚拟机JVM JREJava Runtime Environment JRE顾名思义是java运行时环境,包含java虚拟机,java基础类库。是使用java语言编写

qq_36157827的博客 8535

java jre精简_转载 jre精简

前不久给朋友做了一个桌面程序程序文件没多大,但运行java程序需要jre,但jre足足有80M多,然后在网上搜了如何给给JRE瘦身或精简JRE,整理如下:打开JRE安装目录.目录包括bin,lib二个文件夹,所以就是将这两个文件进行瘦身了,1. bin: 可以认为这是Java虚拟机.2. lib: 执行class文件时,Java虚拟机需要用到的类库及资源文件.一、bin瘦身主要从两方面考虑① e...

weixin_42227736的博客 545

java学习之Java中JDK,JRE和JVM之间的关系(转载

初学JAVA很容易被其中的很多概念弄的傻傻分不清楚,首先从概念上理解一下吧,JDK(Java Development Kit)简单理解就是Java开发工具包,JRE(Java Runtime Enviroment)是Java的运行环境,JVM( java virtual machine)也就是常常听到Java虚拟机。JDK是面向开发者的,JRE是面向使用JAVA程序的用户,上面只是简单的区别,一般...

u011447847的博客 885

java中的jre里面有什么_JavaJRE介绍,JRE是什么

首页>基础教程>基础知识>JDK&JRE&JVMJavaJRE介绍,JRE是什么JRE简介JRE(Java Runtime Environment,Java运行环境),包含JVM标准实现及Java核心类库。JREJava运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器)JRE是运行基于Java语言编写的程序所不可缺少的运行环...

weixin_27230891的博客 5065

javajre是什么_JavaJRE介绍,JRE是什么

首页>基础教程>基础知识>JDK&JRE&JVMJavaJRE介绍,JRE是什么JRE简介JRE(Java Runtime Environment,Java运行环境),包含JVM标准实现及Java核心类库。JREJava运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器)JRE是运行基于Java语言编写的程序所不可缺少的运行环...

weixin_36250086的博客 5704

Idea JavaJavaFx导出exe并自带jre任意电脑运行

最详细的教你如何使用idea把程序打包成jar,然后转成exe,让别人的电脑即便没有jre环境也可以完美运行

qq_30548105的博客 4419

JDK 和 JRE 有什么区别?

JDK与JRE的区别 JREJava Runtime Environment(java运行时环境)。即java程序的运行时环境,包含java虚拟机,java基础类库。 JDK:Java Development Kit(java开发工具包)。即java语言编写的程序所需的开发工具包。 JDK包含JRE,同时还包括java源码的编译器javac、监控工具jconsole、分析工具jvisualv...

QLH的博客 3002

JRE, JDK, JVM, JIT的区别(转载)

[size=medium][url]http://swiftlet.net/archives/639[/url] [b]1. 定义[/b] JRE(Java Runtime Enviroment)是Java的运行环境。面向Java程序的使用者,而不是开发者。如果你仅下载并安装了JRE,那么你的系统只能运行Java程序JRE是运行Java程序所必须环境的集合,包含JVM标准实现及 Java...

iteye_16559的博客 1578

如何检查是否安装了java环境(即JRE)

浏览器访问一些调用了图形界面的网页,需要使用JRE,这个时候我们就需要检测操作系统是否已经安装了java环境( JRE) 1.点击开始菜单,输入cmd 2.在cmd窗口中输入java 若提示“‘java’不是内部或外部命令,也不是可运行的程序或批处理文件”,则表示未安装JRE 若提示下图 则表示已经安装JRE 3.输入java -version顺便可以查...

diwanmin2006的博客 1万+

javajre是什么_Java中JDK和JRE的区别是什么?它们的作用分别是什么?

转载:https://www.cnblogs.com/lsw9/p/8685623.htmlDear All:首先请允许我为大家介绍下什么是Jre?什么是jdk?JREJREJava Runtime Environment的缩写,顾名思义是java运行时环境,包含java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的,还有所...

weixin_35858091的博客 2582

JDK、JRE和JAR区别(转载

JDK里面的工具也是用Java编写的,它们本身运行的时候也需要一套JRE,如C:/Program Files/Java/jdk1.5.x/目录下的JRE。而C:/Program Files/Java/目录下的JRE是用来执行我们自己编写的JAVA程序。当然,两套JRE中的任何一套都可以用来执行我们自己编写的JAVA程序, 但是JDK里面的工具只能由C:/Program Files/Jav...

dianwei0041的博客 501

转载】jdk、jre、jvm等名词解释

JDK, JRE 和JVM是Java编程语言的核心概念。尽管它们看起来差不多,作为程序员我们也不怎么关心这些概念,但是它们是不同的针对特定目的的产品。这是一道常见的java面试题,而本文则会一一解释这些概念并给出它们之间的区别。 Java 开发工具包 (JDK) Java开发工具包是Java环境的核心组件,并提供编译、调试和运行一个Java程序所需的所有工具,可执行文件

沉溺的专栏 2280

你已经分清JAVA中JVM、JDK与JRE的作用和关系了吗?

JVM(Java Virtual Machine)即Java虚拟机,是Java程序运行的核心组件之一。它的作用就像一个“翻译官”,将Java字节码(.class文件)转换为机器码,让程序能够在不同的操作系统和硬件平台上运行。这也是Java语言实现“一次编写,到处运行”理念的关键。加载字节码:JVM加载.class文件并进行验证。解释执行或编译执行:JVM通过解释器或即时编译(JIT)技术执行字节码。内存管理:JVM负责垃圾回收和内存的分配与释放。

智的博客 1432

java17 的 jre在哪

配置相关视频讲解:C语言程序设计入门之环境安装如何找到Java17的JRE 作为一名经验丰富的开发者,当有新人问起关于Java17的JRE在哪的问题时,我们需要给予指导和帮助。下面是教新人找到Java17的JRE的步骤: 流程图 erDiagram 开始 --> 下载JDK: 下载 Java 17 JDK ...

weixin_36338946的博客 1192
上一篇: [转载]Jboss下MS SQL Server配置指导
下一篇: [转载]EJB 3.0开发指南之使用实体Bean
congji3817
博客等级 码龄10年 15粉丝 588原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值