利用 Jlink 优化 PLCnext Control 上的 Java 9+ 应用
Java 9 引入新工具 jlink,可组合模块构建全功能运行时镜像。一方面可在 PLCnext Control 运行完整 32 位 ARM JDK;另一方面结合 jlink 与模块系统,可裁剪出仅含应用所需 JDK 部分的精简包,大幅降低资源占用。
前置条件
- 宿主机系统 JDK
- 控制器目标平台 JDK
OpenJDK 多平台二制包可在 AdoptOpenJDK 获取。本教程选用 Linux arm32 jdk-12.0.2+10 作为控制器目标,宿主机用对应 Windows x64 版本。JDK 路径示例:
C: ---Java
| +---jdk-12.0.2
| ...
| ---jdk-12-ARM-32bit
...
创建应用模块
示例仅在控制台打印 Hello World。要用 jlink 必须将应用模块化。从名为 "HelloWorld" 的文件夹开始,src 目录结构如下:
HelloWorld
---src
---de.plcnext.hello
| module-info.java
---de
---plcnext
---hello
HelloWorld.java
HelloWorld.java 代码:
package de.plcnext.hello;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello PLCnext world!");
}
}
module-info.java 定义模块:
module de.pxc.hello { }
编译项目:
C:\Java\jdk-12.0.2\bin\javac.exe -d .modules\de.plcnext.hello .\src\de.plcnext.hello\de\plcnext\hello\HelloWorld.java .\src\de.plcnext.hello\module-info.java
生成 modules 文件夹与 class 文件:
HelloWorld
---modules
---de.plcnext.hello
| module-info.class
---de
---plcnext
---hello
HelloWorld.class
宿主机测试模块:
C:\Java\jdk-12.0.2\bin\java.exe --module-path .modules -m de.plcnext.hello/de.plcnext.hello.HelloWorld
输出 Hello PLCnext world!。
使用 jlink 裁剪运行时
不想带上 300 MB 完整 JDK。首选无额外参数用 jlink,但先用 jdeps 分析模块依赖:
C:\Java\jdk-12.0.2\bin\jdeps.exe --module-path ".modules" --add-modules "de.plcnext.hello"
结果显示除自模块外还需 java.base。module-path 指定应用模块路径与目标平台 JDK 的 jmods 目录(本例 C:\Java\jdk-12-ARM-32bit\jmods)。
jlink 命令:
C:\Java\jdk-12.0.2\bin\jlink.exe --module-path ".modules;C:\Java\jdk-12-ARM-32bit\jmods" --add-modules "de.plcnext.hello,java.base" --output HelloWorldjre
生成 HelloWorldjre 文件夹,仅约 45 MB。复制到控制器(如 /opt/plcnext/projects/java/)。赋予 java 可执行权限:chmod +x java,运行模块:
./java -m de.plcnext.hello/de.plcnext.hello.HelloWorld
输出 Hello PLCnext world!。进一步裁剪可加参数 --strip-debug、--no-header-files、--no-man-pages、--compress=2(压缩最省空间但可能影响性能),可压缩至 28 MB。
工业技术
- 高级电机控制电路:自锁、停止与延时技术
- 控制电路:基础、应用与最佳实践
- 现代工业远程生产控制的5大核心优势
- 利用 SNMP 优化 PLCnext Control 设备:实用指南
- 开发 PLCnext 控制台应用 (C#):初学者指南
- PLCnext 集群管理:利用 Kubernetes 赋能工业自动化
- 利用 Jlink 优化 PLCnext Control 上的 Java 9+ 应用
- 精通 Java 运算符:类型、语法与实战示例
- 精通 Java 接口:概念、实现与最佳实践
- 精通 Java Try-With-Resources:自动资源管理详解
- Java 注解详解:类型、放置位置与实战示例
- Java 10 应用类数据共享 (AppCDS):加速启动与减少内存占用