精简JRE体积的小工具:http://blog.csdn.net/cping1982/archive/2008/09/02/2865198.aspx

项目地址:http://code.google.com/p/greenvm/

关键字:JRE,精简,压缩,JVM,JAVA.NET,虚拟机,绿色软件,最小空间,脱框,压缩,GREEN,GREENJVM


  
   9月6日更新版本为 0.1.1.4

变更:
  
    增加[SET_START_MAIN_CLASS_AUTO_LOAD]参数,当此项为真时,程序将设置主函数所在类开机自动启动。

增加初始化界面设置,参数如下:

  1. //程序启动前使用初始界面(此项为false时,以下设定皆无效)
  2. SET_START_INIT=true
  3. //使用的初始界面图片
  4. SET_START_IMAGE=init.bmp
  5. //设置true时初始窗体将自动居中,同时top及left无效
  6. SET_START_LOCATION_AUTO=true
  7. // 设置初始窗体在桌面的X轴
  8. SET_START_LOCATION_LEFT=100
  9. // 设置初始窗体在桌面的Y轴
  10. SET_START_LOCATION_TOP=100
  11. // 设定初始窗体显示时间
  12. SET_START_TIME=1000

PS:本文中所有关于JRE部分皆指Sun JRE。

众所周知,Java能够运行于近乎所有的操作系统,包括Windows、 Mac或Linux等等。

对于任何组织或个人的Java应用而言,只要你的应用程序需要移植或多OS发布,那么将现有应用从一个系统移植到另一个操作系统将是件非常轻松的事情,因为Java使用了虚拟机机制,可以脱离OS的约束而独立解释并执行class。

但有利也有弊,对于很多程序而言,这也同时意味着你的用户必须获得JRE支持,也就是说他需要安装JVM。但我国的现实情况却是很多人别说让他自己下载安装JRE,你就是给他做好全[下一步]的安装程序,他恐怕也连“下一步”都搞不定……||||

有鉴于此,我尝试提供一种解决方案,我将它命名为:GreenJVM,也就是绿色的JVM。

GreenJVM是一个专为绿化Java应用而存在的小程序,以C++开发(昨晚上抽空写的小应用程序,代码原型以前在Blog发过:通过exe启动class )。它的执行文件体积很小仅仅370KB,本身也是一个基于JNI的Java应用.真正的核心文件只有2个,一是GreenJVM.exe(执行文件),一个vm.cfg(配置文件),如下图:
          
         

