// Copyright 2017 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. #ifndef BAZEL_SRC_TOOLS_LAUNCHER_JAVA_LAUNCHER_H_ #define BAZEL_SRC_TOOLS_LAUNCHER_JAVA_LAUNCHER_H_ #include #include #include "src/tools/launcher/launcher.h" namespace bazel { namespace launcher { // Windows per-arg limit is MAX_ARG_STRLEN == 8k, // here we use a slightly smaller value. static const int MAX_ARG_STRLEN = 7000; class JavaBinaryLauncher : public BinaryLauncherBase { public: JavaBinaryLauncher(const LaunchDataParser::LaunchInfo& launch_info, int argc, wchar_t* argv[]) : BinaryLauncherBase(launch_info, argc, argv), singlejar(false), print_javabin(false), classpath_limit(MAX_ARG_STRLEN) {} ~JavaBinaryLauncher() override = default; ExitCode Launch() override; private: // If present, these flags should either be at the beginning of the command // line, or they should be wrapped in a --wrapper_script_flag=FLAG argument. // // --debug Launch the JVM in remote debugging mode listening // --debug= to the specified port or the port set in the // DEFAULT_JVM_DEBUG_PORT environment variable (e.g. // 'export DEFAULT_JVM_DEBUG_PORT=8000') or else the // default port of 5005. The JVM starts suspended // unless the DEFAULT_JVM_DEBUG_SUSPEND environment // variable is set to 'n'. // --main_advice= Run an alternate main class with the usual main // program and arguments appended as arguments. // --main_advice_classpath= // Prepend additional class path entries. // --jvm_flag= Pass to the "java" command itself. // may contain spaces. Can be used multiple // times. // --jvm_flags= Pass space-separated flags to the "java" command // itself. Can be used multiple times. // --singlejar Start the program from the packed-up deployment // jar rather than from the classpath. // --print_javabin Print the location of java executable binary and // exit. // --classpath_limit= // Specify the maximum classpath length. If the // classpath is shorter, this script passes it to Java // as a command line flag, otherwise it creates a // classpath jar. // // The remainder of the command line is passed to the program. bool ProcessWrapperArgument(const std::wstring& argument); // Parse arguments sequentially until the first unrecognized arg is // encountered. Scan the remaining args for --wrapper_script_flag=X options // and process them. // // Return the remaining arguments that should be passed to the program. std::vector ProcessesCommandLine(); std::wstring jvm_debug_port; std::wstring main_advice; std::wstring main_advice_classpath; std::vector jvm_flags_cmdline; bool singlejar; bool print_javabin; int classpath_limit; // Create a classpath jar to pass CLASSPATH value when its length is over // limit. // // Return the path of the classpath jar created. std::wstring CreateClasspathJar(const std::wstring& classpath); // Creat a directory based on the binary path, all the junctions will be // generated under this directory. std::wstring GetJunctionBaseDir(); // Delete all the junction directory and all the junctions under it. void DeleteJunctionBaseDir(); }; } // namespace launcher } // namespace bazel #endif // BAZEL_SRC_TOOLS_LAUNCHER_JAVA_LAUNCHER_H_