Java 快速开发几 MB 独立 EXE,写图形界面很方便

news2024/11/20 2:40:43

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 自带范例里找到:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/159461.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是 智慧行业 App?

智慧行业 是帮助大家将智能设备和边缘网关设备添加到云开发项目的移动端 App。App 提供 iOS 和安卓版本,您可以在对应系统的应用商店下载。 应用场景 智慧行业 能帮助用户将不同网络协议的设备(包含边缘网关子设备)配置到相关项目中。开发者…

对于TP, TN, FP, FN, Pre, Recall的举例

对于以上参数的概念以及理解,请参考我的文章: 机器学习中TP,TN,FP,FN,Acc,Pre,Sen, Rec的含义_汤宪宇的博客-CSDN博客_机器学习accz 这里我们在将上面概念的定义重新梳理一遍&#…

深入源码剖析 Mybatis 缓存机制

深入源码剖析 Mybatis 缓存机制 Mybatis 为了减轻数据库压力,提高数据库性能。提供了两级缓存机制 一级缓存 sqlSession 级别缓存,缓存的数据只在 sqlSession 内有效,一级缓存默认为我们开起来,不需要我们手动操作,而…

【Dash搭建可视化网站】项目14:美国机场交通数据可视化看板制作步骤详解

美国机场交通数据可视化看板制作步骤详解1 项目效果图2 项目架构3 文件介绍和功能完善3.1 assets文件夹介绍3.2 app.py和index.py文件完善3.3 sider.py文件完善3.4 mapchart.py文件完善3.5 barchart.py文件完善3.6 api.py和api.ipynb文件完善4 样式修改4.1 整体样式修改4.2 sid…

联合证券|A股汽车板块爆发,北向资金半日净买入43亿

今日上午,A股商场震动胶着,轿车、电力设备、通信、机械设备等板块领涨。房地产、美容护理、商贸零售等板块领跌。 北向资金再度成为商场重要亮点之一,半个交易日净买入约43亿元。至此,2023年1月以来,北向资金累计净买入…

Jmeter常用函数

1、生成随机数函数 ${__Random(m,n)},其中m,n参数是必填 2、 生成随机日期函数${__RandomDate(dateTimeFormat,from,end,locale,var)},其中end是必选的,代表最大的日期; 3、 随机生成字符串函数${__RandomString(length,chars,)}…

Linux---vim编辑器

目录 1. vim的基本概念 2. vim正常/命令模式命令集 3. vim底行模式命令集 1. vim的基本概念 vim是Linux下一款常用编辑器,vim的三种模式(其实有好多模式,主要掌握这3种即可),分别是命令模式(command mode)、插入模式&#xff0…

Synchronized锁原理及 ConcurrentHashMap

文章目录一、Synchronized原理加锁过程锁消除锁粗化二、线程安全的集合类多线程环境使用ArrayList多线程环境使用队列多线程环境下使用哈希表一、Synchronized原理 我们表面看到的,两个线程针对同一对象加锁,就会产生阻塞等待,但实际我们的S…

2023我的创作纪念日

文章目录机缘收获日常憧憬机缘 这个博客还是我上大一的时候注册的,在大一、大二、大三期间更多的是为了方便搜索,学校里边的习题大部分是可以在CSDN上找到的。真正写博客是在大三下学习实习,当时为了方便记录实习中遇到的问题。在C站对我影响…

【Git 从入门到精通】2023最新版的Git安装与卸载每一步附详细讲解

文章目录安装1.下载Git2.开始安装卸载1.找到电脑中的Git2.卸载3.删除环境变量安装 1.下载Git 首先去官网下载Git安装包,可以直接在百度搜索Git,以下几个网站都可以。也可以点击直达,官网上下载如果不科学上网的话还是很慢的,所以…

[Zombodb那些事]Zombodb与ElasticSearch的Bulk通信

Zombodb与ElasticSearch的Bulk通信0.前言Zombodb是一个PostgreSQL插件,使用rust编写,支持pg14以下版本。Zombodb可以允许PostgreSQL查询ElasticSearch中的内容。本篇为《Zombodb那些事》第一篇,后面将更新其他部分内容。Zombodb会在pg数据库上…

智能文字识别技术推动彝文识别弘扬中华文化

前言 谈起图像识别自己颇有感触,因为之前的两段工作经历都和图像识别密切相关;之前一家公司的主营业务就是将历史上珍贵文献进行数字化;上家公司自己负责图像识别模块相关的工作;不但使用了第三方平台产品而且进行了自建&#xff…

设计模式相关内容介绍—UML

统一建模语言(Unified ModelingLanguage,UML)是用来设计软件的可视化建模语言。它的特点是简单、统一、图形化、能表达软件设计中的动态与静态信息。 UML从目标系统的不同角度出发,定义了用例图、类图、对象图、状态图、活动图、时序图、协作图、构件图、…

经过2022年这大环境,我学会了如何管理我的领导

2022年这大环境,可以说是我干软件开发这些年来,经历的最残酷的一年,所以做为职场软件开发一员的我,不得不修炼一下真本事。 很多时候不是你不努力,不是你连mysql连的不溜,不是你布局页面布局的不精细&#…

16.Isaac教程--Codelets详解

Codelets详解 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 文章目录Codelets详解Codelets 和 tick接收消息传输消息方便的 ToProto/FromProto 函数配置参数应用程序 JSON子图姿态组件是机器人应用程序的基本构建块。 Isaac SDK 包含可在您的应…

「数据结构详解·九」图的初步

「数据结构详解一」树的初步「数据结构详解二」二叉树的初步「数据结构详解三」栈「数据结构详解四」队列「数据结构详解五」链表「数据结构详解六」哈希表「数据结构详解七」并查集的初步「数据结构详解八」带权并查集 & 扩展域并查集「数据结构详解九」图的初步 注意&…

基于JavaWEB SSM SpringBoot婚纱影楼摄影预约网站设计和实现

基于JavaWEB SSM SpringBoot婚纱影楼摄影预约网站设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末…

天宝营养冲刺深交所IPO:业绩明显波动,深创投是股东

撰稿|汤汤 来源|贝多财经 近日,贝多财经发现,天宝动物营养科技股份有限公司(下称“天宝营养”)递交预披露更新招股书,准备在深圳证券交易所主板上市,红塔证券为其独家保荐人。本次冲刺上市,天…

《Protein Actions Principles and Modeling》-《蛋白质作用原理和建模》中文分享(16)

​《Protein Actions Principles and Modeling》-《蛋白质作用原理和建模》 本人能力有限,如果错误欢迎批评指正。 第四章:Protein Binding Leads to Biological Actions (蛋白质的结合会产生生物作用) -在变构中,…

大神推荐,这几个电脑实用技巧,让你电脑用起来更加流畅舒服

电脑在我们的日常生活中,往往承担着“办公学习”的作用!所以我们应该掌握哪些常用、好用的电脑使用技巧呢?今天就给大家分享下,我日常在使用电脑过程中,经常会使用到的几个电脑使用技巧!第一:快…