91 lines
3.0 KiB
Python
91 lines
3.0 KiB
Python
# -*- 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
|