CentOS 8 安装 Apache Whisker 指南

在 CentOS 8(已 EOL)上部署 Apache Whisker 0.2-SNAPSHOT,覆盖镜像源失效的 vault 修复、el8 显式 JAVA_HOME、JDK 17 兼容缺陷单行修复、generate/audit/skeleton 实测与 Maven 插件集成,命令回显均实测通过。

Apache WhiskerApache Whisker2026/10/15

CentOS 8 安装 Apache Whisker 指南

目标:在已停止维护的 CentOS 8 上部署 Apache Creadur 家族的许可证合规审计工具 Apache Whisker(实测版本 0.2-SNAPSHOT,Apache 官方快照仓库每日构建),完成软件源修复、JDK 17 兼容性单行修复,并跑通 --help、--generate、--audit、--skeleton 与 Maven 插件集成;本文全部命令与回显均已在 CentOS 8.4.2105(x86_64)实测通过。

Apache Whisker 用于按 XML 元数据描述组装发行版中各资源的许可证(licence)与版权归属(organization),自动生成 LICENSE/NOTICE 文档并输出审计报告,隶属 Apache Creadur 项目(与 Apache Rat、Apache Tentacles 同门)。它是纯 Java 命令行工具,没有常驻服务;安装的本质是「修复 EOL 软件源 → 装好 JDK → 拿到可执行 jar(或接入 Maven 插件)→ 写最小元数据描述符 → 跑通三个命令」。CentOS 8 已于 2021 年底停止维护,官方镜像源域名已下线,本文第一章先修复软件源再展开安装。

一、环境信息

本节先固定可复现的基线环境,后续所有命令均在此环境执行。

  • 操作系统:CentOS Linux 8.4.2105(x86_64)
  • JDK:OpenJDK 17.0.1(dnf 包 java-17-openjdk-devel,el8_5 vault 源)
  • 构建工具:Apache Maven 3.5.4(dnf 包 maven,Red Hat 3.5.4-5,方案 B 使用)
  • 组件版本:Apache Whisker 0.2-SNAPSHOT(org.apache.creadur.whisker:apache-whisker-cli:0.2-SNAPSHOT,快照编号 20261014.173522-582)
  • 仓库坐标:Maven Central 无任何 Whisker 构件,唯一官方 Maven 仓库为 Apache 快照仓库 https://repository.apache.org/content/repositories/snapshots/
  • 软件源:阿里云 centos-vault 镜像(替代已下线的官方 mirrorlist)
  • 验证用工作目录:/root/whisker(jar 与元数据)、/root/whisker/app(演示发行目录)、/root/plugin-demo(方案 B 工程)

系统与架构确认(实时回显):

cat /etc/redhat-release
uname -m
CentOS Linux release 8.4.2105
x86_64

💡 说明:Whisker 是一次性运行的 CLI 工具,不存在需要常驻的守护进程;「安装完成」的判定标准是 java -jar 跑通 --help 并对最小元数据描述符产出 generate/audit 结果,而不是某个端口处于监听状态。

二、前置条件

  1. 具有 root 或 sudo 权限的 CentOS 8 系统。
  2. 可访问阿里云镜像站 mirrors.aliyun.com(vault 源修复需要)与 Apache 快照仓库 repository.apache.org。
  3. 可访问 Maven 中央仓库 repo.maven.apache.org(方案 B 拉取插件传递依赖)。
  4. 至少 1 GB 可用磁盘空间(JDK 约 300 MB,Whisker 可执行 jar 约 4.6 MB)。

网络连通性确认(实时回显):

curl -4 -sI --max-time 30 https://mirrors.aliyun.com/centos-vault/ | head -1
curl -4 -sI --max-time 30 https://repository.apache.org/content/repositories/snapshots/ | head -1
HTTP/1.1 200 OK
HTTP/1.1 200 OK

三、版本选型说明

本节给出 Whisker 的版本事实。这是小众低频维护项目,与常见 Java 组件差异很大,以下为 2026-10-15 的真实查询结果。

