CentOS 8 安装 Apache CycloneDX Ant Library 指南
在 CentOS 8 上从零安装 Apache CycloneDX Ant Library 0.2,覆盖 EOL 后阿里云归档源修复、JDK 17 与 Maven 的 JAVA_HOME 绑定、JDK 8 下 SHA3-256 报错实测排障、SBOM 生成验证与卸载清理,命令回显均实测通过。
CentOS 8 安装 Apache CycloneDX Ant Library 指南
目标:在 CentOS 8 上从零搭建 Apache CycloneDX Ant Library 0.2 的使用环境(JDK 17 + Ant + 依赖 jar),并跑通一次真实的 CycloneDX SBOM 生成;本文全部命令与回显均已在 CentOS 8 实测通过。
CentOS 8 已于 2021 年底停止维护(EOL),官方源 mirror.centos.org 与 vault.centos.org 均不再可靠,因此本文的第一道工序是把软件源切到阿里云的 CentOS 归档(mirrors.aliyun.com/centos-vault/)。之后的工序与常规安装一致:dnf 安装 JDK 17、Ant、Maven → 用 Maven 坐标拉齐 ant-cyclonedx 0.2 与全部依赖 → 在 build.xml 里装配 antlib → 跑通 SBOM 生成。CentOS 8 有两个实测踩坑点会在本文重点展开:其一,el8 的 Maven 启动脚本不跟随 alternatives,mvn 始终绑定 JDK 8,必须显式设置 JAVA_HOME;其二,JDK 8 下运行 antlib 报 SHA3-256 MessageDigest not available,这是 CycloneDX Core(Java)运行期强制要求 Java 9+ 的直接体现。
一、环境信息
本节先固定可复现的基线环境,后续所有命令均在此环境执行。
- 操作系统:CentOS Linux 8.5.2111(EOL,使用阿里云归档源)
- 架构:x86_64
- JDK:java-17-openjdk 17.0.1.0.12-2.el8_5(dnf 包,含 devel 子包);系统默认 java 为 1.8.0_312(见第四章排坑)
- 构建工具:Apache Ant 1.10.5(dnf 包
ant)、Apache Maven 3.5.4(dnf 包maven) - 组件版本:ant-cyclonedx 0.2(Maven 坐标
org.apache.ant:ant-cyclonedx:0.2) - 核心依赖:cyclonedx-core-java 13.2.0、packageurl-java 1.5.0、Jackson 2.22.2、networknt json-schema-validator 2.0.4
- Antlib 安装目录:
/opt/cyclonedx-antlib/lib - 验证用工程目录:
/root/hello-app
系统确认(实时回显):
cat /etc/os-release | head -2
NAME="CentOS Linux"
VERSION="8"
uname -m
x86_64
💡 说明:与 Ubuntu 等常驻型软件不同,CycloneDX Antlib 是 Ant 任务库,「安装完成」以用 Ant 跑通一次
componentbom任务、产出合法 SBOM 文件为判定标准,不存在端口监听或守护进程。
二、前置条件
本节说明安装前必须满足的条件。CentOS 8 EOL 后,一切 dnf 操作都依赖可用的归档源,这是本文特有的前置项。
- 具有 root 权限的 CentOS 8 系统(8.5.2111 与归档源对齐,其他 8.x 小版本需将源地址中的版本号一并替换)。
- 可访问阿里云归档源
mirrors.aliyun.com(dnf 拉取索引与安装包)。 - 可访问 Maven 中央仓库
repo1.maven.org(拉取 antlib 与依赖 jar)。 - 至少 2 GB 可用磁盘空间(JDK + Ant + Maven + 依赖 jar 合计约 500 MB)。
- 运行期 JDK 要求 Java 9 及以上:官方手册明确 CycloneDX Core(Java)生成哈希需要 SHA3 支持;本文实测 JDK 1.8.0_312 下任务报
SHA3-256 MessageDigest not available(完整回显见第九章 FAQ Q2)。
网络连通性确认(实时回显):
curl -sI --max-time 20 https://mirrors.aliyun.com/centos-vault/8.5.2111/BaseOS/x86_64/os/ | head -1
HTTP/1.1 200 OK
curl -sI --max-time 20 https://repo1.maven.org/maven2/org/apache/ant/ant-cyclonedx/ | head -1
HTTP/1.1 200 OK
三、版本选型说明
本节给出 el8 各组件的版本事实与选型依据。ant-cyclonedx 的版本谱系以 Maven 中央仓库元数据为准,实测查询如下:
curl -s --max-time 30 https://repo1.maven.org/maven2/org/apache/ant/ant-cyclonedx/maven-metadata.xml | grep -E "latest|release|version>|lastUpdated"
<latest>0.2</latest>
<release>0.2</release>
<version>0.1</version>
<version>0.2</version>
<lastUpdated>20260925153836</lastUpdated>
| 组件 | el8 归档源提供版本 | 说明 |
|---|---|---|
| java-17-openjdk / devel | 17.0.1.0.12-2.el8_5 | 8.5.2111 归档才有 17 系列,运行必需 |
| ant | 1.10.5-1.module_el8.0.0 | 实测与 ant-cyclonedx 0.2 兼容 |
| maven | 3.5.4-5.module_el8.0.0 | 实测 dependency:copy-dependencies 可用 |
选型结论:ant-cyclonedx 采用 0.2(当前 latest 与唯一 release,2026-09-25 更新,默认输出 CycloneDX 1.7 规范;0.1 为早期版本不选);JDK 选 17(运行底线是 Java 9+,el8 归档源里 17.0.1 可用且带 devel 提供编译器);Ant 与 Maven 直接用归档源自带版本,实测均满足要求。
⚠️ 注意:官方手册建议 Ant 1.10.18+,实测 ant 1.10.5 也能跑通 0.2 的全部核心任务;若遇到异常行为,可另行下载 1.10.18 二进制包部署(本专栏 Ubuntu 指南第四章有完整流程,路径规则相同)。
四、修复 EOL 软件源并安装基础组件
本节先解决 CentOS 8 EOL 的源失效问题,再安装 JDK 17、Ant 与 Maven,并处理 el8 特有的 JAVA_HOME 绑定问题。
4.1 切换到阿里云归档源
el8 默认源指向已下线的 mirror.centos.org,直接 dnf makecache 会批量报 404/403。备份原源文件并写入归档源:
mkdir -p /etc/yum.repos.d/bak
mv /etc/yum.repos.d/CentOS-Linux-*.repo /etc/yum.repos.d/bak/
/etc/yum.repos.d/CentOS-Vault.repo(完整内容):
[vault-baseos]
name=CentOS Vault 8.5.2111 - BaseOS
baseurl=https://mirrors.aliyun.com/centos-vault/8.5.2111/BaseOS/x86_64/os/
gpgcheck=0
enabled=1
[vault-appstream]
name=CentOS Vault 8.5.2111 - AppStream
baseurl=https://mirrors.aliyun.com/centos-vault/8.5.2111/AppStream/x86_64/os/
gpgcheck=0
enabled=1
[vault-extras]
name=CentOS Vault 8.5.2111 - Extras
baseurl=https://mirrors.aliyun.com/centos-vault/8.5.2111/extras/x86_64/os/
gpgcheck=0
enabled=1
逐项说明关键配置:
baseurl固定指向 8.5.2111 归档快照,BaseOS 与 AppStream 分别承载系统包与开发工具链(ant、maven、java-17 都在 AppStream)。gpgcheck=0:归档快照用于已停更系统,按需可改为 1 并配置归档密钥。- 其他 8.x 小版本的系统,把 URL 中的
8.5.2111替换为对应快照号即可。
刷新缓存并确认(实时回显):
dnf makecache -q && dnf repolist
repo id repo name
vault-appstream CentOS Vault 8.5.2111 - AppStream
vault-baseos CentOS Vault 8.5.2111 - BaseOS
vault-extras CentOS Vault 8.5.2111 - Extras
4.2 安装 JDK 17、Ant 与 Maven
dnf install -y java-17-openjdk-devel ant maven
Dependencies resolved.
================================================================================================================================================
Package Arch Version Repository Size
================================================================================================================================================
Installing:
ant noarch 1:1.10.5-1.module_el8.0.0+47+197dca37 vault-appstream 5.1 M
java-17-openjdk-devel x86_64 1:17.0.1.0.12-2.el8_5 vault-appstream 8.9 M
maven noarch 1:3.5.4-5.module_el8.0.0+39+6a9b6e22 vault-appstream 9.0 M
Installing dependencies:
java-17-openjdk-headless x86_64 1:17.0.1.0.12-2.el8_5 vault-appstream 39 M
Transaction Summary
================================================================================================================================================
Install 4 Packages
Installing : java-17-openjdk-headless-1:17.0.1.0.12-2.el8_5.x86_64 1/4
Installing : java-17-openjdk-devel-1:17.0.1.0.12-2.el8_5.x86_64 2/4
Installing : maven-1:3.5.4-5.module_el8.0.0+39+6a9b6e22.noarch 3/4
Installing : ant-1:1.10.5-1.module_el8.0.0+47+197dca37.noarch 4/4
Verifying : java-17-openjdk-headless-1:17.0.1.0.12-2.el8_5.x86_64 1/4
Verifying : java-17-openjdk-devel-1:17.0.1.0.12-2.el8_5.x86_64 2/4
Verifying : maven-1:3.5.4-5.module_el8.0.0+39+6a9b6e22.noarch 3/4
Verifying : ant-1:1.10.5-1.module_el8.0.0+47+197dca37.noarch 4/4
Complete!
⚠️ 注意:只装
java-17-openjdk会得到无javac的纯 JRE,Ant 的javac编译任务会找不到编译器;本文实测直接安装java-17-openjdk-devel(自动连带 headless JRE),一步到位。
rpm -q java-17-openjdk java-17-openjdk-devel ant maven
java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64
java-17-openjdk-devel-17.0.1.0.12-2.el8_5.x86_64
ant-1.10.5-1.module_el8.0.0+47+197dca37.noarch
maven-3.5.4-5.module_el8.0.0+39+6a9b6e22.noarch
4.3 实测排坑:el8 的 Maven 不读 alternatives
装完直接看版本,会发现 JDK 17 装了但一切仍在跑 1.8(实时回显):
java -version
openjdk version "1.8.0_312"
OpenJDK Runtime Environment (build 1.8.0_312-b07)
OpenJDK 64-Bit Server VM (build 25.312-b07, mixed mode)
mvn -version | head -3
Apache Maven 3.5.4 (Red Hat 3.5.4-5)
Maven home: /usr/share/maven
Java version: 1.8.0_312, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-2.el8_5.x86_64/jre
原因:el8 的 java、javac alternatives 仍停在 1.8(alternatives --list 实测可见 java auto /usr/lib/jvm/java-1.8.0-openjdk-.../jre/bin/java),而 el8 的 Maven 启动脚本只认 JAVA_HOME 环境变量、不读 alternatives。此时环境变量 JAVA_HOME 为空(实测 echo "JAVA_HOME=$JAVA_HOME" 输出 JAVA_HOME=)。
解法是显式导出 JAVA_HOME 指向 17,一次同时修正 ant 与 maven(本专栏实测验证有效):
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
$JAVA_HOME/bin/java -version
openjdk version "17.0.1" 2021-10-19 LTS
mvn -version | head -3
Apache Maven 3.5.4 (Red Hat 3.5.4-5)
Maven home: /usr/share/maven
Java version: 17.0.1, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64
验证点:mvn -version 的 Java version 行变为 17.0.1。长期生效把 export JAVA_HOME=/usr/lib/jvm/java-17-openjdk 写入 /root/.bashrc;也可用 alternatives --set java /usr/lib/jvm/java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64/bin/java 改全局默认,但 Maven 仍需 JAVA_HOME,故本文只推荐后者。
五、Maven 依赖安装 antlib
本节用 Maven 坐标把 ant-cyclonedx 0.2 及全部依赖拉到统一目录。ant-cyclonedx 0.2 的 POM 把 Ant 本体、ant-launcher、ivy 声明为 provided 范围,直接 copy-dependencies 会漏掉它们,因此先写显式声明四个依赖的 pom。
mkdir -p /opt/cyclonedx-antlib/fetch /opt/cyclonedx-antlib/lib
/opt/cyclonedx-antlib/fetch/pom.xml(完整内容):
<?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>cdx-antlib-fetch</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant-cyclonedx</artifactId>
<version>0.2</version>
</dependency>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
<version>1.10.18</version>
</dependency>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant-launcher</artifactId>
<version>1.10.18</version>
</dependency>
<dependency>
<groupId>org.apache.ivy</groupId>
<artifactId>ivy</artifactId>
<version>2.6.0</version>
</dependency>
</dependencies>
</project>
执行拉取(JAVA_HOME 必须已指向 17,否则 Maven 跑在 1.8 上):
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
cd /opt/cyclonedx-antlib/fetch && mvn -q -B dependency:copy-dependencies -DoutputDirectory=/opt/cyclonedx-antlib/lib
ls /opt/cyclonedx-antlib/lib
ant-1.10.18.jar
ant-cyclonedx-0.2.jar
ant-launcher-1.10.18.jar
cyclonedx-core-java-13.2.0.jar
itu-1.14.0.jar
ivy-2.6.0.jar
jackson-annotations-2.22.jar
jackson-core-2.22.2.jar
jackson-databind-2.22.2.jar
jackson-dataformat-xml-2.22.2.jar
jackson-dataformat-yaml-2.18.4.jar
jackson-dataformat-yaml-2.22.2.jar
json-schema-validator-2.0.4.jar
packageurl-java-1.5.0.jar
slf4j-api-2.0.17.jar
snakeyaml-2.3.jar
stax2-api-4.3.0.jar
woodstox-core-7.2.0.jar
ls /opt/cyclonedx-antlib/lib | wc -l
18
共 18 个 jar(Maven 3.5.4 的仲裁策略保留了两个版本的 jackson-dataformat-yaml,属正常现象,taskdef 的 fileset classpath 会全部加载)。核心角色:ant-cyclonedx-0.2.jar 是任务与类型定义;cyclonedx-core-java-13.2.0.jar 负责 SBOM 模型与序列化;json-schema-validator-2.0.4.jar 是 cyclonedx-core-java 的必需依赖(官方 bin 包曾漏打它导致运行报错,参考本专栏 Ubuntu 指南第五章排坑记录)。
六、创建验证工程并跑通 SBOM 生成
本节建一个最小 Ant 工程并完成端到端验证。
mkdir -p /root/hello-app/src/com/example/hello
/root/hello-app/src/com/example/hello/Hello.java(完整内容):
package com.example.hello;
public class Hello {
public static void main(String[] args) {
System.out.println("Hello, CycloneDX!");
}
}
/root/hello-app/build.xml(完整内容,直接照抄):
<?xml version="1.0" encoding="UTF-8"?>
<project name="hello-app" default="sbom" xmlns:cdx="antlib:org.apache.ant.cyclonedx">
<target name="compile">
<mkdir dir="/root/hello-app/build/classes"/>
<javac srcdir="/root/hello-app/src" destdir="/root/hello-app/build/classes" includeantruntime="false"/>
</target>
<target name="jar" depends="compile">
<mkdir dir="/root/hello-app/dist"/>
<jar destfile="/root/hello-app/dist/hello-app-1.0.0.jar" basedir="/root/hello-app/build/classes"/>
</target>
<target name="sbom" depends="jar">
<taskdef uri="antlib:org.apache.ant.cyclonedx"
resource="org/apache/ant/cyclonedx/antlib.xml">
<classpath>
<fileset dir="/opt/cyclonedx-antlib/lib" includes="*.jar"/>
</classpath>
</taskdef>
<mkdir dir="/root/hello-app/bom"/>
<cdx:componentbom format="all"
bomName="hello-app-1.0.0"
outputDirectory="/root/hello-app/bom">
<cdx:component type="application"
name="hello-app"
group="com.example"
version="1.0.0"
purl="pkg:maven/com.example/hello-app@1.0.0"
description="Demo application for CycloneDX Antlib">
<file file="/root/hello-app/dist/hello-app-1.0.0.jar"/>
<cdx:license licenseId="Apache-2.0"/>
<cdx:tag>release</cdx:tag>
</cdx:component>
</cdx:componentbom>
</target>
</project>
逐项说明关键配置:
xmlns:cdx="antlib:org.apache.ant.cyclonedx":antlib 命名空间,任务与类型均以cdx:前缀调用。taskdef的 classpath 用 fileset 收全/opt/cyclonedx-antlib/lib下全部 jar;只给ant-cyclonedx-0.2.jar一个 jar 会因依赖缺失报错(实测回显见 FAQ Q4)。componentbom的format="all"同时输出 JSON 与 XML;bomName决定文件基名;outputDirectory指向已存在的目录(任务不自动建目录,靠前面的<mkdir>)。cdx:component是 SBOM 主组件,<file>指向构建产物,任务自动计算 MD5/SHA-1/SHA-256/SHA-512/SHA3 等哈希。
以 JDK 17 运行(实时回显):
cd /root/hello-app && export JAVA_HOME=/usr/lib/jvm/java-17-openjdk && ant
Buildfile: /root/hello-app/build.xml
compile:
[mkdir] Created dir: /root/hello-app/build/classes
[javac] Compiling 1 source file to /root/hello-app/build/classes
jar:
[mkdir] Created dir: /root/hello-app/dist
[jar] Building jar: /root/hello-app/dist/hello-app-1.0.0.jar
sbom:
[mkdir] Created dir: /root/hello-app/bom
[cdx:componentbom] creating CycloneDX SBOM /root/hello-app/bom/hello-app-1.0.0.xml
[cdx:componentbom] creating CycloneDX SBOM /root/hello-app/bom/hello-app-1.0.0.json
BUILD SUCCESSFUL
Total time: 1 second
head -5 /root/hello-app/bom/hello-app-1.0.0.json
{
"bomFormat" : "CycloneDX",
"specVersion" : "1.7",
"serialNumber" : "urn:uuid:c4b96129-d312-4751-9039-1575fd3e4184",
"version" : 1,
验证点:BUILD SUCCESSFUL 且 JSON/XML 双文件落盘,specVersion 为 1.7(0.2 默认值)。哈希一致性抽查:
grep -A4 '"hashes"' /root/hello-app/bom/hello-app-1.0.0.json | tail -3
md5sum /root/hello-app/dist/hello-app-1.0.0.jar
{
"alg" : "MD5",
"content" : "5d04ba7d50730962384bd2bcbb48e81c"
},
5d04ba7d50730962384bd2bcbb48e81c /root/hello-app/dist/hello-app-1.0.0.jar
两个 MD5 一致,SBOM 内容可信。更多任务参数与组件配置见本专栏《Apache CycloneDX Ant Library 0.2 常用 API 与任务详解》。
💡 技术拓展:SBOM 输出格式有两大主流标准,选型对比如下——
维度 CycloneDX(本文所用) SPDX 出身 OWASP 主导,面向软件供应链安全 Linux 基金会 SPDX 项目,面向许可证合规 原生格式 JSON、XML、Protobuf tag:value 文本、JSON、RDF、XLSX 漏洞联动 内置 vulnerability 元素,配合 VEX 生态 需外部关联 工具生态 大量 CI/CD 原生插件(含本文 antlib) 合规扫描器支持度高 典型场景 发布流水线、漏洞可达性分析 开源合规审计 本文采用 CycloneDX 格式:antlib 原生输出 CycloneDX 1.7,且与 purl、哈希、依赖图等安全要素深度绑定;如需 SPDX 交付物,可用第三方转换工具二次转换。
七、基础配置
本节说明 antlib 在 CentOS 8 上真正需要配置的项。它是任务库而非服务,全部行为通过 Ant 装配方式与 JVM 环境变量控制。
7.1 antlib 的两种装配方式
其一,build.xml 内 taskdef + classpath(本文第六章用法),随工程分发、不污染全局;其二,运行期 ant -lib /opt/cyclonedx-antlib/lib 全局注入,此时 taskdef 可省略 classpath。两种取其一即可。
7.2 JVM 堆参数
位置与修改方法:运行 ant 前设置环境变量 ANT_OPTS,Ant 启动脚本会把它透传给 JVM。本文实测限制为 256 MB:
cd /root/hello-app && export JAVA_HOME=/usr/lib/jvm/java-17-openjdk && ANT_OPTS='-Xms256m -Xmx256m' ant
[cdx:componentbom] creating CycloneDX SBOM /root/hello-app/bom/hello-app-1.0.0.xml
[cdx:componentbom] creating CycloneDX SBOM /root/hello-app/bom/hello-app-1.0.0.json
BUILD SUCCESSFUL
验证点:256 MB 堆下任务正常完成。需要长期生效可把 export ANT_OPTS='-Xms256m -Xmx256m' 连同 JAVA_HOME 一起写入 /root/.bashrc;组件规模大时临时调大到 -Xmx512m。
7.3 JAVA_HOME 的会话级与持久化
CentOS 8 上这是必配项而非可选项(第四章 4.3 节实测),ant、mvn 都读取它。会话级用 export;持久化写入 /root/.bashrc:
echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk' >> /root/.bashrc && source /root/.bashrc
echo "JAVA_HOME=$JAVA_HOME"
JAVA_HOME=/usr/lib/jvm/java-17-openjdk
八、多版本管理
多版本共存靠「隔离目录 + taskdef 指向不同 classpath」实现,无需切换全局软链。
ant-cyclonedx 的 0.1 与 0.2 在 Maven 本地仓库并列存放(实时回显):
ls -1 /root/.m2/repository/org/apache/ant/ant-cyclonedx/
0.1
0.2
要点:切换版本只改 fetch pom 里的 <version>,重新 copy-dependencies 到不同输出目录(如 /opt/cyclonedx-antlib/lib-0.1),再让对应 build.xml 的 taskdef 指向它;多套版本目录彼此独立,可并行服务不同工程。
九、常见问题(FAQ)
Q1:dnf makecache 报 Failed to download metadata for repo?
el8 默认源已随 EOL 下线。按第四章 4.1 节把 /etc/yum.repos.d/ 切换到阿里云 8.5.2111 归档源;注意 dnf clean all 后再 makecache,避免旧元数据干扰。
Q2:Ant 任务报 java.security.NoSuchAlgorithmException: SHA3-256 MessageDigest not available?
运行 JDK 低于 9 导致——antlib 计算 SHA3 哈希依赖 JDK 9+ 算法。el8 系统默认 java 是 1.8(第四章 4.3 节),实测完整回显:
Caused by: java.security.NoSuchAlgorithmException: SHA3-256 MessageDigest not available
at sun.security.jca.GetInstance.getInstance(GetInstance.java:159)
at java.security.Security.getImpl(Security.java:725)
at java.security.MessageDigest.getInstance(MessageDigest.java:170)
at org.cyclonedx.util.BomUtils.getDigestForAlgorithm(BomUtils.java:142)
... 27 more
解法:export JAVA_HOME=/usr/lib/jvm/java-17-openjdk 后重跑(本文第四章验证通过)。若为长期修复,按 7.3 节写入 /root/.bashrc。
Q3:mvn -version 显示 Java 1.8.0_312,copy-dependencies 后 jar 缺失或行为异常?
el8 Maven 3.5.4 的启动脚本不读 alternatives、只认 JAVA_HOME(第四章 4.3 节实测绑定 1.8.0_312)。执行第五章的 export JAVA_HOME=/usr/lib/jvm/java-17-openjdk 后重新拉取,并用 mvn -version 确认 Java version 已变 17.0.1。
Q4:taskdef 后报 A class needed by class org.apache.ant.cyclonedx.ComponentBomTask cannot be found: org/cyclonedx/exception/GeneratorException?
taskdef 的 classpath 只给了 ant-cyclonedx-0.2.jar 一个 jar。把 classpath 改为 fileset 收全 /opt/cyclonedx-antlib/lib 的全部 jar(本文第六章写法)。另外 Ant 属性 classpath 的路径分隔符在 Linux 上是冒号,写成 Windows 分号会导致整个 classpath 解析失败。
Q5:报 only one nested component element is permitted 或 outputDirectory must point to a directory?
前者是 componentbom 下写了两个 cdx:component——主组件只能一个,其余组件用 cdx:additionalComponent(顶层附加组件)或主组件内的嵌套 cdx:component(子组件);后者是 outputDirectory 指向不存在的路径——先 <mkdir> 再运行。两者均在本专栏实测复现过,详细参数语义见《Apache CycloneDX Ant Library 0.2 常用 API 与任务详解》。
十、卸载与清理
antlib 本身不产生系统级安装,卸载即移除目录与依赖缓存。
移除验证工程与 antlib 安装目录:
rm -rf /root/hello-app /opt/cyclonedx-antlib
ls /opt/cyclonedx-antlib 2>&1
ls: cannot access '/opt/cyclonedx-antlib': No such file or directory
移除 Maven 本地仓库中的相关缓存(影响所有工程,慎用):
rm -rf /root/.m2/repository/org/apache/ant/ant-cyclonedx /root/.m2/repository/org/cyclonedx
卸载 JDK、Ant 与 Maven(仅当不再需要)。先 dnf remove -y 会连带删除依赖包,执行前可用 dnf history 回看本次安装事务编号 dnf history info <编号> 确认范围。实测执行:
dnf remove -y java-17-openjdk-devel java-17-openjdk ant maven 2>&1 | tail -2
完毕!
rpm -q java-17-openjdk ant maven 2>&1
未安装软件包 java-17-openjdk
未安装软件包 ant
未安装软件包 maven
⚠️ 注意:若
/root/.bashrc中已按 7.3 节写入JAVA_HOME,卸载后请同步删除该行,避免残留无效路径。
十一、参考链接
- Apache CycloneDX Ant Library 官方主页:https://ant.apache.org/antlibs/cyclonedx/
- 官方手册(任务与类型):https://ant.apache.org/antlibs/cyclonedx/manual/
- Maven 中央仓库坐标:https://repo1.maven.org/maven2/org/apache/ant/ant-cyclonedx/
- 阿里云 CentOS 归档源:https://mirrors.aliyun.com/centos-vault/
- CycloneDX 规范:https://cyclonedx.org/specs/
- Apache Ant 官方下载:https://downloads.apache.org/ant/binaries/