它的功能非常简单,仅是解压自带的JRE并取代java.exe文件直接调度jvm.dll罢了。但就是这样一个小程序,却可以很轻松的实现Java软件的绿色发布。
         
   以千里冰封兄的YOYOPlayer为例(冰封兄blog:http://www.blogjava.net/hadeslee/),我们都知道这是一个非常之好的Java音乐播放器,在Java圈内已经小有名气。但遗憾的是,对比千千静听这类知名软件而言,了解它的人简直比华南虎还要稀有......虽然软件普及率低的原因多种多样,但对Java应用而言,究其根本还是JVM安装的关系。就像“妈是女人”的道理一样,Java程序的运行环境必须有与其开发版本兼容的JRE存在,否则无法运作。也就是这道门槛,不知把多少普通用户拦在了Java应用之外。

可能你会说这些是小事,的确,对我们这些Java程序员来讲当然不存在任何问题;但令人遗憾的是,对绝大多数普通用户,特别是并不成熟的中国数亿网民而言(我是指软件知识的平均值……其实牛人也很多……),安装JRE这几乎是件不可想象的艰巨任务;除非他们有必须使用不可的理由,否则需要下载第三方软件的程序,绝对是第一时间被pass掉的(一般人使用软件的准则就一条:简单就用,麻烦就不用);无形中大大增加了Java软件普及的难度,明明是很好的程序,却只能在Java圈子里流传,不禁令人扼腕。

事实上,我们可以通过极简单的技术手段来突破这一限制,轻而易举将Java应用做成绿色软件,免除用户这些不必要犹豫,令他们放心大胆的使用Java程序。

这个过程仅仅需要三步:

1、压缩你的JRE:


          
         目前GreenJVM支持rar和zip两种方式的解压。

2、设置vm.cfg:
         
      vm.cfg内容配置如下:

  1. [LOON]
  2. /*虚拟机解压方式,0.1版仅提供RAR及ZIP两种,Windows平台下建议使用RAR(调用自带unrar.dll,故不要求本地
  3. 存在WinRAR,使用ZIP则可以删除unrar.dll)*/
  4. SET_UNPACK_METHOD=rar
  5. //虚拟机压缩包名称,要求配置在vm.cfg同路径下
  6. SET_VM_NAME=jre.pack
  7. //检测本地jvm版本,低于期望值时使用自带jvm,否则以本地虚拟机优先运行
  8. SET_START_REQUIRE_VERSION=1.6
  9. //期望加载的jar,多包以';'分隔
  10. SET_START_JAR_PATH=fps_test.jar
  11. //期望执行的main类
  12. SET_START_MAIN_CLASS=org/test/BallPanel
  13. //选填,尝试从指定环境变量获取jvm路径,存在则优先运行本地jvm
  14. //SET_START_ENV=JAVA_HOME

3、发布应用,此时只需一个文件夹,就可以完全容纳下整个Java应用了。

现在我们来看看一个基本完整JRE1.6压缩包(去掉了bin下的exe文件)与YOYOPlayer放在一起后的空间占用情况,如下图:
       
    

对比百来MB的JRE而言,现在总体不过20MB的体积已经是小的太多。只需直接丢给用户这个文件夹,告诉用户一句“双击EXE文件执行”,就能如常运行此程序,而不必再解释或说明什么。

但饶是如此,20MB的音乐播放器,相较2MB左右的千千静听而言还是太大了,对很多普通用户来说依旧难以接受,他们不会去考虑Java特性,只会去想“千千2MB就能搞定的事,你怎么就要用20MB才行?肯定是水平不行,不用……”,Java程序员们集体抱头哭~~~。为了避免这类情况的发生,这时就需要我们在jre的体积上做些文章了。
         
          就和人的大脑活动区域一样,相对于我们每个应用而言,JRE中也至少会有20MB以上(只多不少)是被浪费掉的终身不使用区域,而这些区域中的组件及类库的唯一作用就是贪婪的占用硬盘空间罢了~因此找出这些区域并缩减它,就能最大限度的减小程序体积。(虽然sun或其它jvm提供商大多都反对这样,但我们只是在实验罢了:),况且我认为他们早晚也会开放jvm定制服务的。 )
          
          以YOYOPlayer为例,实际上我们只需在JRE中保留其音频支持、AWT/SWing支持、及网络支持等部分就好,其余的部分大可删掉不要。

下例我做了一个精简的JRE压缩包,如下图:

 
          只用了不足8MB的空间,便足以完成YOYOPlayer的全部功能.
      
          我们把这个JRE和YOYOPlayer放在一起,全部加起来也不过9MB多一点,而YOYOPlayer依旧可以在无JRE系统中正常运行.效果如下图:
         
          
        
          当然,如果再继续删的话,占用空间肯定还会有一定的下降幅度,我认为至少能将JRE压缩到6MB以内;但现实意义不大,毕竟不是做嵌入式开发,为了1,2MB费那么大劲不值当的……。事实上,对于绝大多数Java应用而言,压缩后至多9MB左右的空间占用便绰绰有余了,况且还有进一步精简的余地。
         
          如下例,这是我以前在Blog发过的一个FPS测速程序,效果如下:
          
         
        
          现在我使用一个针对AWT使用而精简的JRE,在另一台无Java环境的电脑上测试,结果如下图:

可以看到,程序正常运行,而且FPS数有明显提高,并没有因为直接调用JVM而削弱了性能.
                    
          这个完全支持AWT组件的JRE和执行程序全打成一个rar文件也不过4MB左右(PS:由于最占空间的JRE已经压缩过,所以再压缩其实意义不大……),实际上与本地程序的大小已经相差无几了.

不过就算是4MB的JRE也不能说很小了,如果愿意深度精简的话,2MB的JRE运行敝人的loonframework-game(尚未发布)都已经绰绰有余。就运行库而言,对比rmxp(ruby语言的游戏开发玩具……)还要小的多。
 
          这些几MB的Java应用,放到U盘里随身携带绰绰有余,要用时在U盘里便可以直接运行(当然,由于api依赖的关系,除非我为其它平台重新制作启动文件,否则只支持提供win32 api的系统),不用了就直接删文件,环保安全无污染,标准的绿色食品,不买也看看啊~

再稍微正规点做个安装文件(绿色软件不能等同于无需安装的软件,毕竟安装只不过是个部署过程,和绿不绿色没有实质上关系。愚以为,只要不改变现有系统配置,不依赖本地系统组件的软件都可称为绿色软件;相反就算不用安装,一执行就注册到系统中一堆乱七八糟东西的软件同样不能说是绿色的。),那么程序的体积还将进一步减小。

