First off, let me say that anything this tricky is probably hard for a reason.
This approach that may work for you if you really need it. As written, it assumes "java" is on the caller's path.
Overview:
Declare a Bootstrapper class as the main class in the jar's manifest.
The bootstrapper spawns another process in which we call java (passing in any command-line arguments you want) on the "real" main class.
Redirect the child processes System.out and System.err to the bootstrapper's respective streams
Wait for the child process to finish
Here's a good background article.
src/main/java/scratch/Bootstrap.java - this class is defined in pom.xml as the jar's mainclass: <mainClass>scratch.Bootstrap</mainClass>
package scratch; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintStream; public class Bootstrap { class StreamProxy extends Thread { final InputStream is; final PrintStream os; StreamProxy(InputStream is, PrintStream os) { this.is = is; this.os = os; } public void run() { try { InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String line = null; while ((line = br.readLine()) != null) { os.println(line); } } catch (IOException ex) { throw new RuntimeException(ex.getMessage(), ex); } } } private void go(){ try { /* * Spin up a separate java process calling a non-default Main class in your Jar. */ Process process = Runtime.getRuntime().exec("java -cp scratch-1.0-SNAPSHOT-jar-with-dependencies.jar -Xmx500m scratch.App"); /* * Proxy the System.out and System.err from the spawned process back to the user's window. This * is important or the spawned process could block. */ StreamProxy errorStreamProxy = new StreamProxy(process.getErrorStream(), System.err); StreamProxy outStreamProxy = new StreamProxy(process.getInputStream(), System.out); errorStreamProxy.start(); outStreamProxy.start(); System.out.println("Exit:" + process.waitFor()); } catch (Exception ex) { System.out.println("There was a problem execting the program. Details:"); ex.printStackTrace(System.err); if(null != process){ try{ process.destroy(); } catch (Exception e){ System.err.println("Error destroying process: "+e.getMessage()); } } } } public static void main(String[] args) { new Bootstrap().go(); } }
src/main/java/scratch/App.java - this is the normal entry point for your program
package scratch; public class App { public static void main( String[] args ) { System.out.println( "Hello World! maxMemory:"+Runtime.getRuntime().maxMemory() ); } }
Calling: java -jar scratch-1.0-SNAPSHOT-jar-with-dependencies.jar Returns:
Hello World! maxMemory:520290304 Exit:0