Java 快速开发几 MB 独立 EXE,写图形界面很方便
Java 写的桌面软件带上运行时只有 6 MB,而且还是独立 EXE 文 件,是不是难以置信?
想一想 Electron 没写多少功能就可能超过百 MB 的体积,Java 写的桌面软件算不算得上小、轻、快呢?
aardio 可以支持很多编程语言, Java 就是其中之一。
aardio + Java 可生成体积极小的独立 EXE 文件,可以内存加载 Java 编写的 class 文件,用 aardio + Java 生成的软件,发布时不需要携带 Java 运行时。
aardio 写图形界面很方便。例如仅 605 KB 的开源软件 ImTip:
例如仅 755 KB 的开源软件 Gif123:
aardio 开发的程序,兼容XP,Vista,Win7,Win8,Win10,Win11...... 等所有系统。aardio 只支持 Windows 系统( macOS + Linux 桌面市场份额小于被遗忘的 Win8 ),同时也扔掉了跨平台的沉重包袱(更轻量、更好地利用专用平台优势)。将需要跨平台的代码用 Java 写,这并不影响在 Windows 上可以使用 aardio 生成 EXE 文件 。跨平台与专有平台工具并不冲突,可以相互结合。
开始
默认只要在 aardio 中调用
import java;
就会自动搜索系统可用的 JRE,如果没有找到 JRE,会自动导入 java.jre.v8 扩展库,并自动安装 OpenJDK JRE v8 。
如果您希望发布的软件自带 Java 运行时,或者指定 JRE 的版本,只要在 aardio 中导入其他版本 JRE 的扩展库就可以,例如运行
import java.jre.v8ora
就可以自动绑定 Oracle Java 8 运行时,软件运行会自动查找用户电脑上符合要求的 JRE,如果没有找到会全自动地安装和部署好,开发者要做的,仅仅就是写几句代码,把 EXE 简单地分发给用户就可以了。
当然,独立 EXE 也可以嵌入更小的 JRE,aardio 里提供了一个示例 JRE,只要简单的在代码中加入
import java.jre.v6
就可以在软件中嵌入一个精简版的 JRE 6 运行时,这个 JRE 只有 6MB 多一点,而且可以生成独立 EXE 文件,甚至还能支持 Windows XP 这种古老的系统。Java 写的桌面软件带上运行时只有 6 MB,而且还是独立 EXE 文 件,是不是难以置信?!想一想 Electron 没写多少功能就可能超过百 MB 的体积,Java 写的桌面软件算不算得上小、轻、快呢?!
现代 Java 已经可以非常方便地生成精简版的 JRE,所以你只要参考 java.jre.v6 的实现( 放心这个库的源代码只有几行 ),就可以非常轻松地更换为其他 JRE 版本,并生成极小的 EXE文件( 而且可以是独立的 EXE文件)。
好吧,我们来看几个 aardio 自带的 aardio + Java 范例( 可以直接运行 )。
aardio 调用 Java 函数
首先请看下面 aardio 调用 Java 如此简单,我们可以在 aardio 中直接导入 Java 的类,创建 Java 对象,就像在 Java 代码中一样使用它们。
import console;
import java; //创建 Java 虚拟机
var jvm = java(); //导入 Java 类
HelloworldApp = jvm.import( "aardio.sample.HelloworldApp"); //修改类的静态成员变量
HelloworldApp.static_num = 996; //获取类的静态成员变量
console.log( HelloworldApp.static_num ); //直接用 Java 类创建 Java 对象,跟 Java 中一样用就行
var helloworld = HelloworldApp(); //获取对象的成员字段值
console.log( helloworld.name ); //调用对象的方法
console.log( helloworld.test(1) ); //调用 main 函数,参数是字符串数组
var ret = HelloworldApp.main( {"aaa字符串数组1","bbb字符串数组2"} );
console.log(ret);
console.pause();
Java 会在 CLASSPATH 指定的搜索目录下使用 Java 类名(替换'.'为'\')" 去查找类,这类似 Windows 到 %PATH% 环境变量下搜索文件。CLASSPATH 已默认添加 "/java/"以及"/java/*.jar" 在首次创建 Java 虚拟机以前,可用下面的函数添加目录到 CLASSPATH:
java.addClassPath("/java/");
以上参数指定目录下的 *.jar 也会自动添加(不递归子目录)。
也可以如下自内存或文件直接加载类,注意下面的路径前面的$操作符可将文件编译到代码中(发布后不再需要原文件)
HelloworldApp = jvm.import("aardio.sample.HelloworldApp"
,$"\java\aardio\sample\HelloworldApp.class");
以上文件路径前面的波浪线反斜杠(或斜杆)表示程序根目录(开发时一般指工程目录,发布后指启动EXE文件所在的目录)。
Java 调用 aardio 函数
示例:
import console;
import java; //创建 Java 虚拟机
var jvm = java(); //导入 Java 类
HelloworldApp = jvm.import( "aardio.sample.HelloworldApp"); //为 Java 提供 Native API
HelloworldApp.registerNative(
function(env,jobject,jstring){
var code = jvm.parseString(jstring) //也可以用 owner.parseString(jstring)
var func = loadcode(code)
return jvm.string( func() )
},"aardio","string(string)"
) var helloworld = HelloworldApp();
console.log( "Java 函数返回值",helloworld.test_aardio() ); console.pause()
Java 类 HelloworldApp (在范例中可以找到)中如下声明 aardio 函数:
static native String aardio(String code);
aardio 直接运行 jar 程序
您仅需数句代码可以将 jar 导入 aardio 生成软件件。以 Java 编写的软件 FFDec 为例,原来只能自己去下载安装 JRE,现在不用这么做了,我用 aardio 写了个例子:
import fsys.dlg;
import java.ffdec; java.ffdec(
fsys.dlg.open("*.swf|*.swf")
)
这个扩展库 java.ffdec 的源代码只有几句:
import fsys;
import java;
import string.cmdline; namespace java; class ffdec {
ctor( ... ){
var args = {
"-Xmx1024m",
"-Djna.nosys=true",
"-Dsun.java2d.uiScale=1.0",
"-jar",jarPath
} ..table.append( args, ..string.cmdline.arguments(...)) return ..java.popenProcess( args,{workDir=..io.fullpath( self.workDir : "/")} );
}
} namespace ffdec{
jarPath = ..io.appData("\aardio\std\java\ffdec\ffdec.jar"); if(!..io.exist(path)){
import sevenZip.lzma.tar;
sevenZip.lzma.tar($"~\lib\java\ffdec\.res\ffdec.tar.lzma",..io.appData("aardio\std\java\") )
}
}
aardio 调用 jar 的 main 函数
我们还可以直接调用 jar 的 main 函数来运行 Java 程序,以 YUICompressor 为例:
import java;
import java.yuiCompressor;
java.addClassPath("~\lib\java\yuiCompressor\.res\yuicompressor.jar") var jvm = java();
YUICompressor = jvm.import( "com.yahoo.platform.yui.compressor.YUICompressor");
var ret = YUICompressor.main({"d:\test.js", "-o","d:\testmin.js"})
Java 函数签名
原本调用 Java 函数要写签名,但这个签名写起来是有些累的。所以 aardio 已经把这个事情完全给优化掉了,aardio 调用 Java 一般不用再去写签名。
但是 aardio 仍然允许以声明普通静态 API 函数的语法指定 Java 函数签名 —— 然后由 aardio 自动翻译为 Java 函数签名。
举个例子:
import java;
var jvm = java(); //导入 Java 类
HelloworldApp = jvm.import( "aardio.sample.HelloworldApp"); //getMethod 用于获取一个函数,参数 @2 指定函数签名
var main = HelloworldApp.getMethod("main","string(string[])"); //通过声明导入的函数,如果参数是字符串,可以把参数展开写
var result = main("test1","test2")
但是上面的函数签名一般可以省略,可以简化为下面的代码:
HelloworldApp.main( {
"aaa字符串数组1","bbb字符串数组2"
} )
上面的示例需要的 Java 类,可以在 aardio 自带范例里找到:
Java 快速开发几 MB 独立 EXE,写图形界面很方便的更多相关文章
- java快速开发平台可视化开发表单
XJR java快速开发平台,简单的理解就是:开发人员以某种编程语言或者某几种编程语言(比如:目前流行的多种web技术,包括springboot, JPA,Druid, Activiti,Lombok ...
- 将notepad++打造成java快速开发IDE
参考文章:http://blog.csdn.net/mdyyzc/article/details/7653096 有时候要试验一小段代码,打开eclipse又需要忍受漫长的煎熬(电脑配置较低,见谅). ...
- JEECG 3.7.1 版本发布,企业级JAVA快速开发平台
JEECG 3.7.1 版本发布,企业级JAVA快速开发平台 ---------------------------------------- Version: Jeecg_3.7.1项 目: ...
- JEECG 4.0 版本发布,JAVA快速开发平台
JEECG 4.0 版本发布,系统全面优化升级,更快,更稳定! 导读 ⊙平台性能优化,系统更稳定,速度闪电般提升 ...
- 4款java快速开发平台推荐
JBoss Seam JBoss Seam,算得上是Java开源框架里面最优秀的快速开发框架之一. Seam框架非常出色,尤其是他的组件机制设计的很有匠心,真不愧是Gavin King精心打造的框架了 ...
- 1024程序员节宅男节日快乐 -- JAVA快速开发平台,JEECG 3.8宅男优化版本发布
JEECG 3.8 版本发布,系统全面升级,重构上传组件.优化代码生成器机制! 导读 ⊙平台性能优化,系统更稳定,速度闪电般提升 ⊙系统上传组件全面重构,使用plupload组件,解决flash的 ...
- JeecgBoot 2.1.1 代码生成器AI版本发布,基于SpringBoot+AntDesign的JAVA快速开发平台
此版本重点升级了 Online 代码生成器,支持更多的控件生成,所见即所得,极大的提高开发效率:同时做了数据库兼容专项工作,让 Online 开发兼容更多数据库:Mysql.SqlServer.Ora ...
- JEECG 3.7.2版本发布,企业级JAVA快速开发平台
JEECG 3.7.2版本发布 - 微云快速开发平台 JEECG是一款基于代码生成器的J2EE快速开发平台,开源界"小普元"超越传统商业企业级开发平台.引领新的开发模式(Onli ...
- Java快速开发平台——JEECG 3.7.8 版本发布!我们的目标是有鱼丸也有粗面
JEECG 3.7.8 版本发布,多样化主题UI满足你不同的需求 导读 ⊙平台性能优化,速度闪电般提升 ⊙提供5套新的主流UI代码生成器模板( ...
随机推荐
- STM32 移植 RT-Thread 标准版的 FinSH 组件
一.移植准备 开发版STM32F10xC8T6 准备好移植RT-Thread的移植工程 没动手移植过RT-Thread的小伙伴,可以看RT-Thread移植到stm32 我这里是将控制台信息打印到串口 ...
- meet in the middle 复习笔记
前言 若干年前看过现在又忘了.这么简单都忘 所以今天来重新复习一下. 正题 考虑这样的问题: 给定 \(n\) 个物品的价格,你有 \(m\) 块钱,每件物品限买一次,求买东西的方案数. \(n\le ...
- Object类和toString方法 --和Object类的equals方法
一,Object类概述:Object是类层次结构的根,每个类都可以将Object作为超类,所有类都直接或者间接的继承自该类构造方法:pulic Object()在面向对象中,子类要访问父类的无参构造方 ...
- 《深入理解java虚拟机》读书笔记-第二章Java内存区域和内存溢出异常
java1.7和java8的jvm存在差异,本文先按照<深入理解java虚拟机>的讲解内容总结,并将java8的改变作为附录放在文末 一丶运行时数据区域 图:java虚拟机运行时数据区 ...
- Python图像处理丨图像腐蚀与图像膨胀
摘要:本篇文章主要讲解Python调用OpenCV实现图像腐蚀和图像膨胀的算法. 本文分享自华为云社区<[Python图像处理] 八.图像腐蚀与图像膨胀>,作者: eastmount . ...
- 华为云Stack南向开放框架,帮助生态伙伴高效入云
摘要:CloudBonder的生态社区通过一系列生态项目,解决提交叉组合.架构分层不清晰.运维界面不清晰等问题,简化对接流程,降低生态伙伴对接成本,缩短对接时间. 本文分享自华为云社区<[华为云 ...
- 报告指SpaceX估值已达到1000亿美元,埃隆马斯克以此回击其接受政府补贴的批判
SpaceX首席执行官埃隆-马斯克(Elon Musk)表示,名下的航天发射服务供应商市值已达到1000亿美元.该金额是根据上个月的评估报告确认的,标志着SpaceX在完成最新一轮融资,并筹集超过10 ...
- B.E.M 规范
BEM文档 BEM: A New Front-End Methodology 如何看待 CSS 中 BEM 的命名方式? Battling BEM CSS: 10 Common Problems An ...
- iOS自动化打包 Jenkins+Gitlab+Fastlane+蒲公英+钉钉
前言 这两天花时间整理一下自动化打包的整套流程,现在iOS端的整套流程是没有问题了,这个过程中踩得坑也的确是特别多,所以这周末把整个流程整理一下,总结出来这篇文章,希望能对有需要的小伙伴有点点帮助. ...
- Vue 模板语法 && 数据绑定
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8" /> 5 & ...