blob: 4ca9958101537dc5e6c5c13e930e41c55fe435f5 [file] [log] [blame]
// 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_