Maven Central 上没有任何 Whisker 构件(搜索接口 numFound:0,repo1.maven.org/maven2/org/apache/creadur/whisker/ 路径 404,双渠道核实一致)。Apache 官方快照仓库是唯一 Maven 来源,且只有 0.2-SNAPSHOT 一个版本线(实时回显):

curl -4 -s --max-time 30 "https://repository.apache.org/content/repositories/snapshots/org/apache/creadur/whisker/apache-whisker-app/maven-metadata.xml"
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
  <groupId>org.apache.creadur.whisker</groupId>
  <artifactId>apache-whisker-app</artifactId>
  <versioning>
    <latest>0.2-SNAPSHOT</latest>
    <release></release>
    <versions>
      <version>0.2-SNAPSHOT</version>
    </versions>
    <lastUpdated>20261014173522</lastUpdated>
  </versioning>
</metadata>
来源版本结论
Maven Central无不可用,网传 whisker-* 中央仓库坐标均不存在
Apache 快照仓库0.2-SNAPSHOT(每日构建)本文实测采用,官方唯一 Maven 渠道
源码 tagapache-whisker-0.1唯一历史正式版,未发布到任何 Maven 仓库,需自行源码构建

本文实际采用 0.2-SNAPSHOT(cli 快照编号 20261014.173522-582,sha1 a107b429d7a995c68da71de45f69b61b35a17a5e)。项目官网 https://creadur.apache.org/whisker/ 页头标注 Version: 0.2-SNAPSHOT | Last Published: 2026-07-22,最近一次源码提交为 2026-10-02 的依赖升级合并,属低频维护。该 jar 内嵌全部依赖(约 4.6 MB),字节码主版本号为 52(Java 8 基线),JDK 8 与 JDK 17 均可运行(JDK 17 需第六章的单行修复)。快照构件的可用性以构建当日为准,升级时替换下载链接中的时间戳即可。

💡 技术拓展:许可证合规工具选型(Creadur 家族分工)——Apache Rat 扫描源码文件头、报告缺失的许可证声明,适合 CI 门禁;Apache Whisker 按元数据生成发行版对外 LICENSE/NOTICE 并审计资源归属,适合组装发行;Apache Tentacles 从仓库批量拉取第三方构件做合规核查。三者互补不互替。本文采用 Whisker,目标是维护组装应用的对外法律文档。

四、修复 dnf 软件源(EOL 实测)

本节解决 CentOS 8 EOL 后软件源不可用的问题,这是 CentOS 8 上装任何东西的前置步骤。

直接 dnf makecache 会失败(输出节选:回显 URL 中的 infra 参数已裁剪):

dnf -q makecache
Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: Curl error (6): Couldn't resolve host name for http://mirrorlist.centos.org/?release=8&arch=x86_64&repo=AppStream [Could not resolve host: mirrorlist.centos.org]

定位:官方 mirrorlist.centos.org 域名已随 EOL 下线(DNS 无法解析),配置里若残留 mirror.centos.org 的 baseurl 也会得到 403 拒绝。官方仅保留 archive 归档,国内用阿里云 centos-vault 镜像最直接。把全部 repo 文件中的 mirrorlist 注释掉、baseurl 指向 vault:

sed -i -e 's|mirrorlist=|#mirrorlist=|g' \
       -e 's|#baseurl=http://mirror.centos.org|baseurl=https://mirrors.aliyun.com/centos-vault|g' \
       /etc/yum.repos.d/CentOS-*.repo

重建缓存验证(实测静默成功,退出码 0):

dnf -q makecache
echo $?
0

⚠️ 注意:centos-vault 按版本号分目录(本例解析到 8.5.2111 系列的包源),不同小版本的包版本可能略有差异;JDK 等工具链版本以 dnf list 实际输出为准,不要硬编码版本号写进脚本。

五、安装 JDK 与显式 JAVA_HOME

