File: //snap/google-cloud-cli/394/lib/googlecloudsdk/command_lib/util/java.py
# -*- coding: utf-8 -*- #
# Copyright 2017 Google LLC. 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.
"""Utility functions for interacting with a java installation."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
import re
import subprocess
from googlecloudsdk.core import exceptions
from googlecloudsdk.core.util import encoding
from googlecloudsdk.core.util import files
class JavaError(exceptions.Error):
pass
class JavaVersionError(JavaError):
pass
def RequireJavaInstalled(for_text, min_version=7):
"""Require that a certain version of Java is installed.
Args:
for_text: str, the text explaining what Java is necessary for.
min_version: int, the minimum major version to check for.
Raises:
JavaError: if a Java executable is not found or has the wrong version.
Returns:
str, Path to the Java executable.
"""
java_path = files.FindExecutableOnPath('java')
if not java_path:
raise JavaError('To use the {for_text}, a Java {v}+ JRE must be installed '
'and on your system PATH'.format(for_text=for_text,
v=min_version))
try:
output = encoding.Decode(
subprocess.check_output(
[java_path, '-Dfile.encoding=UTF-8', '-version'],
stderr=subprocess.STDOUT),
encoding='utf-8')
except subprocess.CalledProcessError:
raise JavaError('Unable to execute the java that was found on your PATH.'
' The {for_text} requires a Java {v}+ JRE installed and on '
'your system PATH'.format(for_text=for_text, v=min_version))
java_exec_version_error = JavaVersionError(
'The java executable on your PATH is not a Java {v}+ JRE.'
' The {for_text} requires a Java {v}+ JRE installed and on '
'your system PATH'.format(v=min_version, for_text=for_text))
# Find java major version.
match = re.search(r'version "1\.', output)
if match:
# We are in a pre http://openjdk.java.net/jeps/223 world,
# this is the 1.6.xx, 1.7.xx, 1.8.xxx world.
match = re.search(r'version "(\d+)\.(\d+)\.', output)
if not match:
raise java_exec_version_error
major_version = int(match.group(2))
else:
# We are in a post http://openjdk.java.net/jeps/223 world
match = re.search(r'version "([1-9][0-9]*)', output)
if not match:
raise java_exec_version_error
major_version = int(match.group(1))
if major_version < min_version:
raise java_exec_version_error
return java_path