Fork me on GitHub
05 February 2023

2022年底受疫情影响,有了一些空闲时间,思维便开始发散起来,在想要做个什么好了。正好需要把 Trello 里的内容导入到 Logseq,突然想到为什么不利用最新的 Java 技术来开发,这样既可以了解最新的 Java 特性,也可以实现导入目的。于是 MyToolbox 就呱呱坠地了。

建立项目后,先开始思索项目整体架构应该是什么样的:

  1. 命令行程序
  2. 添加新功能要方便
  3. 保持精简小巧,避免依赖过多
  4. 统一处理参数解析、日志打印等和命令实现无关的操作
  5. 跨平台

这样大致可以确定程序流程和架构了。

执行流程输入命令解析、验证参数,提取命令;解析参数等匹配命令执行命令传入参数

因此需要实现的功能包括:

  1. 程序入口函数
  2. 参数解析器
  3. 日志管理
  4. 定义命令接口
  5. 实现命令接口
  6. 打包为可执行文件

前 5 步为具体的程序实现,就不具体说明了,Tool 接口定义如下,其它更多细节详情可查看源码。

public interface Tool {

    // 名称
    ToolName name();

    // 执行
    void run(Args args) throws Exception;

    // 帮助信息
    Args config();
}

重点来看看打包环节,看 GraalVM 如何大显身手,可执行文件如何摆脱对 Java 的依赖的。

GraalVM 提供了 org.graalvm.buildtools:native-maven-plugin 插件构建原生可执行文件。构建流程:

  1. 分析编译后的代码
  2. 获取反射、资源文件、JNI 等信息
  3. 根据配置信息构建原生可执行文件

运行 java -agentlib:native-image-agent=config-merge-dir=./src/main/resources/META-INF/native-image/config -jar ./target/my-toolbox-fat.jar 生成配置信息,mvn package 即可生成原生可执行文件。

🎉🎉🎉,就这样我们的工具箱就完成了。

运行示例:

~ mytool
ERROR: Please check tool name
About: CofCool@ToolBox v1.0.7
Example: --tool=demo --path=tmp
Help: --help={COMMAND}, like: --help=rename
Tools:
    rename: rename file conveniently
    trelloLogseqImporter: read trello backup json file and convert to logseq md file
    shell: run shell command
    dirWebServer: start a simple web directory server
    gitCommits2Log: generate changelog file from git commit log
    kindle: read kindle clipboard file and convert to md file
    json2POJO: convert json structure to POJO class
    link2Tool: convert link file to md
    converts: some simple utilities about string, like base64 encode

计算“abc”的 MD5 值:

~ mytool --md5=abc
Start run converts
900150983cd24fb0d6963f7d28e17f72

参考资料

  • https://docs.oracle.com/en/learn/understanding-reflection-graalvm-native-image/index.html#conclusions