5.1 安装 OpenJDK 17

el8 vault 的 appstream 仓库提供 java-17、java-11、java-1.8.0 三条 JDK 线。先确认可用版本(实时回显):

dnf -q list available 'java-17-openjdk*' | head -5
Available Packages
java-17-openjdk.x86_64                    1:17.0.1.0.12-2.el8_5        appstream
java-17-openjdk-demo.x86_64               1:17.0.1.0.12-2.el8_5        appstream
java-17-openjdk-devel.x86_64              1:17.0.1.0.12-2.el8_5        appstream
java-17-openjdk-headless.x86_64           1:17.0.1.0.12-2.el8_5        appstream

选择 java-17-openjdk-devel(含 jar 工具,第六章修复清单属性时必须):

dnf -q install -y java-17-openjdk-devel
# 输出节选(实测首尾)
Installing      : java-17-openjdk-1:17.0.1.0.12-2.el8_5.x86_64
  xorg-x11-fonts-Type1-7.5-19.el8.noarch
java -version
openjdk version "17.0.1" 2021-10-19 LTS
OpenJDK Runtime Environment 21.9 (build 17.0.1+12-LTS)
OpenJDK 64-Bit Server VM 21.9 (build 17.0.1+12-LTS, mixed mode, sharing)

5.2 显式设置 JAVA_HOME

el8 的 dnf 包不会设置 JAVA_HOME(实测为空):

echo "JAVA_HOME=$JAVA_HOME"
JAVA_HOME=

java 命令本身通过 alternatives 指向 17 可直接使用,但显式导出 JAVA_HOME 能让依赖该变量的脚本(以及后续 Maven 使用的 JDK 选择)保持确定。安装后 JVM 位于 /usr/lib/jvm/java-17(实时回显):

ls /usr/lib/jvm/ | head -6
java
java-17
java-17-openjdk
java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64
java-openjdk
jre

写入 profile 并在当前会话生效:

echo 'export JAVA_HOME=/usr/lib/jvm/java-17' > /etc/profile.d/java17.sh
export JAVA_HOME=/usr/lib/jvm/java-17
echo "JAVA_HOME=$JAVA_HOME"
command -v java jar
JAVA_HOME=/usr/lib/jvm/java-17
/usr/bin/java
/usr/bin/jar

验证点:JAVA_HOME 非空、java/jar 均在 /usr/bin/ 下解析成功。

六、方案 A:快照 jar 直用(推荐)

6.1 方案说明

链路是:curl 下载 cli 模块快照 jar 并校验 sha1 → java -jar --help 验证 → 应用 JDK 17 兼容性单行修复 → 部署元数据描述符与演示发行目录 → 跑通 --generate/--audit/--skeleton。

6.2 下载与校验

mkdir -p /root/whisker && cd /root/whisker
curl -4 -sO --max-time 120 "https://repository.apache.org/content/repositories/snapshots/org/apache/creadur/whisker/apache-whisker-cli/0.2-SNAPSHOT/apache-whisker-cli-0.2-20261014.173522-582.jar"
curl -4 -s --max-time 30 "https://repository.apache.org/content/repositories/snapshots/org/apache/creadur/whisker/apache-whisker-cli/0.2-SNAPSHOT/apache-whisker-cli-0.2-20261014.173522-582.jar.sha1"
sha1sum apache-whisker-cli-0.2-20261014.173522-582.jar
a107b429d7a995c68da71de45f69b61b35a17a5e
a107b429d7a995c68da71de45f69b61b35a17a5e  apache-whisker-cli-0.2-20261014.173522-582.jar

两行 sha1 逐字一致即下载完整。重命名并确认尺寸:

mv apache-whisker-cli-0.2-20261014.173522-582.jar apache-whisker-cli-0.2-SNAPSHOT.jar
ls -l apache-whisker-cli-0.2-SNAPSHOT.jar
-rw-r--r-- 1 root root 4816276 Oct 15 14:22 apache-whisker-cli-0.2-SNAPSHOT.jar

