Во-первых, позвольте мне сказать, что все это сложно, наверное, трудно по причине.
Этот подход может работать для вас, если он вам действительно нужен. Как написано, предполагается, что «java» находится на пути вызывающего абонента.
Обзор:
Объявите класс Bootstrapper в качестве основного класса в манифесте флягу в.
Загрузочный загрузчик запускает другой процесс, в котором мы вызываем java (передавая любые аргументы командной строки, которые вы хотите) в «реальном» основном классе.
Перенаправление ребенка обрабатывает System.out и System.err для соответствующих потоков в загрузчике в
Дождитесь завершения процесса завершения дочернего
Вот good background article.
SRC/Основной/Java/царапин/Bootstrap.java - этот класс определен в pom.xml, как 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/главная/Java/царапанию/App .java - это нормальная точка входа для программы
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
возвратов:
Hello World! maxMemory:520290304
Exit:0
Это действительно похоже на хрупкий взлом. Учитывая, что на многих машинах java (.exe) либо не находится в PATH, либо тот, что в PATH, не тот, который хочет использовать вызывающий, я не вижу, как это не вызовет больше проблем чем решать. – 2011-11-09 15:18:54