You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake中检测Java编译失败并将错误输出到stdout的方法咨询

CMake Swagger代码生成环节错误检测与输出配置方案

核心问题分析

当前使用的CMake函数存在两个影响需求实现的写法:

  • java命令后追加的&> ${target_dir}/autogenerate.log语句,将标准输出、标准错误流的所有内容都重定向到了本地日志文件,因此构建控制台不会打印任何swagger生成过程的信息,包括错误
  • add_custom_target本身自带命令执行结果检测能力,只要COMMAND对应的进程返回非0退出码,就会标记目标执行失败、终止构建,这部分能力不需要额外开发,只是因为输出被重定向,无法直接看到失败原因

修改后的实现代码

function(generate_swagger_code spec_path lang package_name)
  set(target_dir ${CMAKE_CURRENT_BINARY_DIR}/swagger)
  get_filename_component(fname_noext ${spec_path} NAME_WE)
  add_custom_target(generate_swagger_${fname_noext} ALL
    COMMAND ${CMAKE_COMMAND} -E make_directory ${target_dir}
    COMMENT "Starting swagger autogeneration in ${target_dir}"
    COMMAND java
      -jar ${SWAGGER_CODEGEN_CLI} generate
      -i ${spec_path}
      -l ${lang}
      -DpackageName=${package_name}
      -o ${target_dir}
    VERBATIM
  )
endfunction(generate_swagger_code)

改动说明

  • 移除了输出重定向语句,java命令的所有运行日志、错误信息都会直接打印到构建控制台的标准输出流,不会写入本地日志文件
  • 保留VERBATIM参数确保命令参数转义正常,避免路径、特殊字符带来的解析错误
  • CMake会自动检测java命令的退出状态:如果swagger代码生成失败(比如Java编译报错、参数错误),构建流程会直接终止报错,所有错误信息可以直接在控制台查看

如果你需要同时保留本地日志文件又要控制台输出,可以将java命令替换为如下写法(仅支持Unix-like环境):

COMMAND bash -c "java -jar ${SWAGGER_CODEGEN_CLI} generate -i ${spec_path} -l ${lang} -DpackageName=${package_name} -o ${target_dir} 2>&1 | tee ${target_dir}/autogenerate.log"

内容的提问来源于stack exchange,提问作者subtleseeker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 05:45:03