Skip to content

Commit

Permalink
Add support for JDK 14
Browse files Browse the repository at this point in the history
Closes #11017.

Test Plan:

1. Create java_tools from this commit:

  $ bazel build src:java_tools_java14.zip

2. Switch to using the java_tools from the above step in WORKSPACE file:

  load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
  http_archive(
    name = "remote_java_tools_linux",
    urls = [
        "file:///<path to the java_tools_java14.zip>",
    ],
  )

3. Add Zulu OpenJDK14 to use as javabase in WORKSPACE file:

  http_archive(
    name = "openjdk14_linux_archive",
    build_file_content = """
java_runtime(name = 'runtime', srcs =  glob(['**']), visibility = ['//visibility:public'])
exports_files(["WORKSPACE"], visibility = ["//visibility:public"])
""",
    sha256 = "48bb8947034cd079ad1ef83335e7634db4b12a26743a0dc314b6b861480777aa",
    strip_prefix = "zulu14.28.21-ca-jdk14.0.1-linux_x64",
    urls = ["https://cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-linux_x64.tar.gz"],
  )

4. Activate custom java toolchain and javabase in .bazelrc file:

  build --java_toolchain=@remote_java_tools_linux//:toolchain_jdk_14
  build --host_java_toolchain=@remote_java_tools_linux//:toolchain_jdk_14
  build --javabase=@openjdk14_linux_archive//:runtime
  build --host_javabase=@openjdk14_linux_archive//:runtime

5. Create Java 14 example class file:

  public class Javac14Example {

    record Point(int x, int y) {}

    public static void main(String[] args) {
      Point point = new Point(0, 1);
      System.out.println(point.x);
    }
  }

6. Add Bazel file to build Java 14 syntax class with activated preview
   features:

  java_binary(
    name = "Javac14Example",
    srcs = ["Javac14Example.java"],
    javacopts = ["--enable-preview"],
    jvm_flags = ["--enable-preview"],
    main_class = "Javac14Example",
  )

7. Test that it works as expected:

  $ bazel run java:Javac14Example
INFO: Analyzed target //java:Javac14Example (1 packages loaded, 2 targets configured).
INFO: Found 1 target...
INFO: From Building java/Javac14Example.jar (1 source file):
Note: java/Javac14Example.java uses preview language features.
Note: Recompile with -Xlint:preview for details.
Target //java:Javac14Example up-to-date:
  bazel-bin/java/Javac14Example.jar
  bazel-bin/java/Javac14Example
INFO: Elapsed time: 1.502s, Critical Path: 1.30s
INFO: 1 process: 1 worker.
INFO: Build completed successfully, 2 total actions
INFO: Build completed successfully, 2 total actions
0
  • Loading branch information
davido committed Jul 15, 2020
1 parent 3eb806e commit a39aa88
Show file tree
Hide file tree
Showing 7 changed files with 304 additions and 14 deletions.
79 changes: 79 additions & 0 deletions WORKSPACE
Original file line number Diff line number Diff line change
Expand Up @@ -701,6 +701,16 @@ http_archive(
],
)


# TODO(davido): This is not needed, because jdk compiler module patching is disabled for JDK 14
http_archive(
name = "java_tools_langtools_javac14",
sha256 = "cf0814fa002ef3d794582bb086516d8c9ed0958f83f19799cdb08949019fe4c7",
urls = [
"https://mirror.bazel.build/bazel_java_tools/jdk_langtools/langtools_jdk11_v2.zip",
],
)

