[英]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_library
的data
屬性沒有等效項,但是在大多數情況下,工具鏈問題已解決。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.