aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/tools/launcher/java_launcher.h
blob: 1881d587d998d8f14f8a107c823b74bd9a948cb1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
// 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, 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=<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_