java - 如何更改引导类路径?

标签 java bazel

在一个项目中,我使用运行 Oracle Java 8 的 Bazel 0.11.1 来生成与 Java 7 兼容的 .class 文件。虽然还有其他方法可以实现此目的,但我只是使用 --javacopt 将必要的源/目标选项添加到我的 .bazelrc 中。

这工作正常,但最好也更改 bootclasspath,以避免不必要的依赖项潜入。但是我如何使用 Bazel 实现这一点?

-bootclasspath添加到--javacopt似乎没有生效。所以看来我必须求助于自定义 java_toolchain,但我根本无法让它运行!

java_toolchain(
    name = "__jdk7",
    bootclasspath = ["@bazel_tools//tools/jdk:bootclasspath"],
    encoding = "UTF-8",
    extclasspath = ["@bazel_tools//tools/jdk:extclasspath"],
    genclass = ["@bazel_tools//tools/jdk:genclass"],
    header_compiler = ["@bazel_tools//tools/jdk:turbine"],
    ijar = ["@bazel_tools//tools/jdk:ijar"],
    javabuilder = ["@bazel_tools//tools/jdk:javabuilder"],
    javac = ["@bazel_tools//third_party/java/jdk/langtools:javac_jar"],
    javac_supports_workers = True,
    jvm_opts = [
        "-XX:+TieredCompilation",
        "-XX:TieredStopAtLevel=1",
    ],
    singlejar = ["@bazel_tools//tools/jdk:singlejar"],
    source_version = "8",
    target_version = "8",
    visibility = ["//visibility:public"],
)

产量

Exception in thread "main" java.lang.NoSuchFieldError: ANNOTATION_PROCESSOR_MODULE_PATH
    at com.sun.tools.javac.file.Locations.initHandlers(Locations.java:1976)
    at com.sun.tools.javac.file.Locations.<init>(Locations.java:145)
    at com.sun.tools.javac.file.BaseFileManager.createLocations(BaseFileManager.java:115)
    at com.sun.tools.javac.file.BaseFileManager.<init>(BaseFileManager.java:76)
    at com.sun.tools.javac.file.JavacFileManager.<init>(JavacFileManager.java:147)
    at com.sun.tools.javac.file.JavacFileManager.lambda$preRegister$0(JavacFileManager.java:139)
    at com.sun.tools.javac.util.Context.get(Context.java:150)
    at com.sun.tools.javac.util.Context.get(Context.java:187)
    at com.sun.tools.javac.comp.Enter.<init>(Enter.java:140)
    at com.sun.tools.javac.comp.Enter.instance(Enter.java:112)
    at com.sun.tools.javac.comp.DeferredAttr.<init>(DeferredAttr.java:109)
    at com.sun.tools.javac.comp.DeferredAttr.instance(DeferredAttr.java:99)
    at com.sun.tools.javac.comp.Resolve.<init>(Resolve.java:123)
    at com.sun.tools.javac.comp.Resolve.instance(Resolve.java:159)
    at com.sun.tools.javac.comp.Check.<init>(Check.java:116)
    at com.sun.tools.javac.comp.Check.instance(Check.java:104)
    at com.sun.tools.javac.comp.Modules.<init>(Modules.java:184)
    at com.sun.tools.javac.comp.Modules.instance(Modules.java:174)
    at com.sun.tools.javac.code.Symtab.<init>(Symtab.java:481)
    at com.sun.tools.javac.code.Symtab.instance(Symtab.java:88)
    at com.sun.tools.javac.comp.Attr.<init>(Attr.java:128)
    at com.sun.tools.javac.comp.Attr.instance(Attr.java:119)
    at com.sun.tools.javac.comp.Annotate.<init>(Annotate.java:105)
    at com.sun.tools.javac.comp.Annotate.instance(Annotate.java:80)
    at com.sun.tools.javac.jvm.ClassReader.<init>(ClassReader.java:252)
    at com.sun.tools.javac.jvm.ClassReader.instance(ClassReader.java:245)
    at com.sun.tools.javac.code.ClassFinder.<init>(ClassFinder.java:183)
    at com.sun.tools.javac.code.ClassFinder.instance(ClassFinder.java:176)
    at com.sun.tools.javac.main.JavaCompiler.<init>(JavaCompiler.java:379)
    at com.google.devtools.build.buildjar.javac.BlazeJavaCompiler.<init>(BlazeJavaCompiler.java:41)
    at com.google.devtools.build.buildjar.javac.BlazeJavaCompiler.<init>(BlazeJavaCompiler.java:32)
    at com.google.devtools.build.buildjar.javac.BlazeJavaCompiler$1.make(BlazeJavaCompiler.java:76)
    at com.google.devtools.build.buildjar.javac.BlazeJavaCompiler$1.make(BlazeJavaCompiler.java:67)
    at com.sun.tools.javac.util.Context.get(Context.java:150)
    at com.sun.tools.javac.main.JavaCompiler.instance(JavaCompiler.java:110)
    at com.google.devtools.build.buildjar.javac.BlazeJavacMain.compile(BlazeJavacMain.java:117)
    at com.google.devtools.build.buildjar.SimpleJavaLibraryBuilder$2.invokeJavac(SimpleJavaLibraryBuilder.java:121)
    at com.google.devtools.build.buildjar.ReducedClasspathJavaLibraryBuilder.compileSources(ReducedClasspathJavaLibraryBuilder.java:54)
    at com.google.devtools.build.buildjar.SimpleJavaLibraryBuilder.compileJavaLibrary(SimpleJavaLibraryBuilder.java:124)
    at com.google.devtools.build.buildjar.SimpleJavaLibraryBuilder.run(SimpleJavaLibraryBuilder.java:132)
    at com.google.devtools.build.buildjar.BazelJavaBuilder.processRequest(BazelJavaBuilder.java:105)
    at com.google.devtools.build.buildjar.BazelJavaBuilder.runPersistentWorker(BazelJavaBuilder.java:67)
    at com.google.devtools.build.buildjar.BazelJavaBuilder.main(BazelJavaBuilder.java:45)

我做错了什么吗?

最佳答案

尝试使用default_java_toolchain:

load("@bazel_tools//tools/jdk:default_java_toolchain.bzl", "default_java_toolchain")

default_java_toolchain(
  name = "__jdk7",
  jvm_opts = [
      "-Xbootclasspath/p:$(location @bazel_tools//third_party/java/jdk/langtools:javac_jar)",
      "-XX:+TieredCompilation",
      "-XX:TieredStopAtLevel=1",
  ],
  javac = ["@bazel_tools//third_party/java/jdk/langtools:javac_jar",],
  bootclasspath = ["@bazel_tools//tools/jdk:platformclasspath.jar",],
  visibility = ["//visibility:public",],
  source_version = "7",
  target_version = "7",
)

在您的 .bazelrc 文件中添加对工具链的引用,例如,

build --java_toolchain=//:__jdk7
test --java_toolchain=//:__jdk7

关于java - 如何更改引导类路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49706912/

相关文章:

java - 从基类调用重新定义的方法?

java - 在 Hadoop 中选择不同的记录并使用组合器

java - SCPSolver 与 Java nullPointerException。一个可运行的例子

java - Hibernate 数据获取类型问题

go - dep 和 bazel Go 规则之间有联系吗?

java - bazel run *_deploy.jar 失败并显示 "cannot execute binary file"

java - 警告 : No file found for:/sign

c++ - 在 MacOS 上使用 Bazel 构建时调试 C++ 代码不起作用

bazel - 运行bazel测试时如何指定 "default"目标标签

c++ - 如何为 C++ Bazel 项目生成 compile_commands.json