首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Bazel工作区中使用不同的引导路径?

如何在Bazel工作区中使用不同的引导路径?
EN

Stack Overflow用户
提问于 2018-04-08 21:21:18
回答 1查看 215关注 0票数 0

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

我可以在一定程度上通过在--javacopt中使用.bazelrc、设置-source 1.7 -target 1.7和用javacopts属性覆盖项目级别上的缺省值来解决这个问题,但这不足以确保使用更新的javacopts版本进行编译时具有适当的Java7兼容性。为此,我还需要针对Java 7类路径编译Java 7项目。

使用自定义引导路径的唯一方法似乎是通过java_toolchain。它起作用了。但是,我无法找到一种方法来为不同的项目使用不同的引导路径,因为工具链影响到所有项目,而且与javacopts不同,不能在项目级别上重写。

这是一种使用程序,根本就不是(目前为止)吗?可能和巴泽尔在一起吗?还是有什么诡计让它起作用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-09 20:17:51

结果发现有一种方法:编写执行编译的自定义规则。

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

library.bzl

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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属性没有等效之处,但在大多数情况下,工具链问题已经得到解决。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49722912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档