--- /dev/null
+package org.argeo.slc.detached;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+public class AppLauncher {
+ private Properties systemProperties = new Properties();
+ private String mainClass = null;
+ private List arguments = new ArrayList();
+
+ public void launch() {
+
+ Properties base = System.getProperties();
+ Properties fake = new Properties(base);
+
+ try {
+ if (mainClass == null)
+ throw new DetachedException(
+ "A main class name has to be specified.");
+
+ System.getProperties().putAll(systemProperties);
+
+ ClassLoader cl = Thread.currentThread().getContextClassLoader();
+ Class clss = cl.loadClass(mainClass);
+
+ String[] args = new String[arguments.size()];
+ for (int i = 0; i < arguments.size(); i++) {
+ args[i] = arguments.get(i).toString();
+ }
+
+ Class[] mainArgsClasses = new Class[] { args.getClass() };
+ Object[] mainArgs = { args };
+ Method mainMethod = clss.getMethod("main", mainArgsClasses);
+
+ System.setProperties(fake);
+
+ mainMethod.invoke(null, mainArgs);
+
+ } catch (Exception e) {
+ throw new DetachedException("Unexpected exception while launching "
+ + mainClass, e);
+ } finally {
+ System.setProperties(base);
+ }
+
+ }
+
+ public void setSystemProperties(Properties systemProperties) {
+ this.systemProperties = systemProperties;
+ }
+
+ public void setMainClass(String mainClass) {
+ this.mainClass = mainClass;
+ }
+
+ public void setArguments(List arguments) {
+ this.arguments = arguments;
+ }
+
+}