簡體   English   中英

如何在Bazel工作空間中使用不同的bootclasspath?

[英]How to use different bootclasspaths in Bazel workspace?

我目前正在嘗試使用使用不同Java語言級別的項目構建Bazel 0.11.1工作區。 實際的應用程序使用Java 7,但是對於某些無法交付的代碼,我希望使用較新的Java版本才能使用新的語言功能。

我可以通過在.bazelrc使用--javacopt ,設置-source 1.7 -target 1.7並在項目級別使用javacopts屬性覆蓋默認值來在某種程度上解決此問題,但這不足以確保在使用最新的Java版本。 為此,我確實還需要針對Java 7類路徑編譯Java 7項目。

使用自定義java_toolchain的唯一方法似乎是通過java_toolchain 有用。 但是我找不到用於不同項目的不同javacopts方法,因為該工具鏈會影響所有項目,並且與javacopts不同,該工具鏈無法在項目級別覆蓋。

這是Bazel無法(還可以)使用的用例嗎? 還是有一些使它起作用的技巧?

事實證明,有一種方法:編寫執行編譯的自定義規則。

java_common模塊提供了到編譯器的接口。

library.bzl

def _impl(ctx):
    deps = []
    for dep in ctx.attr.deps:
        if java_common.provider in dep:
            deps.append(dep[java_common.provider])
    output_jar = ctx.new_file("lib{0}.jar".format(ctx.label.name))
    runtime = java_common.JavaRuntimeInfo
    compilation_provider = java_common.compile(
        ctx,
        source_jars = ctx.files.srcs_jars,
        source_files = ctx.files.srcs,
        output = output_jar,
        javac_opts = ctx.attr.javac_opts,
        deps = deps,
        strict_deps = ctx.attr.strict_deps,
        java_toolchain = ctx.attr.toolchain,
        host_javabase = ctx.attr._host_javabase,
        resources = ctx.files.resources,
        neverlink = ctx.attr.neverlink,
    )

    return struct(
        files = depset([output_jar]),
        providers = [compilation_provider],
    )

library = rule(
    implementation = _impl,
    attrs = {
        "srcs_jars": attr.label_list(allow_files=True),
        "srcs": attr.label_list(allow_files=True),
        "javac_opts": attr.string_list(default=[]),
        "deps": attr.label_list(),
        "strict_deps": attr.string(default="ERROR"),
        "toolchain": attr.label(default=Label("@bazel_tools//tools/jdk:toolchain")),
        "sourcepath": attr.label_list(),
        "resources": attr.label_list(),
        "neverlink": attr.bool(default=False),
        "_host_javabase": attr.label(default=Label("@local_jdk//:jdk")),
    },
    fragments = ["java"],
)

我現在可以使用此規則來設置不同的工具鏈進行編譯。

BUILD

load('//build/jdk:library.bzl', 'library')

library(
    name = "test",
    srcs = glob(["src/main/java/**/*.java"]),
#    data = glob(["src/main/resources/**"]),
    toolchain = "//build/jdk:jdk8",
    deps = ["..."],
)

不幸的是,我還不是100%。 java_common.compile似乎與java_librarydata屬性沒有等效項,但是在大多數情況下,工具鏈問題已解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM