12d57dc69SVladimir Kotal#!/usr/bin/env python3 22d57dc69SVladimir Kotal 32d57dc69SVladimir Kotal# CDDL HEADER START 42d57dc69SVladimir Kotal# 52d57dc69SVladimir Kotal# The contents of this file are subject to the terms of the 62d57dc69SVladimir Kotal# Common Development and Distribution License (the "License"). 72d57dc69SVladimir Kotal# You may not use this file except in compliance with the License. 82d57dc69SVladimir Kotal# 92d57dc69SVladimir Kotal# See LICENSE.txt included in this distribution for the specific 102d57dc69SVladimir Kotal# language governing permissions and limitations under the License. 112d57dc69SVladimir Kotal# 122d57dc69SVladimir Kotal# When distributing Covered Code, include this CDDL HEADER in each 132d57dc69SVladimir Kotal# file and include the License file at LICENSE.txt. 142d57dc69SVladimir Kotal# If applicable, add the following below this CDDL HEADER, with the 152d57dc69SVladimir Kotal# fields enclosed by brackets "[]" replaced with your own identifying 162d57dc69SVladimir Kotal# information: Portions Copyright [yyyy] [name of copyright owner] 172d57dc69SVladimir Kotal# 182d57dc69SVladimir Kotal# CDDL HEADER END 192d57dc69SVladimir Kotal 202d57dc69SVladimir Kotal# 21*b9361335SVladimir Kotal# Copyright (c) 2008, 2021, Oracle and/or its affiliates. All rights reserved. 222d57dc69SVladimir Kotal# Portions Copyright (c) 2017-2018, Chris Fraire <cfraire@me.com>. 232d57dc69SVladimir Kotal# 242d57dc69SVladimir Kotal 25*b9361335SVladimir Kotalimport os 262d57dc69SVladimir Kotalimport platform 27*b9361335SVladimir Kotalimport shutil 28*b9361335SVladimir Kotal 292d57dc69SVladimir Kotalfrom .command import Command 302d57dc69SVladimir Kotalfrom .utils import is_exe 312d57dc69SVladimir Kotal 322d57dc69SVladimir Kotal 332d57dc69SVladimir Kotalclass Java(Command): 342d57dc69SVladimir Kotal """ 352d57dc69SVladimir Kotal java executable wrapper class 362d57dc69SVladimir Kotal """ 372d57dc69SVladimir Kotal 382d57dc69SVladimir Kotal def __init__(self, command, logger=None, main_class=None, java=None, 392d57dc69SVladimir Kotal jar=None, java_opts=None, classpath=None, env_vars=None, 402d57dc69SVladimir Kotal redirect_stderr=True, doprint=False): 412d57dc69SVladimir Kotal 422d57dc69SVladimir Kotal if not java: 432d57dc69SVladimir Kotal java = self.FindJava(logger) 442d57dc69SVladimir Kotal if not java: 452d57dc69SVladimir Kotal raise Exception("Cannot find Java") 462d57dc69SVladimir Kotal 472d57dc69SVladimir Kotal if not is_exe(java): 482d57dc69SVladimir Kotal raise Exception("{} is not executable file".format(java)) 492d57dc69SVladimir Kotal 502d57dc69SVladimir Kotal logger.debug("Java = {}".format(java)) 512d57dc69SVladimir Kotal 522d57dc69SVladimir Kotal java_command = [java] 532d57dc69SVladimir Kotal if java_opts: 542d57dc69SVladimir Kotal java_command.extend(java_opts) 552d57dc69SVladimir Kotal if classpath: 562d57dc69SVladimir Kotal java_command.append('-classpath') 572d57dc69SVladimir Kotal java_command.append(classpath) 582d57dc69SVladimir Kotal if jar: 592d57dc69SVladimir Kotal java_command.append('-jar') 602d57dc69SVladimir Kotal java_command.append(jar) 612d57dc69SVladimir Kotal if main_class: 622d57dc69SVladimir Kotal java_command.append(main_class) 632d57dc69SVladimir Kotal env = None 642d57dc69SVladimir Kotal if env_vars: 652d57dc69SVladimir Kotal env = {} 662d57dc69SVladimir Kotal for spec in env_vars: 672d57dc69SVladimir Kotal if spec.find('=') != -1: 682d57dc69SVladimir Kotal name, value = spec.split('=') 692d57dc69SVladimir Kotal env[name] = value 702d57dc69SVladimir Kotal 712d57dc69SVladimir Kotal java_command.extend(command) 722d57dc69SVladimir Kotal logger.debug("Java command: {}".format(java_command)) 732d57dc69SVladimir Kotal 742d57dc69SVladimir Kotal super().__init__(java_command, logger=logger, env_vars=env, 752d57dc69SVladimir Kotal redirect_stderr=redirect_stderr, doprint=doprint) 762d57dc69SVladimir Kotal 772d57dc69SVladimir Kotal def FindJava(self, logger): 782d57dc69SVladimir Kotal """ 792d57dc69SVladimir Kotal Determine Java binary based on platform. 802d57dc69SVladimir Kotal """ 812d57dc69SVladimir Kotal java = None 822d57dc69SVladimir Kotal system_name = platform.system() 832d57dc69SVladimir Kotal if system_name == 'SunOS': 842d57dc69SVladimir Kotal rel = platform.release() 852d57dc69SVladimir Kotal if rel == '5.10': 862d57dc69SVladimir Kotal java_home = "/usr/jdk/instances/jdk1.7.0" 872d57dc69SVladimir Kotal elif rel == '5.11': 882d57dc69SVladimir Kotal java_home = "/usr/jdk/latest" 892d57dc69SVladimir Kotal 902d57dc69SVladimir Kotal if os.path.isdir(java_home): 912d57dc69SVladimir Kotal java = os.path.join(java_home, 'bin', 'java') 922d57dc69SVladimir Kotal elif system_name == 'Darwin': 935d26fc68SDyno Fu cmd = Command(['/usr/libexec/java_home']) 942d57dc69SVladimir Kotal cmd.execute() 952d57dc69SVladimir Kotal java = os.path.join(cmd.getoutputstr(), 'bin', 'java') 962d57dc69SVladimir Kotal elif system_name == 'Linux': 972d57dc69SVladimir Kotal link_path = '/etc/alternatives/java' 982d57dc69SVladimir Kotal if os.path.exists(link_path): 992d57dc69SVladimir Kotal # Resolve the symlink. 1002d57dc69SVladimir Kotal java = os.path.realpath(link_path) 1012d57dc69SVladimir Kotal 1022d57dc69SVladimir Kotal if not java: 1032d57dc69SVladimir Kotal java_home = os.environ.get('JAVA_HOME') 1042d57dc69SVladimir Kotal if java_home: 1052d57dc69SVladimir Kotal logger.debug("Could not detemine Java home using standard " 1062d57dc69SVladimir Kotal "means, trying JAVA_HOME: {}".format(java_home)) 1072d57dc69SVladimir Kotal if os.path.isdir(java_home): 1082d57dc69SVladimir Kotal java = os.path.join(java_home, 'bin', 'java') 1092d57dc69SVladimir Kotal 110*b9361335SVladimir Kotal if not java: 111*b9361335SVladimir Kotal logger.debug("Could not detemine java executable using standard " 112*b9361335SVladimir Kotal "means, trying system path") 113*b9361335SVladimir Kotal java = shutil.which('java') 114*b9361335SVladimir Kotal 1152d57dc69SVladimir Kotal return java 116