/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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. */ package org.ops4j.pax.exam.karaf.container.internal.runner; import java.io.File; /** * Very simple asynchronous implementation of Java Runner. Exec is being invoked in a fresh Thread. */ public class KarafJavaRunner implements Runner { private InternalRunner runner; public KarafJavaRunner() { runner = new InternalRunner(); } @Override public synchronized void // CHECKSTYLE:SKIP : more than 10 params exec(final String[] environment, final File karafBase, final String javaHome, final String[] javaOpts, final String[] javaEndorsedDirs, final String[] javaExtDirs, final String karafHome, final String karafData, final String karafEtc, final String[] karafOpts, final String[] opts, final String[] classPath, final String main, final String options, final boolean security) { Thread thread = new Thread("KarafJavaRunner") { @Override public void run() { String cp = buildCmdSeparatedString(classPath); String endDirs = buildCmdSeparatedString(javaEndorsedDirs); String extDirs = buildCmdSeparatedString(javaExtDirs); CommandLineBuilder commandLine = null; if (System.getProperty("java.version").startsWith("9")) { commandLine = new CommandLineBuilder() .append(getJavaExecutable(javaHome)) .append(javaOpts) .append("--add-opens") .append("java.base/java.security=ALL-UNNAMED") .append("--add-opens") .append("java.base/java.net=ALL-UNNAMED") .append("--add-opens") .append("java.base/java.lang=ALL-UNNAMED") .append("--add-opens") .append("java.base/java.util=ALL-UNNAMED") .append("--add-exports=java.base/sun.net.www.protocol.http=ALL-UNNAMED") .append("--add-exports=java.base/sun.net.www.protocol.https=ALL-UNNAMED") .append("--add-exports=java.xml.bind/com.sun.xml.internal.bind.v2.runtime=ALL-UNNAMED") .append("--add-exports=jdk.xml.dom/org.w3c.dom.html=ALL-UNNAMED") .append("--add-exports=jdk.naming.rmi/com.sun.jndi.url.rmi=ALL-UNNAMED") .append("--add-exports=java.xml.ws/com.sun.xml.internal.messaging.saaj.soap.impl=ALL-UNNAMED") .append("--add-modules") .append("java.xml.ws.annotation,java.corba,java.transaction,java.xml.bind,java.xml.ws,jdk.xml.bind") .append("-Dkaraf.instances=" + karafHome + "/instances") .append("-Dkaraf.home=" + karafHome) .append("-Dkaraf.base=" + karafBase) .append("-Dkaraf.data=" + karafData) .append("-Dkaraf.etc=" + karafEtc) .append("-Djava.util.logging.config.file=" + karafEtc + "/java.util.logging.properties"); } else { commandLine = new CommandLineBuilder() .append(getJavaExecutable(javaHome)) .append(javaOpts) .append("-Djava.endorsed.dirs=" + endDirs) .append("-Djava.ext.dirs=" + extDirs) .append("-Dkaraf.instances=" + karafHome + "/instances") .append("-Dkaraf.home=" + karafHome) .append("-Dkaraf.base=" + karafBase) .append("-Dkaraf.data=" + karafData) .append("-Dkaraf.etc=" + karafEtc) .append("-Djava.util.logging.config.file=" + karafEtc + "/java.util.logging.properties"); } if (security) { commandLine.append("-Djavax.management.builder.initial=org.apache.karaf.management.boot.KarafMBeanServerBuilder"); } commandLine .append(karafOpts) .append(opts) .append("-cp") .append(cp) .append(main) .append(options); runner.exec(commandLine, karafBase, environment); } private String buildCmdSeparatedString(final String[] splitted) { final StringBuilder together = new StringBuilder(); for (String path : splitted) { if (together.length() != 0) { together.append(File.pathSeparator); } together.append(path); } return together.toString(); } private String getJavaExecutable(final String javaHome) { if (javaHome == null) { throw new IllegalStateException("JAVA_HOME is not set."); } return javaHome + "/bin/java"; } }; thread.start(); } @Override public synchronized void shutdown() { runner.shutdown(); } }