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__
相关产品推荐
相关产品推荐

