Files
zkhandzkh 44f6205f89 feat: 初始化 jpackage-maven-plugin 通用原生打包插件
基于 OpenJDK 16+ 官方 jpackage 工具,将任意标准 Java 应用打包为内嵌最小运行时的
跨平台自包含应用镜像(app-image 绿色免安装版),不绑定任何应用框架。

核心能力:
- 零配置:自动从主 JAR 的 META-INF/MANIFEST.MF 探测 Main-Class
- 环境定位:优先 ${java.home}/bin/jpackage,兼容 JRE 布局、JAVA_HOME 与 PATH
- 输入目录隔离:使用独立的 target/jpackage-input,避免编译产物被误打包
- 版本清洗:1.0.0-SNAPSHOT 等 Maven 版本号自动转为 jpackage 合法版本
- 编码防御:默认注入全套 UTF-8 运行参数,规避跨平台中文乱码
- 平台自适应:--win-console 仅在 Windows 目标平台传递
- 启动脚本:生成 run.sh(755)与 CRLF 换行的 run.bat(含 chcp 65001)
- Wine 交叉打包:支持在 Linux 上借助 Wine 产出 Windows 应用镜像

交付内容:
- 插件工程与面向 Maven Central 的完整 pom 配置
- 核心 Mojo 与 10 个 internal 工具类
- 103 个单元测试用例
- examples/hello-cli 可运行示例与中文 README

Generated with AI

Co-Authored-By: zkh <zkh@mirenqinggege.com>
2026-10-14 14:46:44 +08:00

98 lines
3.9 KiB
XML

<?xml version="1.0" encoding="UTF-8"?>
<!--
示例项目:一个普通的标准 Java 命令行应用,演示如何使用 jpackage-maven-plugin。
使用方式:
mvn clean package # 打出 target/dist/HelloTool 绿色免安装版
mvn clean package -Djpackage.skip=true # 跳过原生打包
./target/dist/HelloTool/run.sh 参数1 参数2
-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>hello-cli</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>hello-cli</name>
<description>jpackage-maven-plugin 的最小可用示例</description>
<properties>
<maven.compiler.release>17</maven.compiler.release>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jpackage.plugin.version>1.0.0</jpackage.plugin.version>
</properties>
<dependencies>
<!-- 一个真实的三方依赖,用于验证依赖拷贝与运行时类路径 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.14.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 让 JAR 带上 Main-Class,插件即可零配置自动探测 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.4.1</version>
<configuration>
<archive>
<manifest>
<mainClass>com.example.hello.HelloApp</mainClass>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
</manifest>
</archive>
</configuration>
</plugin>
<!-- 核心:原生打包插件 -->
<plugin>
<groupId>com.mirenqinggege.maven</groupId>
<artifactId>jpackage-maven-plugin</artifactId>
<version>${jpackage.plugin.version}</version>
<executions>
<execution>
<id>native-package</id>
<goals>
<goal>package-app</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- 应用名默认取 artifactId,这里演示显式覆盖 -->
<appName>HelloTool</appName>
<!-- mainClass 留空时插件会自动从 MANIFEST.MF 读取,这里演示显式声明 -->
<mainClass>com.example.hello.HelloApp</mainClass>
<!-- 追加的自定义 JVM 参数,排在默认 UTF-8 参数之后 -->
<javaOptions>
<javaOption>-Xmx256m</javaOption>
<javaOption>-Ddemo.mode=example</javaOption>
</javaOptions>
<!-- 应用图标:Windows 用 .ico、Linux 用 .png、macOS 用 .icns -->
<icon>${project.basedir}/src/main/resources/app.png</icon>
<vendor>Example Inc.</vendor>
<description>示例命令行工具</description>
<!-- Windows 目标平台是否保留控制台窗口(其他平台自动忽略) -->
<winConsole>true</winConsole>
<!-- 打印 jpackage 完整日志,便于排查问题 -->
<verbose>true</verbose>
</configuration>
</plugin>
</plugins>
</build>
</project>