【问题标题】:Does anyone have references on how to port aspectj based maven module to bazel有没有人有关于如何将基于 aspectj 的 maven 模块移植到 bazel 的参考资料
【发布时间】:2019-07-01 23:27:55
【问题描述】:

目前我正在将一个基于 maven 的项目移植到 bazel 并寻找有关如何将 aspectj-maven-plugin 相关配置移植到 bazel 的文档

将 java 模块移植到 bazel,尝试将 jvmflags 添加到测试中

java_library(
    name="module-core",
    deps=[
        "@org_aspectj_aspectjrt//jar",
        "@org_aspectj_aspectjtools//jar",
        "@org_aspectj_aspectjweaver//jar",
        "@org_jetbrains_annotations//jar",
        "@org_springframework_spring_aop//jar",
        "@org_springframework_spring_aspects//jar",

    ]
)

类的编织没有发生

【问题讨论】:

    标签: maven bazel aspectj-maven-plugin


    【解决方案1】:
    def _aspectj_library_impl(ctx):
    class_jar = ctx.outputs.class_jar
    
    compile_time_jars_transitive = []
    runtime_jars_transitive = []
    exported_java_infos = []
    for dep in ctx.attr.deps:
        compile_time_jars_transitive += [dep[JavaInfo].transitive_compile_time_jars]
        runtime_jars_transitive += [dep[JavaInfo].transitive_runtime_jars]
        exported_java_infos.append(dep[JavaInfo])
    compile_time_jars = depset(
        transitive = compile_time_jars_transitive,
    )
    runtime_jars = depset(
        transitive = runtime_jars_transitive,
    )
    compile_time_jars_list = compile_time_jars.to_list()
    
    aspect_libs_jars_transitive = []
    for lib in ctx.attr.aspect_libs:
        aspect_libs_jars_transitive += [lib[JavaInfo].compile_jars]
    aspect_libs_jars = depset(
        transitive = aspect_libs_jars_transitive,
    )
    aspect_libs_jars_transitive = ["a"]
    
    # Cleaning build output directory
    build_output = class_jar.path + ".build_output"
    cmd = "set -e;rm -rf " + build_output + "\n"
    
    java_runtime = ctx.attr._jdk[java_common.JavaRuntimeInfo]
    java_path = "%s/bin/java" % java_runtime.java_home
    java_tools = "%s/lib/tools.jar" % java_runtime.java_home
    
    aspectj_tools_path = ctx.attr.aspectj_tools[JavaInfo].outputs.jars[0].class_jar.path
    cp = ctx.configuration.host_path_separator.join([
        java_tools,
        aspectj_tools_path,
    ])
    
    # Building ajc parameters
    ajc_main_class = "org.aspectj.tools.ajc.Main"
    ajc_params = [java_path, "-cp", cp, ctx.attr._xmx, ajc_main_class]
    
    if ctx.attr.ajc_opts:
        ajc_params.append(ctx.attr.ajc_opts)
    if compile_time_jars:
        ajc_params.append("-classpath")
        ajc_params.append(cmd_helper.join_paths(ctx.configuration.host_path_separator, compile_time_jars))
    
    ajc_params.append("-aspectpath")
    ajc_params.append(cmd_helper.join_paths(ctx.configuration.host_path_separator, aspect_libs_jars))
    ajc_params.append("-inpath")
    for javaoutput in ctx.attr.input_jar[JavaInfo].outputs.jars:
        ajc_params.append(javaoutput.class_jar.path)
    ajc_params.append("-outjar")
    ajc_params.append(class_jar.path)
    
    ajc = " ".join(ajc_params)
    cmd += ajc
    
    ctx.actions.run_shell(
        inputs = (compile_time_jars_list + ctx.files._jdk + ctx.files.input_jar),
        outputs = [class_jar],
        mnemonic = "JavacBootstrap",
        command = cmd,
        use_default_shell_env = True,
    )
    
    runfiles = ctx.runfiles(collect_data = True)
    compile_time_jars = depset(transitive = [compile_time_jars], direct = [class_jar])
    runtime_jars = depset(transitive = [runtime_jars], direct = [class_jar])
    
    return [
        DefaultInfo(
            files = depset([class_jar]),
            runfiles = runfiles,
        ),
        JavaInfo(
            output_jar = class_jar,
            compile_jar = class_jar,
            exports = exported_java_infos,
        ),
    ]
    
    aspectj_library = rule(
    _aspectj_library_impl,
    attrs = {
        "_jdk": attr.label(
            default = Label("@bazel_tools//tools/jdk:current_java_runtime"),
            providers = [java_common.JavaRuntimeInfo],
        ),
        "_xmx": attr.string(
            default = "-Xmx64M",
        ),
        "input_jar": attr.label(
            mandatory = True,
            allow_files = [".jar"],
        ),
        "aspectj_tools": attr.label(
            mandatory = True,
            allow_files = [".jar"],
        ),
        "ajc_opts": attr.string(
            mandatory = False,
            doc = "command options for ajc tool",
        ),
        "aspect_libs": attr.label_list(
            mandatory = True,
            allow_files = [".jar"],
        ),
        "deps": attr.label_list(
            allow_files = False,
            providers = [JavaInfo],
        ),
    },
    outputs = {
        "class_jar": "lib%{name}.jar",
    },
    fragments = ["java"],
    )
    

    【讨论】:

    • 欢迎来到 SO。尽管该链接可能会回答问题,但最好在此处添加综合详细信息。
    【解决方案2】:

    Bazel 不会自动应用 java 插件和注释处理器。这些必须在规则中适当地设置。只是将 jars 作为依赖项包含在内没有任何作用。不幸的是(在撰写本文时)没有 aspect_java_plugin 规则或类似的规则可用于将其拉入。您可以使用 genrule() 来调用将执行字节码编织的命令行,但是它不会自动发生。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多