以YOYOPlayer为例,最终提供给用户一个5MB甚至4MB左右的绿色应用是绝对可以做到的,对比5.2.1版占用2.85MB空间的千千静听来说,已经看不出两者间有太大区别,普通的音乐爱好者已经没有理由不下载看看了.
        
          而一旦他们用了,就会慢慢发现Java应用的精妙之处,他会发现无论以后他用什么系统,这套软件他都将无法自拔的使用下去.

        项目地址:http://code.google.com/p/greenvm/

————————————————————————————————————————————

0.1.1版发布:

 项目地址:http://code.google.com/p/greenvm/

  新增[SET_LOCAL_JRE_UPDATE]项,通过此项可以命令本地JRE自动更新。

一起发布的是一个Java仿雷电游戏(源码见包内),共设置有三关三个小BOSS。采用有GreenJVM发布,因此可以运行在未装载JRE的Windows系统之上。 (N久以前写的一个古董……凑活看吧……)。

准备写到1.0时再去Sourceforge申请项目……现在Loonframework还没弄完呢……


0.1.1.3版发布:
项目地址:http://code.google.com/p/greenvm/

   新增7z格式压缩包解压支持,建议使用此格式进行虚拟机压缩。

_____________________________________________________________________________________________________________
_____________________________________________________________________________________________________________

GreenDotNet0.1.0

GreenDotNet是一个根据GreenJVM移植的应用,目标是实现.netframework虚拟机的绿色发布。

GreenDotNet 0.1.1 简要说明

1、本程序是一个非常简单的.Net程序免安装发布工具,可以满足绝大部分.Net framework2.0及以下环境开发之桌面应用的绿色发布及使用。

2、本程序目前阶段不尝试虚拟.Net运行环境(一是难写,二是敝人极懒,三我是Java程序员,明白?^^……),虚拟机初始化后将直接通过GreenDotNet.exe在Windows中布署最简.Net环境,故对程序运行效率无影响。

3、虚拟机压缩包中仅删除了System.Web(如果要用编码之类的功能自己实现就好,不然这堆东西也5MB左右呢|||),保留了其余一切链接库(如操作数据库必须的System.Data等,不要就自己删吧~),因此绝大多数操作皆可在此环境下正常使用。

4、由于采用了真实的Windows环境进行布署,因此加密或混淆后的.Net程序依旧可以正常在此环境下运行。

5、相较使用Salamander .NET Linker等收费工具(含使用飞信运行框架)而言,这只是一个简写的.Net布署方式,故而绝对不会存在版权或收费等问题。

相关文件说明:

GreenDotNet.exe : 启动文件,它将起到本地环境探针及布署.Net环境的作用。

vm.cfg : 配置文件,决定GreenDotNet.exe对系统进行的相关操作。

dotnet.pack(8MB) : 虚拟机压缩包,使用7z格式产生,目前仅提供.Net 2.0版本支持,不保证2.0以下或以上版本开发之应用在此环境能够正常运行。

vm.cfg配置如下:

  1. [LOON]
  2. //虚拟机解压方式,目前提供RAR、ZIP、7Z三种压缩方式的解压支持
  3. SET_UNPACK_METHOD=7z
  4. //虚拟机压缩包名称,要求配置在vm.cfg同路径下
  5. SET_VM_NAME=DotNet.pack
  6. //检测本地.net版本,低于期望值时使用自带.net,否则以本地虚拟机优先运行
  7. SET_START_REQUIRE_VERSION=1.1
  8. //期望执行的exe文件,要求与vm.cfg同路径下
  9. SET_START_MAIN_EXE=ComicStars.exe

项目地址:http://code.google.com/p/greenvm/

示例程序:

Zero漫天星辰漫画下载器是一个.Net的在线漫画检索及下载工具,采用.netframework1.1开发(使用.net纯粹是由于拖控件方便|||),作为GreenDotNet的示例程序一起发布.


原文:
http://blog.csdn.net/cping1982/article/details/2806598

