Tout d'abord, permettez-moi de dire que tout ce délicat est probablement difficile pour une raison.
Cette approche peut fonctionner pour vous si vous en avez vraiment besoin. Comme écrit, il suppose que "java" est sur le chemin de l'appelant.
Vue d'ensemble:
Déclarez une classe de Bootstrapper comme la classe principale dans le manifeste du pot. Le bootstrapper engendre un autre processus dans lequel nous appelons java (en passant les arguments de la ligne de commande de votre choix) sur la classe principale "real".
Rediriger l'enfant traite System.out et System.err aux flux respectifs du BootStrapper
Attendez que le processus enfant pour terminer
est ici un good background article.
src/main/java/scratch/Bootstrap.java - cette classe est définie dans pom.xml comme le MainClass du pot: <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 - c'est le point d'entrée normal pour votre programme
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
Renvoie:
Hello World! maxMemory:520290304
Exit:0
Cela ressemble vraiment plus à un hack fragile. Considérant que sur beaucoup, beaucoup de machines, java (.exe) n'est pas dans le PATH, ou celui dans le PATH n'est pas celui que l'appelant voudrait utiliser, je ne vois pas comment cela ne causerait pas plus de problèmes que résoudre. –