我目前正在尝试使用不同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来说,这是一个根本没有(但是?)的用例吗?或者是否有一些技巧可以使其发挥作用?
答案 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
属性的等价物,但大部分工具链问题都已解决。