# This must be kept in sync with src/main/java/com/google/devtools/build/lib/bazel/rules/android/android_remote_tools.WORKSPACE
http_archive(
name = "android_tools_for_testing",
Expand Down Expand Up @@ -779,6 +789,39 @@ http_archive(
urls = ["https://mirror.bazel.build/openjdk/azul-zulu11.37.17-ca-jdk11.0.6/zulu11.37.17-ca-jdk11.0.6-win_x64.zip"],
)

# This must be kept in sync with src/main/java/com/google/devtools/build/lib/bazel/rules/java/jdk.WORKSPACE.
http_archive(
name = "remotejdk14_linux_for_testing",
build_file = "@local_jdk//:BUILD.bazel",
patch_cmds = EXPORT_WORKSPACE_IN_BUILD_BAZEL_FILE,
patch_cmds_win = EXPORT_WORKSPACE_IN_BUILD_BAZEL_FILE_WIN,
sha256 = "48bb8947034cd079ad1ef83335e7634db4b12a26743a0dc314b6b861480777aa",
strip_prefix = "zulu14.28.21-ca-jdk14.0.1-linux_x64",
urls = ["https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-linux_x64.tar.gz"],
)

# This must be kept in sync with src/main/java/com/google/devtools/build/lib/bazel/rules/java/jdk.WORKSPACE.
http_archive(
name = "remotejdk14_macos_for_testing",
build_file = "@local_jdk//:BUILD.bazel",
patch_cmds = EXPORT_WORKSPACE_IN_BUILD_BAZEL_FILE,
patch_cmds_win = EXPORT_WORKSPACE_IN_BUILD_BAZEL_FILE_WIN,
sha256 = "088bd4d0890acc9f032b738283bf0f26b2a55c50b02d1c8a12c451d8ddf080dd",
strip_prefix = "zulu14.28.21-ca-jdk14.0.1-macosx_x64",
urls = ["https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-macosx_x64.tar.gz"],
)

# This must be kept in sync with src/main/java/com/google/devtools/build/lib/bazel/rules/java/jdk.WORKSPACE.
http_archive(
name = "remotejdk14_win_for_testing",
build_file = "@local_jdk//:BUILD.bazel",
patch_cmds = EXPORT_WORKSPACE_IN_BUILD_BAZEL_FILE,
patch_cmds_win = EXPORT_WORKSPACE_IN_BUILD_BAZEL_FILE_WIN,
sha256 = "9cb078b5026a900d61239c866161f0d9558ec759aa15c5b4c7e905370e868284",
strip_prefix = "zulu14.28.21-ca-jdk14.0.1-win_x64",
urls = ["https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-win_x64.zip"],
)

# This must be kept in sync with src/main/java/com/google/devtools/build/lib/bazel/rules/java/jdk.WORKSPACE.
http_archive(
name = "remote_java_tools_linux_for_testing",
Expand Down Expand Up @@ -884,6 +927,42 @@ exports_files(["WORKSPACE"], visibility = ["//visibility:public"])
urls = ["https://mirror.bazel.build/openjdk/azul-zulu11.37.17-ca-jdk11.0.6/zulu11.37.17-ca-jdk11.0.6-win_x64.zip"],
)

# This must be kept in sync with src/test/shell/bazel/testdata/jdk_http_archives.
http_archive(
name = "openjdk14_linux_archive",
build_file_content = """
java_runtime(name = 'runtime', srcs = glob(['**']), visibility = ['//visibility:public'])
exports_files(["WORKSPACE"], visibility = ["//visibility:public"])
""",
sha256 = "48bb8947034cd079ad1ef83335e7634db4b12a26743a0dc314b6b861480777aa",
strip_prefix = "zulu14.28.21-ca-jdk14.0.1-linux_x64",
urls = ["https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-linux_x64.tar.gz"],
)

# This must be kept in sync with src/test/shell/bazel/testdata/jdk_http_archives.
http_archive(
name = "openjdk14_darwin_archive",
build_file_content = """
java_runtime(name = 'runtime', srcs = glob(['**']), visibility = ['//visibility:public'])
exports_files(["WORKSPACE"], visibility = ["//visibility:public"])
""",
sha256 = "088bd4d0890acc9f032b738283bf0f26b2a55c50b02d1c8a12c451d8ddf080dd",
strip_prefix = "zulu14.28.21-ca-jdk14.0.1-macosx_x64",
urls = ["https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-macosx_x64.tar.gz"],
)

# This must be kept in sync with src/test/shell/bazel/testdata/jdk_http_archives.
http_archive(
name = "openjdk14_windows_archive",
build_file_content = """
java_runtime(name = 'runtime', srcs = glob(['**']), visibility = ['//visibility:public'])
exports_files(["WORKSPACE"], visibility = ["//visibility:public"])
""",
sha256 = "9cb078b5026a900d61239c866161f0d9558ec759aa15c5b4c7e905370e868284",
strip_prefix = "zulu14.28.21-ca-jdk14.0.1-win_x64",
urls = ["https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-win_x64.zip"],
)

load("@io_bazel_skydoc//:setup.bzl", "stardoc_repositories")

stardoc_repositories()
Expand Down
12 changes: 9 additions & 3 deletions src/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -567,7 +567,7 @@ JAVA_TOOLS_DEPLOY_JARS = [
"//conditions:default": [],
})