6.3 首次运行 --help

java -jar apache-whisker-cli-0.2-SNAPSHOT.jar --help

完整回显(实测全量):

usage: apache-whisker-cli -a | -g | -t  [-h] -l <file> [-s <dir>]

Pass the descriptor containing license meta-data and the act to be done.
 -a,--audit                       report audit details
 -g,--generate                    generate license and notice
 -h,--help                        print help then exit, ignoring other
                                  options.
 -l,--license-descriptor <file>   use given license descriptor
 -s,--source <dir>                application source
 -t,--skeleton                    generates skeleton meta-data

Apache Whisker assists assembled applications maintain correct legal
documentation. Whisker is part of the Apache Creadur suite of tools for
auditing and comprehending software distributions, and is open source
community developed software. Get involved at http://www.apache.org.

命令面就此固定:互斥动作 -a(审计)/-g(生成)/-t(骨架),加 -l 元数据描述符(必填)、-s 发行目录。

6.4 JDK 17 兼容缺陷与单行修复

JDK 17 上 --help 正常,但实际动作会崩溃(实测回显头部):

java -jar apache-whisker-cli-0.2-SNAPSHOT.jar --generate --license-descriptor main.xml
Exception in thread "main" java.lang.ExceptionInInitializerError
        at org.apache.creadur.whisker.cli.Main.configure(Main.java:131)
        at org.apache.creadur.whisker.cli.Main.configure(Main.java:119)

定位:可执行 jar 打包了 log4j-api 并带有 META-INF/versions/9/ 多版本类目录,但 MANIFEST 缺 Multi-Release: true 声明,JDK 9+ 退回旧版调用者定位逻辑而抛异常(完整堆栈含 Caused by: java.lang.UnsupportedOperationException: No class provided, and an appropriate one cannot be found.)。修复:

cd /root/whisker && printf 'Multi-Release: true\n' > mr.mf
jar ufm apache-whisker-cli-0.2-SNAPSHOT.jar mr.mf
jar xf apache-whisker-cli-0.2-SNAPSHOT.jar META-INF/MANIFEST.MF
grep -E 'Multi-Release|Main-Class' META-INF/MANIFEST.MF
Main-Class: org.apache.creadur.whisker.cli.Main
Multi-Release: true

若追求零改动,改装 java-1.8.0-openjdk-devel 并用 /usr/lib/jvm/java-1.8.0/bin/java 运行该 jar,天然无此问题(字节码基线即 Java 8)。

6.5 部署描述符与演示发行目录

创建最小元数据描述符 /root/whisker/main.xml(MIT 单许可证样例,licenses/notices/organisations 先定义给 id,primary-* 声明整体归属,within 按目录穷举资源;完整文件与《Ubuntu 22.04 安装 Apache Whisker 指南》4.6 节相同):

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <licenses>
    <license name='MIT License'
             id='osi:mit'
             url='https://www.opensource.org/licenses/mit-license.php'>
      <text>
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
      </text>
    </license>
  </licenses>
  <notices/>
  <organisations>
    <organisation id='example.org'
                  name='Example Technology Ltd.'
                  url='https://www.example.org'/>
  </organisations>
  <primary-license id='osi:mit'>
    <copyright-notice>Copyright (c) 2026 Example Technology Ltd.</copyright-notice>
  </primary-license>
  <primary-organisation id='example.org'/>
  <within dir='.'>
    <with-license id='osi:mit'>
      <by-organisation id='example.org'>
        <resource name='readme.txt'/>
        <resource name='run.sh'/>
      </by-organisation>
    </with-license>
  </within>
  <within dir='alpha'>
    <with-license id='osi:mit'>
      <by-organisation id='example.org'>
        <resource name='five.js'/>
        <resource name='six.rb'/>
      </by-organisation>
    </with-license>
  </within>
</manifest>

准备与描述符对应的演示发行目录:

