Author: rmannibucau Date: Thu Mar 20 18:41:39 2014 New Revision: 1579708 URL: http://svn.apache.org/r1579708 Log: TOMEE-1144 better handling of process + handling CATALINA_OPTS
Modified: tomee/tomee/trunk/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java tomee/tomee/trunk/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/ExecMojo.java tomee/tomee/trunk/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/runner/ExecRunner.java Modified: tomee/tomee/trunk/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java?rev=1579708&r1=1579707&r2=1579708&view=diff ============================================================================== --- tomee/tomee/trunk/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java (original) +++ tomee/tomee/trunk/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java Thu Mar 20 18:41:39 2014 @@ -704,6 +704,74 @@ public abstract class AbstractTomEEMojo classpaths = new ArrayList<String>(); } + final List<String> strings = generateJVMArgs(); + + // init env for RemoteServer + System.setProperty("openejb.home", catalinaBase.getAbsolutePath()); + if (debug) { + System.setProperty("openejb.server.debug", "true"); + System.setProperty("server.debug.port", Integer.toString(debugPort)); + } + System.setProperty("server.shutdown.port", Integer.toString(tomeeShutdownPort)); + System.setProperty("server.shutdown.command", tomeeShutdownCommand); + + server = new RemoteServer(getConnectAttempts(), false); + server.setAdditionalClasspath(getAdditionalClasspath()); + + addShutdownHooks(server); // some shutdown hooks are always added (see UpdatableTomEEMojo) + + if ("TomEE".equals(container)) { + getLog().info("Running '" + getClass().getSimpleName().replace("TomEEMojo", "").toLowerCase(Locale.ENGLISH) + + "'. Configured TomEE in plugin is " + tomeeHost + ":" + tomeeHttpPort + + " (plugin shutdown port is " + tomeeShutdownPort + ")"); + } else { + getLog().info("Running '" + getClass().getSimpleName().replace("TomEEMojo", "").toLowerCase(Locale.ENGLISH)); + } + + final InputStream originalIn = System.in; // piped when starting resmote server so saving it + + serverCmd(server, strings); + + if (getWaitTomEE()) { + final CountDownLatch stopCondition = new CountDownLatch(1); + Runtime.getRuntime().addShutdownHook(new Thread() { + @Override + public void run() { + stopServer(stopCondition); + } + }); + + if (useConsole) { + final Scanner reader = new Scanner(originalIn); + + System.out.flush(); + getLog().info("Waiting for command: " + availableCommands()); + + String line; + while ((line = reader.nextLine()) != null) { + if (QUIT_CMD.equalsIgnoreCase(line) || EXIT_CMD.equalsIgnoreCase(line)) { + break; + } + + if (!handleLine(line.trim())) { + System.out.flush(); + getLog().warn("Command '" + line + "' not understood. Use one of " + availableCommands()); + } + } + + reader.close(); + stopServer(stopCondition); // better than using shutdown hook since it doesn't rely on the hook which are not sent by eclipse for instance + } + + try { + stopCondition.await(); + } catch (InterruptedException e) { + // no-op + } + } + } + + protected List<String> generateJVMArgs() { final String deployOpenEjbAppKey = "openejb.system.apps"; final String servletCompliance = "org.apache.catalina.STRICT_SERVLET_COMPLIANCE"; @@ -781,73 +849,11 @@ public abstract class AbstractTomEEMojo strings.add("-Dtomee.force-reloadable=true"); } - // init env for RemoteServer - System.setProperty("openejb.home", catalinaBase.getAbsolutePath()); - if (debug) { - System.setProperty("openejb.server.debug", "true"); - System.setProperty("server.debug.port", Integer.toString(debugPort)); - } - System.setProperty("server.shutdown.port", Integer.toString(tomeeShutdownPort)); - System.setProperty("server.shutdown.command", tomeeShutdownCommand); - - server = new RemoteServer(getConnectAttempts(), false); - server.setAdditionalClasspath(getAdditionalClasspath()); - - addShutdownHooks(server); // some shutdown hooks are always added (see UpdatableTomEEMojo) - if (!getWaitTomEE()) { strings.add("-Dtomee.noshutdownhook=true"); } - if ("TomEE".equals(container)) { - getLog().info("Running '" + getClass().getSimpleName().replace("TomEEMojo", "").toLowerCase(Locale.ENGLISH) - + "'. Configured TomEE in plugin is " + tomeeHost + ":" + tomeeHttpPort - + " (plugin shutdown port is " + tomeeShutdownPort + ")"); - } else { - getLog().info("Running '" + getClass().getSimpleName().replace("TomEEMojo", "").toLowerCase(Locale.ENGLISH)); - } - - final InputStream originalIn = System.in; // piped when starting resmote server so saving it - - serverCmd(server, strings); - - if (getWaitTomEE()) { - final CountDownLatch stopCondition = new CountDownLatch(1); - Runtime.getRuntime().addShutdownHook(new Thread() { - @Override - public void run() { - stopServer(stopCondition); - } - }); - - if (useConsole) { - final Scanner reader = new Scanner(originalIn); - - System.out.flush(); - getLog().info("Waiting for command: " + availableCommands()); - - String line; - while ((line = reader.nextLine()) != null) { - if (QUIT_CMD.equalsIgnoreCase(line) || EXIT_CMD.equalsIgnoreCase(line)) { - break; - } - - if (!handleLine(line.trim())) { - System.out.flush(); - getLog().warn("Command '" + line + "' not understood. Use one of " + availableCommands()); - } - } - - reader.close(); - stopServer(stopCondition); // better than using shutdown hook since it doesn't rely on the hook which are not sent by eclipse for instance - } - - try { - stopCondition.await(); - } catch (InterruptedException e) { - // no-op - } - } + return strings; } protected Collection<String> availableCommands() { Modified: tomee/tomee/trunk/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/ExecMojo.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/ExecMojo.java?rev=1579708&r1=1579707&r2=1579708&view=diff ============================================================================== --- tomee/tomee/trunk/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/ExecMojo.java (original) +++ tomee/tomee/trunk/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/ExecMojo.java Thu Mar 20 18:41:39 2014 @@ -35,6 +35,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.StringWriter; +import java.util.List; import java.util.Properties; import static org.apache.openejb.loader.Files.mkdirs; @@ -87,6 +88,7 @@ public class ExecMojo extends BuildTomEE config.put("distribution", distributionName); config.put("workingDir", runtimeWorkingDir); config.put("command", script); + config.put("catalinaOpts", toString(generateJVMArgs())); // create an executable jar with main runner and zipFile final FileOutputStream fileOutputStream = new FileOutputStream(execFile); @@ -137,4 +139,12 @@ public class ExecMojo extends BuildTomEE IOUtil.close(os); IOUtil.close(fileOutputStream); } + + private static String toString(final List<String> strings) { + final StringBuilder builder = new StringBuilder(); + for (final String s : strings) { + builder.append(s).append(" "); + } + return builder.toString(); + } } Modified: tomee/tomee/trunk/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/runner/ExecRunner.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/runner/ExecRunner.java?rev=1579708&r1=1579707&r2=1579708&view=diff ============================================================================== --- tomee/tomee/trunk/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/runner/ExecRunner.java (original) +++ tomee/tomee/trunk/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/runner/ExecRunner.java Thu Mar 20 18:41:39 2014 @@ -20,8 +20,6 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; -import java.io.PrintStream; import java.util.ArrayList; import java.util.Collection; import java.util.Locale; @@ -31,28 +29,7 @@ import java.util.zip.ZipInputStream; import static java.util.Arrays.asList; -public class ExecRunner implements Runnable { - private final InputStream in; - private final OutputStream out; - - private ExecRunner(final InputStream in, final OutputStream out) { - this.in = in; - this.out = out; - } - - @Override - public void run() { - try { - int i; - final byte[] buf = new byte[1]; - while ((i = in.read(buf)) != -1) { - out.write(buf, 0, i); - } - } catch (final Exception e) { - e.printStackTrace(); - } - } - +public class ExecRunner { private static final String SH_BAT_AUTO = "[.sh|.bat]"; public static void main(final String[] args) throws Exception { @@ -102,22 +79,23 @@ public class ExecRunner implements Runna params.addAll(asList(args)); } - final Process process = Runtime.getRuntime().exec(params.toArray(new String[params.size()]), null, distribOutput); - pipe("exec-runner-out", process.getInputStream(), System.out); - pipe("exec-runner-err", process.getErrorStream(), System.err); + final ProcessBuilder builder = new ProcessBuilder(params.toArray(new String[params.size()])).directory(distribOutput); + + final String catalinaOpts = config.getProperty("catalinaOpts"); + if (catalinaOpts != null) { // inherit from existing env + builder.environment().put("CATALINA_OPTS", catalinaOpts); + } + + builder.redirectError(ProcessBuilder.Redirect.INHERIT); + builder.redirectOutput(ProcessBuilder.Redirect.INHERIT); + + final Process process = builder.start(); process.waitFor(); System.out.flush(); System.err.flush(); System.out.println("Exit status: " + process.exitValue()); } - private static void pipe(final String name, final InputStream errorStream, final PrintStream err) { - final Thread thread = new Thread(new ExecRunner(errorStream, err)); - thread.setName(name); - thread.setDaemon(true); - thread.start(); - } - // duplicated to avoid deps, if this class has any dep then it can't be run private static void extract(final InputStream distrib, final File output) throws IOException { mkdirs(output); @@ -166,4 +144,8 @@ public class ExecRunner implements Runna throw new IllegalArgumentException("Can't create " + output.getAbsolutePath()); } } + + private ExecRunner() { + // no-op + } }