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

Bazel中用生成Java文件创建Java库时JAR为空的问题排查

问题原因

你的自定义规则仅返回了包含Java源文件的目录对象,但java_library不会自动递归扫描目录内的.java文件作为编译源——它只会将目录视为普通文件,不会处理其中的内容,因此编译时没有实际的源文件参与,最终生成的JAR只有MANIFEST文件。

解决方法

有两种常见的修复方式:

方式一:修改自定义规则,返回目录内的源文件集合

调整规则实现,收集生成目录中的所有.java文件并通过DefaultInfo返回,让java_library能识别到具体的源文件:

def _generator_java_impl(ctx):
    tree = ctx.actions.declare_directory(ctx.attr.name + "_srcs")

    # 执行生成文件的动作
    ctx.actions.run(
        # 替换为你的实际生成命令,确保输出写入tree目录
        arguments = [..., tree.path],
        outputs = [tree],
        executable = ctx.executable.generator, # 假设你的生成器是可执行文件
    )

    # 扫描目录内的所有Java源文件并转换为File对象
    src_paths = tree.path.glob("**/*.java")
    src_files = [ctx.file(path) for path in src_paths]

    return [
        DefaultInfo(files = depset(src_files)),
        # 可选:返回JavaInfo,让规则可直接作为java_library的依赖
        JavaInfo(
            source_files = depset(src_files),
            deps = [],
        )
    ]

方式二:在BUILD文件中用filegroup包装生成的目录

通过filegroup的glob参数匹配目录内的Java文件,再传递给java_library:

generator_java(
    name = "generated_java",
    ...
)

filegroup(
    name = "generated_java_srcs",
    srcs = [":generated_java"],
    glob = ["**/*.java"],
)

java_library(
    name = "mylib",
    srcs = [":generated_java_srcs"],
)

两种方式都能让java_library获取到实际的Java源文件,从而正常编译并生成包含类的JAR包。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 15:07:13