| // 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 <string> |
| #include <vector> |
| |
| #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, |
| const std::wstring& launcher_path, int argc, |
| wchar_t* argv[]) |
| : BinaryLauncherBase(launch_info, launcher_path, 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=<port> 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=<class> Run an alternate main class with the usual main |
| // program and arguments appended as arguments. |
| // --main_advice_classpath=<classpath> |
| // Prepend additional class path entries. |
| // --jvm_flag=<flag> Pass <flag> to the "java" command itself. |
| // <flag> may contain spaces. Can be used multiple |
| // times. |
| // --jvm_flags=<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=<length> |
| // 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<std::wstring> ProcessesCommandLine(); |
| |
| std::wstring jvm_debug_port; |
| std::wstring main_advice; |
| std::wstring main_advice_classpath; |
| std::vector<std::wstring> 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_ |