Java&.Net虚拟机精简(GreenJVM&GreenDotNet发布) .的更多相关文章

  1. Java应用程序的打包和发布

    Java应用程序的打包和发布 简化Java应用程序的打包和发布 发布Java应用程序时Java提供了一系列打包和发布工具,可以显著的简化发布过程 该文章提供了打包Java code的几种方法,探讨Ja ...

  2. 【JAVA】虚拟机指令集

    [JAVA]虚拟机指令集 – – – 0x00 nop 什么都不做 0x01 aconst_null 将null推送至栈顶 0x02 iconst_m1 将int型-1推送至栈顶 0x03 icons ...

  3. Java SE7虚拟机指令操作码助记符

    本文转载自Java SE7 虚拟机指令操作码助记符 导语 在Class文件中,Java方法里的方法体,也就是代表着一个Java源码程序中程序的部分存储在方法表集合的Code属性中.存储在Code属性中 ...

  4. Java 使用httpclient Post与cxf 发布的Webservice通信

    使用cxf发布的webservice不知道什么情况总会有时管用有时不管用,对于项目来说这肯定不行.又不想改动webservice因为代码太多.人懒! 于是便使用httpclient与webservic ...

  5. 【转】安卓Java的虚拟机区别

    Google于2007年底正式发布了Android SDK, 作为 Android系统的重要特性,Dalvik虚拟机也第一次进入了人们的视野.它对内存的高效使用,和在低速CPU上表现出的高性能,确实令 ...

  6. Java线程安全性中的对象发布和逸出

    发布(Publish)和逸出(Escape)这两个概念倒是第一次听说,不过它在实际当中却十分常见,这和Java并发编程的线程安全性就很大的关系. 什么是发布?简单来说就是提供一个对象的引用给作用域之外 ...

  7. java JVM虚拟机

    JVM垃圾处理方法(标记清除.复制.标记整理) 1.标记清除 标记阶段:先通过根节点,标记所有从根节点开始的对象,未被标记的为垃圾对象. 清除阶段:清除所有未被标记的对象. 2.复制算法 将原有的空间 ...

  8. Java 8 停止维护,Java 9 难产,IDEA 2018 发布,还有……

    祝大家五一劳动节快乐,工作顺利! 又到了总结上个月干货的时候了,这个月我们带来了各种Java技术干货,各种送书抽奖福利,各种面试题分享,各种最新动态资讯等. 5.1重磅活动 | 区块链免费送书 &am ...

  9. 译:3.RabbitMQ Java Client 之 Publish/Subscribe(发布和订阅)

    在上篇 RabbitMQ 之Work Queues (工作队列)教程中,我们创建了一个工作队列,工作队列背后的假设是每个任务都交付给一个工作者. 在这一部分,我们将做一些完全不同的事情 - 我们将向多 ...

随机推荐

  1. Linux 下,mysql数据库报无法登陆错误:ERROR 1045 (28000): Access denied for use

    今天在别人的服务器上登录mysql发现无法登陆(Mysql别人实现安装好的) 密码和用户名都是正确的,但登录后报如下错误: ERROR 1045 (28000): Access denied for ...

  2. LeetCode 笔记25 Candy (艰难的调试)

    There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...

  3. Object C学习笔记20-结构体

    在学习Object C中的过程中,关于struct的资料貌似非常少,查阅了C方面的资料总结了一些学习心得! 一. 定义结构 结构体是一种数据类型的组合和数据抽象.结构体的定义语法如下: struct ...

  4. 每天一个linux命令(45):route命令

    Linux系统的route 命令用于显示和操作IP路由表(show / manipulate the IP routing table).要实现两个不同的子网之间的通信,需 要一台连接两个网络的路由器 ...

  5. “耐撕”团队 2016.04.06 站立会议

    1. 时间:20:00--20:20 共计20分钟. 2. 成员: Z 郑蕊 * 组长 (博客:http://www.cnblogs.com/zhengrui0452/), P 濮成林(博客:http ...

  6. PHP ADLogin

    <?php $user = 'aaaa'; $password = 'xxxx'; $domain = 'b.a.com'; //设定域名 $port = 3268; $basedn = 'dc ...

  7. 《疯狂Java:突破程序员基本功的16课》读书笔记-第一章 数组与内存控制

    很早以前就听过李刚老师的疯狂java系列很不错,所以最近找一本拿来拜读,再此做下读书笔记,促进更好的消化. 使用Java数组之前必须先对数组对象进行初始化.当数组的所有元素都被分配了合适的内存空间,并 ...

  8. bzoj 1458 网络流

    我们可以知道每行最多可以有多少个格子不用建点,设为x[i],每列同理设为y[i],那么我们连接(source,i,x[i]),(i,sink,y[i])表示我们将一个格子不建点,那么(i,j,flag ...

  9. 【poj1001】 Exponentiation

    http://poj.org/problem?id=1001 (题目链接) 题意 求实数R的n次方,要求高精度. Solution SB题Wa了一下午,直接蒯题解. 高精度,小数点以及去前导后导零很麻 ...

  10. [NOIP2010] 提高组 洛谷P1514 引水入城

    题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度. ...