
本文介绍如何使用 CMake 原生机制(不依赖 Maven)为 Java 项目构建 source.jar,通过 add_custom_command 与 add_custom_target 组合实现源码归档自动化。
本文介绍如何使用 cmake 原生机制(不依赖 maven)为 java 项目构建 source.jar,通过 `add_custom_command` 与 `add_custom_target` 组合实现源码归档自动化。
CMake 官方 UseJava 模块(如 add_jar)专注于编译和打包二进制 JAR,不提供内置的 source.jar 生成支持。但得益于 CMake 强大的自定义构建能力,我们完全可以通过标准命令手动构造源码归档包。
核心思路是:利用 add_custom_command 定义一个生成 sources.jar 的构建规则(指定输入依赖、执行命令及输出文件),再用 add_custom_target 将其注册为可构建目标(例如 make SourcesJar),并可选地设为 ALL 以随默认构建自动执行。
以下是一个生产就绪的示例配置(建议放在 CMakeLists.txt 中 Java 项目主构建逻辑之后):
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
# 假设源码位于 src/main/java/(按实际路径调整)
set(SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src/main/java")
# 确保源码目录存在且非空(可选健壮性检查)
if(NOT EXISTS "${SOURCE_DIR}")
message(FATAL_ERROR "Source directory ${SOURCE_DIR} not found")
endif()
# 生成 sources.jar:递归打包所有 .java 文件(推荐比打包整个目录更精准)
file(GLOB_RECURSE JAVA_SOURCES "${SOURCE_DIR}/*.java")
if(NOT JAVA_SOURCES)
message(WARNING "No .java files found in ${SOURCE_DIR}; sources.jar will be empty")
endif()
add_custom_command(
OUTPUT "${CMAKE_BINARY_DIR}/sources.jar"
COMMAND "${CMAKE_JAR}" -cf "${CMAKE_BINARY_DIR}/sources.jar" -C "${SOURCE_DIR}" .
DEPENDS ${JAVA_SOURCES}
COMMENT "Creating sources.jar from ${SOURCE_DIR}"
VERBATIM
)
add_custom_target(SourcesJar
ALL # 可移除此行,仅需显式调用 make SourcesJar
DEPENDS "${CMAKE_BINARY_DIR}/sources.jar"
)✅ 关键说明与最佳实践:
- 使用
${CMAKE_JAR}而非硬编码jar命令,确保跨平台兼容性(CMake 自动探测 JDK 的jar工具路径); -
-C "${SOURCE_DIR}" .表示切换到源目录后打包当前目录内容,避免在 JAR 中出现冗余路径前缀; -
DEPENDS ${JAVA_SOURCES}确保源码变更时自动触发重打包; - 输出路径设为
${CMAKE_BINARY_DIR}/sources.jar(而非当前目录),符合 CMake 构建隔离惯例; - 若不希望
sources.jar总是构建,移除ALL关键字,后续通过cmake --build . --target SourcesJar显式生成。
⚠️ 注意事项:
- 此方案要求系统已安装 JDK(含
jar工具)且 CMake 成功找到它(通常通过find_package(Java REQUIRED)或隐式探测); - 如项目含多模块或非标准源结构,请将
SOURCE_DIR和GLOB_RECURSE路径精确指向待归档的 Java 源码根目录; -
add_jar()创建的主 JAR 不会自动依赖SourcesJar,如需联动(例如发布时必须同时存在 binary.jar 和 sources.jar),需额外添加add_dependencies(your_main_jar_target SourcesJar)。
通过以上配置,你即可在纯 CMake 环境中稳定、可复现地生成符合 Maven Central 规范的 sources.jar,无缝对接 IDE 源码导航与下游依赖管理。

















