基于 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>
98 lines
3.9 KiB
XML
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>
|