JAVA_VERSIONS = ("11",)
JAVA_VERSIONS = ("11", "14")

[
genrule(
Expand Down Expand Up @@ -638,8 +638,8 @@ JAVA_VERSIONS = ("11",)
[
# The java_tools releases can have BUILD files that vary depending on the
# javac version they embed. Currently the only difference is in the
# java_toolchain source version which has to be 12 for javac 12 to be able
# to build new Java 12 features.
# java_toolchain source version which has to be 14 for javac 14 to be able
# to build new Java 14 features.
genrule(
name = "create_java_tools_build_java" + java_version,
srcs = ["//tools/jdk:BUILD.java_tools"],
Expand Down Expand Up @@ -744,6 +744,9 @@ filegroup(
"@openjdk11_darwin_archive//:WORKSPACE",
"@openjdk11_linux_archive//:WORKSPACE",
"@openjdk11_windows_archive//:WORKSPACE",
"@openjdk14_darwin_archive//:WORKSPACE",
"@openjdk14_linux_archive//:WORKSPACE",
"@openjdk14_windows_archive//:WORKSPACE",
"@openjdk_linux_aarch64_minimal//file",
"@openjdk_linux_minimal//file",
"@openjdk_macos_minimal//file",
Expand All @@ -760,6 +763,9 @@ filegroup(
"@remotejdk11_linux_ppc64le_for_testing//:WORKSPACE",
"@remotejdk11_macos_for_testing//:WORKSPACE",
"@remotejdk11_win_for_testing//:WORKSPACE",
"@remotejdk14_linux_for_testing//:WORKSPACE",
"@remotejdk14_macos_for_testing//:WORKSPACE",
"@remotejdk14_win_for_testing//:WORKSPACE",
"@rules_cc//:WORKSPACE",
"@rules_java//:WORKSPACE",
"@rules_pkg//:WORKSPACE",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,38 @@ maybe(
],
)

# This must be kept in sync with the top-level WORKSPACE file.
maybe(
http_archive,
name = "remotejdk14_linux",
build_file = "@local_jdk//:BUILD.bazel",
sha256 = "48bb8947034cd079ad1ef83335e7634db4b12a26743a0dc314b6b861480777aa",
strip_prefix = "zulu14.28.21-ca-jdk14.0.1-linux_x64",
urls = [
"https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-linux_x64.tar.gz",
],
)

# This must be kept in sync with the top-level WORKSPACE file.
maybe(
http_archive,
name = "remotejdk14_macos",
build_file = "@local_jdk//:BUILD.bazel",
sha256 = "088bd4d0890acc9f032b738283bf0f26b2a55c50b02d1c8a12c451d8ddf080dd",
strip_prefix = "zulu14.28.21-ca-jdk14.0.1-macosx_x64",
urls = ["https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-macosx_x64.tar.gz"],
)

# This must be kept in sync with the top-level WORKSPACE file.
maybe(
http_archive,
name = "remotejdk14_win",
build_file = "@local_jdk//:BUILD.bazel",
sha256 = "9cb078b5026a900d61239c866161f0d9558ec759aa15c5b4c7e905370e868284",
strip_prefix = "zulu14.28.21-ca-jdk14.0.1-win_x64",
urls = ["https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-win_x64.zip],
)

# This must be kept in sync with the top-level WORKSPACE file.
maybe(
http_archive,
Expand Down
31 changes: 29 additions & 2 deletions src/test/shell/bazel/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,30 @@ sh_test(
],
)

sh_test(
name = "bazel_java14_test",
srcs = ["bazel_java14_test.sh"],
tags = ["local"],
args = [
# --java_toolchain and --host_java_toolchain values
"@local_java_tools//:toolchain_jdk_14",
# java_tools zip to test
"src/java_tools_java14.zip",
] + select({
# --javabase and --host_javabase values
"//src/conditions:darwin": ["@openjdk12_darwin_archive//:runtime"],
"//src/conditions:darwin_x86_64": ["@openjdk12_darwin_archive//:runtime"],
"//src/conditions:windows": ["@openjdk12_windows_archive//:runtime"],
"//src/conditions:linux_x86_64": ["@openjdk14_linux_archive//:runtime"],
}),
data = [
":test-deps",
"//src:java_tools_java14_zip",
"//src/test/shell/bazel/testdata:jdk_http_archives_filegroup",
"@bazel_tools//tools/bash/runfiles",
],
)

sh_test(
name = "bazel_java_test",
# TODO(iirina): Investigate if the 'large' and 'eternal' values still apply.
Expand All @@ -196,7 +220,10 @@ sh_test(
exec_compatible_with = ["//:highcpu_machine"],
)

JAVA_VERSIONS = ("11",)
JAVA_VERSIONS = ("11", "14")

# TODO(davido): Remove this once remote_java_tools_javac14 is released
JAVA_TOOLS_VERSIONS = ("11",)

[
sh_test(
Expand Down Expand Up @@ -467,7 +494,7 @@ sh_test(
"no_windows",
],
)
for java_version in JAVA_VERSIONS
for java_version in JAVA_TOOLS_VERSIONS
]

# Test java coverage with the java_toolchain in the java_tools zip built at head.
Expand Down
116 changes: 116 additions & 0 deletions src/test/shell/bazel/bazel_java14_test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
#!/bin/bash
#
# Copyright 2020 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Tests that bazel runs projects with Java 14 features.

# --- begin runfiles.bash initialization ---
if [[ ! -d "${RUNFILES_DIR:-/dev/null}" && ! -f "${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then
if [[ -f "$0.runfiles_manifest" ]]; then
export RUNFILES_MANIFEST_FILE="$0.runfiles_manifest"
elif [[ -f "$0.runfiles/MANIFEST" ]]; then
export RUNFILES_MANIFEST_FILE="$0.runfiles/MANIFEST"
elif [[ -f "$0.runfiles/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then
export RUNFILES_DIR="$0.runfiles"
fi
fi
if [[ -f "${RUNFILES_DIR:-/dev/null}/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then
source "${RUNFILES_DIR}/bazel_tools/tools/bash/runfiles/runfiles.bash"
elif [[ -f "${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then
source "$(grep -m1 "^bazel_tools/tools/bash/runfiles/runfiles.bash " \
"$RUNFILES_MANIFEST_FILE" | cut -d ' ' -f 2-)"
else
echo >&2 "ERROR: cannot find @bazel_tools//tools/bash/runfiles:runfiles.bash"
exit 1
fi
# --- end runfiles.bash initialization ---

source "$(rlocation "io_bazel/src/test/shell/integration_test_setup.sh")" \
|| { echo "integration_test_setup.sh not found!" >&2; exit 1; }

case "$(uname -s | tr [:upper:] [:lower:])" in
msys*|mingw*|cygwin*)
declare -r is_windows=true
;;
*)
declare -r is_windows=false
;;
esac

if "$is_windows"; then
export MSYS_NO_PATHCONV=1
export MSYS2_ARG_CONV_EXCL="*"
fi

JAVA_TOOLCHAIN="$1"; shift
JAVA_TOOLS_ZIP="$1"; shift
JAVA_RUNTIME="$1"; shift

echo "JAVA_TOOLS_ZIP=$JAVA_TOOLS_ZIP"


JAVA_TOOLS_RLOCATION=$(rlocation io_bazel/$JAVA_TOOLS_ZIP)

if "$is_windows"; then
JAVA_TOOLS_ZIP_FILE_URL="file:///${JAVA_TOOLS_RLOCATION}"
else
JAVA_TOOLS_ZIP_FILE_URL="file://${JAVA_TOOLS_RLOCATION}"
fi
JAVA_TOOLS_ZIP_FILE_URL=${JAVA_TOOLS_ZIP_FILE_URL:-}

add_to_bazelrc "build --java_toolchain=${JAVA_TOOLCHAIN}"
add_to_bazelrc "build --host_java_toolchain=${JAVA_TOOLCHAIN}"
add_to_bazelrc "build --javabase=${JAVA_RUNTIME}"
add_to_bazelrc "build --host_javabase=${JAVA_RUNTIME}"

function set_up() {
cat >>WORKSPACE <<EOF
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
# java_tools versions only used to test Bazel with various JDK toolchains.
http_archive(
name = "local_java_tools",
urls = ["${JAVA_TOOLS_ZIP_FILE_URL}"]
)
EOF
cat $(rlocation io_bazel/src/test/shell/bazel/testdata/jdk_http_archives) >> WORKSPACE
}

function test_java14_record_type() {
mkdir -p java/main
cat >java/main/BUILD <<EOF
java_binary(
name = 'Javac14Example',
srcs = ['Javac14Example.java'],
main_class = 'Javac14Example',
javacopts = ["--enable-preview"],
jvm_flags = ["--enable-preview"],
)
EOF

cat >java/main/Javac14Example.java <<EOF
public class Javac14Example {
record Point(int x, int y) {}
public static void main(String[] args) {
Point point = new Point(0, 1);
System.out.println(point.x);
}
}
EOF
bazel run java/main:Javac14Example --test_output=all --verbose_failures &>"${TEST_log}"
expect_log "0"
}

run_suite "Tests new Java 14 language features"
26 changes: 26 additions & 0 deletions src/test/shell/bazel/testdata/jdk_http_archives
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,29 @@ http_archive(
strip_prefix = "zulu11.37.17-ca-jdk11.0.6-win_x64",
urls = ["https://mirror.bazel.build/openjdk/azul-zulu11.37.17-ca-jdk11.0.6/zulu11.37.17-ca-jdk11.0.6-win_x64.zip"],
)

#################################### JDK 14 ####################################
# This must be kept in sync with the top-level WORKSPACE file.
http_archive(
name = "openjdk14_linux_archive",
build_file_content = "java_runtime(name = 'runtime', srcs = glob(['**']), visibility = ['//visibility:public'])",
sha256 = "48bb8947034cd079ad1ef83335e7634db4b12a26743a0dc314b6b861480777aa",
strip_prefix = "zulu14.28.21-ca-jdk14.0.1-linux_x64",
urls = ["https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-linux_x64.tar.gz"],
)
# This must be kept in sync with the top-level WORKSPACE file.
http_archive(
name = "openjdk14_darwin_archive",
build_file_content = "java_runtime(name = 'runtime', srcs = glob(['**']), visibility = ['//visibility:public'])",
sha256 = "088bd4d0890acc9f032b738283bf0f26b2a55c50b02d1c8a12c451d8ddf080dd",
strip_prefix = "zulu14.28.21-ca-jdk14.0.1-macosx_x64",
urls = ["https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-macosx_x64.tar.gz"],
)
# This must be kept in sync with the top-level WORKSPACE file.
http_archive(
name = "openjdk14_windows_archive",
build_file_content = "java_runtime(name = 'runtime', srcs = glob(['**']), visibility = ['//visibility:public'])",
sha256 = "9cb078b5026a900d61239c866161f0d9558ec759aa15c5b4c7e905370e868284",
strip_prefix = "zulu14.28.21-ca-jdk14.0.1-win_x64",
urls = ["https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-macosx_x64.tar.gz"],
)
Loading

0 comments on commit a39aa88

Please sign in to comment.