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

时间:2018-04-08 21:21:18

标签: java bazel

我目前正在尝试使用不同Java语言级别的项目构建Bazel 0.11.1工作区。实际的应用程序使用的是Java 7,但是对于一些不会发布的代码,我想解决一个更新的Java版本,以便能够使用新的语言功能。

我可以在--javacopt中使用.bazelrc,设置-source 1.7 -target 1.7并使用javacopts属性覆盖项目级别的默认值,从而在某种程度上解决此问题,但这是在使用更新的Java版本进行编译时,不足以确保正确的Java 7兼容性。为此,我真的需要针对Java 7类路径编译Java 7项目。

使用自定义bootclasspath的唯一方法似乎是通过java_toolchain。有用。但我找不到一种方法可以为不同的项目使用不同的bootclasspath,因为工具链会影响所有项目,而javacopts不能在项目级别覆盖。

对于Bazel来说,这是一个根本没有(但是?)的用例吗?或者是否有一些技巧可以使其发挥作用?

1 个答案:

答案 0 :(得分:0)

事实证明有一种方法:编写执行编译的自定义规则。

java_common模块为编译器提供了一个接口。

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 = ["..."], )

java_common.compile

不幸的是,我还不是100%。 data似乎没有java_library res = comb_table[, .(list(in_table[, uniqueN(POL), by = c(names(.SD)[.SD==1])])), by = tab] # tab V1 #1: Table1 <data.table> #2: Table2 <data.table> #3: Table3 <data.table> res$V1 #[[1]] # Var1 Var2 Var3 Var4 Var5 Var6 Var7 V1 #1: 1 11 1 GRD 30 110 09/30 1 #2: 1 88 13 GRD 5260 300 11/15 1 #3: 1 88 13 GRD 5280 300 11/15 1 #4: 1 88 13 GRD 30 110 09/30 1 # #[[2]] # Var2 Var3 Var4 Var5 Var6 Var7 V1 #1: 11 1 GRD 30 110 09/30 1 #2: 88 13 GRD 5260 300 11/15 1 #3: 88 13 GRD 5280 300 11/15 1 #4: 88 13 GRD 30 110 09/30 1 # #[[3]] # Var1 Var3 Var4 Var5 Var6 Var7 V1 #1: 1 1 GRD 30 110 09/30 1 #2: 1 13 GRD 5260 300 11/15 1 #3: 1 13 GRD 5280 300 11/15 1 #4: 1 13 GRD 30 110 09/30 1 属性的等价物,但大部分工具链问题都已解决。