mkdir -p /root/whisker/app/alpha && cd /root/whisker/app
echo 'Whisker demo application readme.' > readme.txt
printf '#!/bin/sh\necho demo\n' > run.sh
echo 'console.log(5);' > alpha/five.js
echo 'puts 6' > alpha/six.rb

6.6 generate 实测

cd /root/whisker && java -jar apache-whisker-cli-0.2-SNAPSHOT.jar --generate --license-descriptor main.xml --source app

实测回显(头部与尾部,正文为 MIT 许可证全文):

Copyright (c) 2026 Example Technology Ltd.


Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
(输出节选:MIT 许可证正文已折叠)

WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

命令行方式的 generate 固定输出到标准输出,落盘用重定向:

java -jar apache-whisker-cli-0.2-SNAPSHOT.jar --generate --license-descriptor main.xml > LICENSE
wc -l LICENSE
23 LICENSE

6.7 audit 实测

干净目录(实测回显):

java -jar apache-whisker-cli-0.2-SNAPSHOT.jar --audit --license-descriptor main.xml --source app
No issues found.

No missing licenses.

No duplicate definitions.

No resources are missing required source links.

No extra licenses

故意放入未声明文件再审计(实测回显):

echo undeclared > app/extra-undeclared.txt
java -jar apache-whisker-cli-0.2-SNAPSHOT.jar --audit --license-descriptor main.xml --source app
rm app/extra-undeclared.txt
Resources missing licenses:
    extra-undeclared.txt in .

No duplicate definitions.

No resources are missing required source links.

No extra licenses

验证点:未声明资源逐条列在 Resources missing licenses 下;注意这是报告,退出码仍为 0,接入 CI 需自行检查输出内容。

6.8 skeleton 实测

--skeleton 扫描发行目录生成带 DTD 的骨架描述符(同样输出到标准输出,实测头部):

