in container/openejb-core/src/main/java/org/apache/openejb/config/RemoteServer.java [187:418]
private void cmd(final List<String> additionalArgs, final String cmd, final boolean checkPortAvailable) {
boolean ok = true;
final int port = START.equals(cmd) && portStartup > 0 ? portStartup : portShutdown;
if (checkPortAvailable) {
ok = !connect(port, 1);
}
if (ok) {
try {
if (verbose) {
System.out.println("[] " + cmd.toUpperCase(Locale.ENGLISH) + " SERVER");
}
final File home = getHome();
final String javaVersion = options.get("java.version", (String) null);
final String javaHome = options.get("java.home", (String) null);
if (verbose) {
System.out.println("OPENEJB_HOME = " + home.getAbsolutePath());
final String systemInfo = "Java " + javaVersion + "; "
+ options.get("os.name", (String) null) + "/"
+ options.get("os.version", (String) null);
System.out.println("SYSTEM_INFO = " + systemInfo);
}
serverHasAlreadyBeenStarted = false;
final File lib = new File(home, "lib");
final File webapplib = new File(new File(new File(home, "webapps"), "tomee"), "lib");
File javaagentJar = null;
try {
javaagentJar = lib("openejb-javaagent", lib, webapplib);
} catch (final IllegalStateException ise) {
// no-op
}
final File conf = new File(home, "conf");
final File loggingProperties = new File(conf, "logging.properties");
final String java;
final boolean isWindows = options.get("os.name", "unknown").toLowerCase(Locale.ENGLISH).startsWith("windows");
if (isWindows && START.equals(cmd) && options.get("server.windows.fork", false)) {
// run and forget
java = new File(javaHome, "bin/javaw").getAbsolutePath();
} else {
java = new File(javaHome, "bin/java").getAbsolutePath();
}
final List<String> argsList = new ArrayList<>(20);
argsList.add(java);
argsList.add("-XX:+HeapDumpOnOutOfMemoryError");
if (debug) {
argsList.add("-Xdebug");
argsList.add("-Xnoagent");
argsList.add("-Djava.compiler=NONE");
argsList.add("-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=" + options.get(SERVER_DEBUG_PORT, 5005));
}
if (profile) {
String yourkitHome = options.get("yourkit.home", "/Applications/YourKit_Java_Profiler_9.5.6.app/bin/mac/");
if (!yourkitHome.endsWith("/")) {
yourkitHome += "/";
}
final String yourkitOpts = options.get("yourkit.opts", "disablestacktelemetry,disableexceptiontelemetry,builtinprobes=none,delay=10000,sessionname=Tomcat");
argsList.add("-agentpath:" + yourkitHome + "libyjpagent.jnilib=" + yourkitOpts);
}
if (javaOpts != null) {
argsList.addAll(parse(javaOpts.replace("${openejb.base}", home.getAbsolutePath())));
}
final Map<String, String> addedArgs = new HashMap<>();
if (additionalArgs != null) {
for (final String arg : additionalArgs) {
final int equal = arg.indexOf('=');
if (equal < 0) {
addedArgs.put(arg, "null");
} else {
addedArgs.put(arg.substring(0, equal), arg.substring(equal + 1).replace("${openejb.base}", home.getAbsolutePath()));
}
argsList.add(arg.replace("${openejb.base}", home.getAbsolutePath()));
}
}
if (!addedArgs.containsKey("-Djava.util.logging.config.file") && loggingProperties.exists()) {
argsList.add("-Djava.util.logging.config.file=" + loggingProperties.getAbsolutePath());
}
if (javaagentJar != null && javaagentJar.exists()) {
argsList.add("-javaagent:" + javaagentJar.getAbsolutePath());
}
//DMB: If you don't use an array, you get problems with jar paths containing spaces
// the command won't parse correctly
final String ps = File.pathSeparator;
final String[] args;
if (!tomcat) {
final File openejbJar = lib("openejb-core", lib, webapplib);
final StringBuilder cp = new StringBuilder(openejbJar.getAbsolutePath());
if (additionalClasspath != null) {
cp.append(ps).append(additionalClasspath.replace("${openejb.base}", home.getAbsolutePath()));
}
argsList.add("-cp");
argsList.add(cp.toString());
argsList.add("org.apache.openejb.cli.Bootstrap");
} else {
final File bin = new File(home, "bin");
final File tlib = new File(home, "lib");
final File bootstrapJar = new File(bin, "bootstrap.jar");
final File juliJar = new File(bin, "tomcat-juli.jar");
final File commonsLoggingJar = new File(bin, "commons-logging-api.jar");
final File endorsed = new File(home, "endorsed");
final File temp = new File(home, "temp");
//if (!addedArgs.containsKey("-Dcom.sun.management.jmxremote")) {
// argsList.add("-Dcom.sun.management.jmxremote");
//}
if (!addedArgs.containsKey("-Djava.util.logging.manager")) {
argsList.add("-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager");
}
if (!addedArgs.containsKey("-Djava.io.tmpdir")) {
argsList.add("-Djava.io.tmpdir=" + temp.getAbsolutePath());
}
if ((javaVersion.startsWith("1.7") || javaVersion.startsWith("1.8")) && // java 9 dropped endorsed folder
!addedArgs.containsKey("-Djava.endorsed.dirs") && endorsed.exists()) {
argsList.add("-Djava.endorsed.dirs=" + endorsed.getAbsolutePath());
}
if (!addedArgs.containsKey("-Dcatalina.base")) {
argsList.add("-Dcatalina.base=" + home.getAbsolutePath());
}
if (!addedArgs.containsKey("-Dcatalina.home")) {
argsList.add("-Dcatalina.home=" + home.getAbsolutePath());
}
if (!addedArgs.containsKey("-Dcatalina.ext.dirs")) {
argsList.add("-Dcatalina.ext.dirs=" + tlib.getAbsolutePath());
}
if (!addedArgs.containsKey("-Dorg.apache.catalina.STRICT_SERVLET_COMPLIANCE")) {
argsList.add("-Dorg.apache.catalina.STRICT_SERVLET_COMPLIANCE=true");
}
if (!addedArgs.containsKey("-Dorg.apache.tomcat.util.http.ServerCookie.ALLOW_HTTP_SEPARATORS_IN_V0")) {
argsList.add("-Dorg.apache.tomcat.util.http.ServerCookie.ALLOW_HTTP_SEPARATORS_IN_V0=true");
}
if (addedArgs.isEmpty()) { // default case
addIfSet(argsList, "javax.net.ssl.keyStore");
addIfSet(argsList, "javax.net.ssl.keyStorePassword");
addIfSet(argsList, "javax.net.ssl.trustStore");
addIfSet(argsList, "java.protocol.handler.pkgs");
}
if(!addedArgs.containsKey("-da")) {
argsList.add("-ea");
}
// Add the JAVA 11+ specific start-up parameters required by TomEE
argsList.add("--add-opens=java.base/java.lang=ALL-UNNAMED");
argsList.add("--add-opens=java.base/java.io=ALL-UNNAMED");
argsList.add("--add-opens=java.base/java.util=ALL-UNNAMED");
argsList.add("--add-opens=java.base/java.util.concurrent=ALL-UNNAMED");
argsList.add("--add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED");
argsList.add("--add-opens=java.base/jdk.internal.loader=ALL-UNNAMED");
argsList.add("--add-opens=java.base/java.net=ALL-UNNAMED");
argsList.add("-classpath");
final StringBuilder cp = new StringBuilder(bootstrapJar.getAbsolutePath()).append(ps).append(juliJar.getAbsolutePath());
if (commonsLoggingJar.exists()) {
cp.append(ps).append(commonsLoggingJar.getAbsolutePath());
}
if (additionalClasspath != null) {
cp.append(ps).append(additionalClasspath.replace("${openejb.base}", home.getAbsolutePath()));
}
argsList.add(cp.toString());
argsList.add("org.apache.catalina.startup.Bootstrap");
}
if (cmd == null) {
argsList.add(START);
} else {
argsList.add(cmd);
}
args = argsList.toArray(new String[argsList.size()]);
if (verbose) {
System.out.println(Join.join("\n", args));
}
// kill3UNIXDebug();
final ProcessBuilder pb = new ProcessBuilder(args)
.redirectOutput(ProcessBuilder.Redirect.INHERIT)
.redirectError(ProcessBuilder.Redirect.INHERIT)
.directory(home.getAbsoluteFile());
Process p = pb.start();
if (START.equals(cmd)) {
server.set(p);
} else if (STOP.equals(cmd)) {
waitFor(p);
p = server.get();
if (p != null) {
waitFor(p);
}
}
} catch (final Exception e) {
throw (RuntimeException) new OpenEJBRuntimeException("Cannot start the server. Exception: " + e.getClass().getName() + ": " + e.getMessage()).initCause(e);
}
if (port > 0) {
if (debug) {
if (!connect(port, Integer.MAX_VALUE)) {
throw new OpenEJBRuntimeException("Could not connect to server: " + this.host + ":" + port);
}
} else {
if (!connect(port, tries)) {
throw new OpenEJBRuntimeException("Could not connect to server: " + this.host + ":" + port);
}
}
}
} else {
if (verbose) {
System.out.println("[] FOUND STARTED SERVER");
}
}
}