在Bazel中集成aspectj-maven-plugin受阻,寻求解决方案
解决Bazel集成AspectJ(含AWS Lambda PowerTools切面)的方案
核心思路
Bazel无官方AspectJ插件,需通过自定义规则扩展Java编译流程,实现编译时切面织入,替代Maven中aspectj-maven-plugin的功能。
具体步骤
1. 配置依赖
在WORKSPACE文件中添加AspectJ工具包与AWS Lambda PowerTools依赖:
maven_install( artifacts = [ "org.aspectj:aspectjrt:1.9.20.1", "org.aspectj:aspectjtools:1.9.20.1", "software.amazon.lambda:powertools-logging:1.14.0", "software.amazon.lambda:powertools-tracing:1.14.0", "software.amazon.lambda:powertools-metrics:1.14.0", ], repositories = ["https://repo1.maven.org/maven2/"], )
2. 自定义AspectJ编译规则
创建aspectj.bzl文件,实现调用AspectJ编译器的自定义规则:
def _aspectj_compile_impl(ctx): # 获取AspectJ工具与运行时依赖 aspectjtools = ctx.attr._aspectjtools[JavaInfo].transitive_runtime_jars aspectjrt = ctx.attr._aspectjrt[JavaInfo].transitive_runtime_jars # 收集源文件与切面资源 srcs = depset(transitive = [src.files for src in ctx.attr.srcs]) aspects = depset(transitive = [aspect.files for aspect in ctx.attr.aspects]) # 声明编译输出目录 output_dir = ctx.actions.declare_directory(ctx.label.name + "_classes") # 构建ajc编译参数 args = ctx.actions.args() args.add("-source", "1.8") args.add("-target", "1.8") args.add("-d", output_dir.path) args.add("-classpath", ctx.configuration.host_path_separator.join( [jar.path for jar in aspectjtools.to_list() + aspectjrt.to_list()] + [dep[JavaInfo].compilation_classpath for dep in ctx.attr.deps] )) args.add_all(srcs) args.add_all(aspects) # 执行编译动作 ctx.actions.run( inputs = depset(transitive = [srcs, aspects, aspectjtools, aspectjrt] + [dep[JavaInfo].compilation_classpath for dep in ctx.attr.deps]), outputs = [output_dir], executable = ctx.executable._ajc, arguments = [args], ) # 返回编译结果供后续规则使用 return [JavaInfo( output_directory = output_dir, compile_jars = depset([output_dir]), runtime_jars = depset(transitive = [aspectjrt] + [dep[JavaInfo].runtime_jars for dep in ctx.attr.deps]), )] aspectj_compile = rule( implementation = _aspectj_compile_impl, attrs = { "srcs": attr.label_list(allow_files = [".java"]), "aspects": attr.label_list(allow_files = [".class", ".jar"]), "deps": attr.label_list(providers = [JavaInfo]), "_aspectjtools": attr.label(default = "@maven//:org_aspectj_aspectjtools", providers = [JavaInfo]), "_aspectjrt": attr.label(default = "@maven//:org_aspectj_aspectjrt", providers = [JavaInfo]), "_ajc": attr.label(default = "@maven//:org_aspectj_aspectjtools/bin/ajc", executable = True, cfg = "exec"), }, provides = [JavaInfo], )
3. 在BUILD文件中应用规则
假设Lambda代码位于src/main/java/com/example/,配置编译与打包规则:
load("//:aspectj.bzl", "aspectj_compile") aspectj_compile( name = "lambda_aspect_compiled", srcs = glob(["src/main/java/com/example/**/*.java"]), aspects = [ "@maven//:software_amazon_lambda_powertools_logging", "@maven//:software_amazon_lambda_powertools_tracing", "@maven//:software_amazon_lambda_powertools_metrics", ], deps = [ "@maven//:com_amazonaws_lambda_java_core", # 添加其他业务依赖 ], ) # 打包为可执行Lambda JAR java_binary( name = "lambda_function", main_class = "com.example.LambdaHandler", runtime_deps = [":lambda_aspect_compiled"], )
4. 关键注意事项
- 确保AspectJ版本与AWS Lambda PowerTools兼容,推荐使用1.9.x系列
- 编译参数
-source和-target保持与Maven配置一致的1.8版本 - 若切面包含自定义注解,需确保注解类在编译类路径中
- 可通过
bazel run :lambda_function直接验证切面是否生效
内容的提问来源于stack exchange,提问作者user21528361
相关产品推荐
相关产品推荐