java -jar apache-whisker-cli-0.2-SNAPSHOT.jar --skeleton --license-descriptor main.xml --source app | head -6
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE manifest [
<!ELEMENT manifest (licenses, organisations, primary-license, primary-notice?, within*)>
<!ELEMENT licenses (license*)>
<!ELEMENT license (template?, text)>
<!ATTLIST license name CDATA #REQUIRED>

骨架正文的许可与组织定义段是程序自带的示例值,作为正式描述符使用前务必整段替换。缺 -s 参数时的实测回显:

-s application source

usage: apache-whisker-cli -a | -g | -t  [-h] -l <file> [-s <dir>]

七、方案 B:Maven 插件集成

7.1 方案说明与 Maven 安装

链路是:dnf 安装 Maven → 最小工程声明 Apache 快照插件仓库与 apache-whisker-maven-plugin:0.2-SNAPSHOT → mvn generate-resources 触发生成 → 产物写入 target/。el8 官方源 Maven 为 3.5.4(实测可用):

dnf -q install -y maven
mvn -v | head -2
locale | head -1
Apache Maven 3.5.4 (Red Hat 3.5.4-5)
Maven home: /usr/share/maven
LANG=

验证点:Maven 3.5.4 就绪;LANG 为空即 POSIX locale,7.3 节的字符集问题与此直接相关。

7.2 创建插件演示工程

/root/plugin-demo/pom.xml(完整内容,与 Ubuntu 指南 5.3 节一致,直接照抄):

<?xml version="1.0" encoding="UTF-8"?>
<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>demo</groupId>
  <artifactId>whisker-plugin-demo</artifactId>
  <version>1.0.0</version>
  <packaging>jar</packaging>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <pluginRepositories>
    <pluginRepository>
      <id>apache.snapshots</id>
      <url>https://repository.apache.org/content/repositories/snapshots/</url>
      <releases><enabled>false</enabled></releases>
      <snapshots><enabled>true</enabled></snapshots>
    </pluginRepository>
  </pluginRepositories>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.creadur.whisker</groupId>
        <artifactId>apache-whisker-maven-plugin</artifactId>
        <version>0.2-SNAPSHOT</version>
        <configuration>
          <descriptor>${project.basedir}/main.xml</descriptor>
        </configuration>
        <executions>
          <execution>
            <phase>generate-resources</phase>
            <goals>
              <goal>generate</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

把 6.5 节的描述符复制进工程:

cp /root/whisker/main.xml /root/plugin-demo/main.xml

参数说明:<descriptor> 必填(用户属性 apacheWhiskerDescriptor);outputDirectory 默认 ${project.build.directory};outputEncoding 默认 ${project.build.sourceEncoding}。

7.3 运行与字符集修复

POSIX locale 下直接运行会报错(实测回显):

cd /root/plugin-demo && mvn -B generate-resources
[ERROR] Failed to execute goal org.apache.creadur.whisker:apache-whisker-maven-plugin:0.2-SNAPSHOT:generate (default) on project whisker-plugin-demo: Whisker failed to generate materials: Mismatched Charset(UTF-8) and CharsetEncoder(US-ASCII) -> [Help 1]

定位:velocity 以平台默认字符集(US-ASCII)初始化,插件又按 UTF-8 写文件,二者不匹配。设置 UTF-8 locale 后重跑(实测修复):

export LANG=C.UTF-8 && mvn -B generate-resources 2>&1 | tail -4
ls -l target/LICENSE
head -1 target/LICENSE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.793 s
[INFO] Finished at:  2026-10-15T14:05:40Z
[INFO] ------------------------------------------------------------------------
-rw-r--r-- 1 root root 1076 Oct 15 14:05 target/LICENSE
Copyright (c) 2026 Example Technology Ltd.

验证点:BUILD SUCCESS 且 target/LICENSE 内容与方案 A 标准输出一致。需要 NOTICE 文档时,把描述符主许可证换成 Apache License 2.0 并定义 primary-notice 段(写法见《Ubuntu 22.04 安装 Apache Whisker 指南》5.5 节),插件会在 target/ 同时产出 LICENSE 与 NOTICE。

八、方案对比与选择建议

维度方案 A:快照 jar 直用方案 B:Maven 插件
依赖面单个 4.6 MB jar,零构建体系Maven 3.5.4 + 插件传递依赖自动解析
产物落点标准输出(重定向落盘)直接写入 target/
NOTICE 文档实测标准输出未出现(快照缺陷)配置 primary-notice 后实测正常生成
生命周期集成手工执行挂接 generate-resources 阶段
JDK 17 兼容需 Multi-Release 单行修复无需修复,实测正常
环境要求无LANG=C.UTF-8(POSIX locale 报字符集错误)

选型建议:已有 Maven 工程或需要 NOTICE 文档选方案 B;临时审计、脚本化批量生成选方案 A。两者共用同一份 main.xml,可互为校验。

九、基础配置说明

  • 描述符即配置:-l 指向的 XML 是唯一输入,三段结构(定义 → 主归属 → 目录资源归属)详见 6.5 节注释与《Ubuntu 22.04 安装 Apache Whisker 指南》第七章。
  • id 引用规则:within → with-license(id) → by-organisation(id) → resource,引用未定义 id 立即报 MissingIDException(退出码 1,实测见 FAQ Q2)。
  • ${year} 变量:primary-notice 文本中的 ${year} 解析时替换为当前年份。
  • 环境变量:方案 A 无需额外变量(JDK 17 的清单修复已固化进 jar);方案 B 必须保证 UTF-8 locale;JAVA_HOME 按 5.2 节显式导出,避免脚本化执行时 JDK 选择不确定。

十、验证清单

检查项预期(实测值)不符时排查
dnf -q makecache 退出码0第四章 vault 修复是否执行完整
java -versionopenjdk version "17.0.1"第五章重装 java-17-openjdk-devel
echo $JAVA_HOME/usr/lib/jvm/java-175.2 节显式导出
jar 下载 sha1a107b429d7a995c68da71de45f69b61b35a17a5e重新下载,勿跳过校验
--help 退出码 0打印 -a/-g/-t/-l/-s/-h usage确认 jar 完整
JDK 17 下 generate输出版权声明与许可证正文6.4 节 jar ufm 修复
audit 含未声明文件列出 Resources missing licenses核对 within 清单
插件构建BUILD SUCCESS + target/LICENSEexport LANG=C.UTF-8(7.3 节)

十一、常见问题(FAQ)

Q1:dnf 报 Could not resolve host: mirrorlist.centos.org 或源地址 403? EOL 后官方域名下线所致,按第四章把 repo 全部切到阿里云 centos-vault 后重建缓存。

Q2:报 Exception in thread "main" org.apache.creadur.whisker.fromxml.MissingIDException: Missing ID 'osi:gpl3' for element 'license' linked from element 'with-license'(退出码 1)? 描述符 with-license id= 引用了未在 <licenses> 定义的 id,核对三段 id 拼写一致后重跑。

Q3:JDK 17 下 generate/audit 报 ExceptionInInitializerError? jar 缺 Multi-Release: true 清单属性,按 6.4 节 jar ufm 修复,或改装 java-1.8.0 直跑。

Q4:audit 报 Expected '/root/whisker/app' to exist? -s 目录不存在,先创建目录或修正路径(audit 与 skeleton 都要求目录真实存在)。

Q5:插件报 Mismatched Charset(UTF-8) and CharsetEncoder(US-ASCII)? POSIX locale 所致,export LANG=C.UTF-8 后重跑(7.3 节实测修复);含中文的描述符同样依赖该 locale。

Q6:命令行 generate 输出里没有 NOTICE? 本快照的命令行方式在配置了 primary-notice 时标准输出也只有 LICENSE(实测确认),需要 NOTICE 用方案 B 插件在 target/ 获取。

十二、卸载与清理

移除 Whisker 相关文件与演示工程:

rm -rf /root/whisker /root/plugin-demo
ls /root/whisker 2>&1
ls: cannot access '/root/whisker': No such file or directory

清理 Maven 本地仓库中的 Whisker 快照(影响所有工程,慎用):

rm -rf $HOME/.m2/repository/org/apache/creadur/whisker

卸载 JDK 与 Maven(仅当不再需要)。dnf remove 去掉 -y 可先交互确认将删除的包,确认后执行(实测回显为真实执行结果):

dnf -q remove -y java-17-openjdk-devel maven
# 输出节选(实测尾部,Removed 列表其余条目已折叠)
Removed:
  sisu-plexus-1:0.3.3-6.module_el8.0.0+39+6a9b6e22.noarch
  slf4j-1.7.25-4.module_el8.0.0+39+6a9b6e22.noarch
  ttmkfdir-3.0.9-54.el8.x86_64
  tzdata-java-2021e-1.el8.noarch
  which-2.21-16.el8.x86_64
  xorg-x11-font-utils-1:7.5-41.el8.x86_64
  xorg-x11-fonts-Type1-7.5-19.el8.noarch

同时删除 5.2 节写入的 profile 片段:

rm -f /etc/profile.d/java17.sh

十三、参考链接

  1. Apache Whisker 官网(含 In 5 Minutes 与元数据参考):https://creadur.apache.org/whisker/
  2. Apache 快照仓库 whisker 目录:https://repository.apache.org/content/repositories/snapshots/org/apache/creadur/whisker/
  3. 源码仓库(含 apache-whisker-0.1 标签):https://github.com/apache/creadur-whisker
  4. 命令行模块官方说明:https://creadur.apache.org/whisker/apache-whisker-cli/index.html
  5. Maven 插件 generate 目标参数:https://creadur.apache.org/whisker/apache-whisker-maven-plugin/generate-mojo.html
  6. 阿里云 CentOS Vault 镜像:https://mirrors.aliyun.com/centos-vault/
  7. Apache Creadur 项目主页:https://creadur.apache.org/