Выполнить еще одну банку в программе Java

Я написал несколько простых Java-приложений, названных A.jar, B.jar. Теперь я хочу написать Java-программу с графическим интерфейсом, чтобы пользователь мог нажать кнопку A, чтобы выполнить A.jar, и кнопку B, чтобы выполнить B.jar. Также я хочу вывести детали процесса выполнения в моей программе GUI. Любое предложение?

 William Brendel24 авг. 2009 г., 06:33
Не уверен, почему это было отклонено. Объясните ему, почему его предположения могут быть неверными, но неЯ не могу ответить на этот вопрос.
 William Brendel24 авг. 2009 г., 06:54
@grigory: видите, этоs, что вы должны были спросить в первую очередь, вместо того, чтобы сразу же понизить голосование. Downvoting, даже не спрашивая больше информации, неничего хорошего ...
 topchef24 авг. 2009 г., 06:33
-1 Базовая терминология Java не используется правильно, и вопрос очень расплывчатый и оставляет много для повторного предположения. Попробуйте перефразировать ваш вопрос с более подробной информацией или просто сначала прочитать о Java classpath и других основах.
 topchef24 авг. 2009 г., 08:17
@ Уильям, извини, что нажал кнопку на несколько секунд позже, чем ты. Я оставляю за собой право голоса с последующим комментарием. Это'разочаровывает, когда задают вопросы без базовой подготовки и / или усилий, чтобы понять или представить проблему. Голосование для меня как совет в ресторане: вы даете больше или меньше стандартных 12% в зависимости от качества обслуживания. Так что давайте'Здесь согласны не соглашаться.

Ответы на вопрос(6)

запуская jar с командным файлом, в случае, если программа работает автономно:

public static void startExtJarProgram(){
        String extJar = Paths.get("C:\\absolute\\path\\to\\batchfile.bat").toString();
        ProcessBuilder processBuilder = new ProcessBuilder(extJar);
        processBuilder.redirectError(new File(Paths.get("C:\\path\\to\\JavaProcessOutput\\extJar_out_put.txt").toString()));
        processBuilder.redirectInput();
        try {
           final Process process = processBuilder.start();
            try {
                final int exitStatus = process.waitFor();
                if(exitStatus==0){
                    System.out.println("External Jar Started Successfully.");
                    System.exit(0); //or whatever suits 
                }else{
                    System.out.println("There was an error starting external Jar. Perhaps path issues. Use exit code "+exitStatus+" for details.");
                    System.out.println("Check also C:\\path\\to\\JavaProcessOutput\\extJar_out_put.txt file for additional details.");
                    System.exit(1);//whatever
                }
            } catch (InterruptedException ex) {
                System.out.println("InterruptedException: "+ex.getMessage());
            }
        } catch (IOException ex) {
            System.out.println("IOException. Faild to start process. Reason: "+ex.getMessage());
        }
        System.out.println("Process Terminated.");
        System.exit(0);
    }

В batchfile.bat мы можем сказать:

@echo off
start /min C:\path\to\jarprogram.jar

похоже, что вы хотите запустить jars в отдельном процессе внутри вашего Java-приложения с графическим интерфейсом.

Для этого вы можете использовать:

// Run a java app in a separate system process
Process proc = Runtime.getRuntime().exec("java -jar A.jar");
// Then retreive the process output
InputStream in = proc.getInputStream();
InputStream err = proc.getErrorStream();

Это всегда хорошая практика для буферизации выходных данных процесса.

 stommestack24 мая 2014 г., 18:24
Вы знаете, как получитьRuntime объект этого Java-приложения?
 Duc Tran17 апр. 2012 г., 18:06
Благодарю. Я'мы попробовали exec () func с 3 параметрами, включая "реж» параметр, и это не 'т работа. Только с одним, нам нужно только положить 3 файла .jar в одном месте
 Anand Rockzz10 сент. 2014 г., 03:27
Можем ли мы использовать более портативную версию, используя ProcessBuilder?
 Pacerier12 февр. 2012 г., 06:40
Является ли это решение портативным?

и вы знаете его основной класс, вы можете просто вызвать основной класс. Используя DITA-OT в качестве примера:

import org.dita.dost.invoker.CommandLineInvoker;
....
CommandLineInvoker.main('-f', 'html5', '-i', 'samples/sequence.ditamap', '-o', 'test')

Обратите внимание, что это заставит подчиненный jar совместно использовать пространство памяти и путь к классу с вашим jar со всеми возможными помехами, которые могут вызвать. Если вы неЕсли вы хотите что-то загрязненное, у вас есть другие варианты, как указано выше, а именно:

создайте новый ClassLoader с банкой в нем. Это более безопасно; Вы можете, по крайней мере, изолировать новую банкузнание основного загрузчика классов, если вы разрабатываете вещи, зная, что выЯ буду использовать банки с инопланетянами. Это's что мы делаем в моем магазине для нашей системы плагинов; Основное приложение - это крошечная оболочка с фабрикой ClassLoader, копией API и знанием того, что настоящее приложение является первым плагином, для которого оно должно создать ClassLoader. Плагины представляют собой пару jar-файлов - интерфейс и реализацию - которые объединены в архив. Все ClassLoader совместно используют все интерфейсы, в то время как каждый ClassLoader знает только о своей собственной реализации. СтекЭто немного сложно, но оно проходит все тесты и прекрасно работает.использованиеRuntime.getRuntime.exec(...) (который полностью изолирует банку, но имеет нормальныйнайти приложение ","избегайте своих строк правильно ","платформо-зависимая WTF ", а также "OMG System Threads " подводные камни выполнения системных команд.

import javax.tools.JavaCompiler; 
import javax.tools.ToolProvider; 

public class CompilerExample {

    public static void main(String[] args) {
        String fileToCompile = "/Users/rupas/VolatileExample.java";

        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

        int compilationResult = compiler.run(null, null, null, fileToCompile);

        if (compilationResult == 0) {
            System.out.println("Compilation is successful");
        } else {
            System.out.println("Compilation Failed");
        }
    }
}
 Sri Harsha Chilakapati01 февр. 2015 г., 10:31
Я неНе думаю, что это отвечает ОПвопрос

Надеюсь это поможет:

public class JarExecutor {

private BufferedReader error;
private BufferedReader op;
private int exitVal;

public void executeJar(String jarFilePath, List<string> args) throws JarExecutorException {
    // Create run arguments for the

    final List<string> actualArgs = new ArrayList<string>();
    actualArgs.add(0, "java");
    actualArgs.add(1, "-jar");
    actualArgs.add(2, jarFilePath);
    actualArgs.addAll(args);
    try {
        final Runtime re = Runtime.getRuntime();
        //final Process command = re.exec(cmdString, args.toArray(new String[0]));
        final Process command = re.exec(actualArgs.toArray(new String[0]));
        this.error = new BufferedReader(new InputStreamReader(command.getErrorStream()));
        this.op = new BufferedReader(new InputStreamReader(command.getInputStream()));
        // Wait for the application to Finish
        command.waitFor();
        this.exitVal = command.exitValue();
        if (this.exitVal != 0) {
            throw new IOException("Failed to execure jar, " + this.getExecutionLog());
        }

    } catch (final IOException | InterruptedException e) {
        throw new JarExecutorException(e);
    }
}

public String getExecutionLog() {
    String error = "";
    String line;
    try {
        while((line = this.error.readLine()) != null) {
            error = error + "\n" + line;
        }
    } catch (final IOException e) {
    }
    String output = "";
    try {
        while((line = this.op.readLine()) != null) {
            output = output + "\n" + line;
        }
    } catch (final IOException e) {
    }
    try {
        this.error.close();
        this.op.close();
    } catch (final IOException e) {
    }
    return "exitVal: " + this.exitVal + ", error: " + error + ", output: " + output;
}
}
</string></string></string>

.. Создайте классы или вызовите любой статический метод.

РЕДАКТИРОВАТЬ: Добавить запись основного класса при создании JAR.>

p.mf (содержание p.mf)

Мэйн-Класс: pk.Test

>Test.java

package pk;
public class Test{
  public static void main(String []args){
    System.out.println("Hello from Test");
  }
}

Используйте класс Process и это 'методы,

public class Exec
{
   public static void main(String []args) throws Exception
    {
        Process ps=Runtime.getRuntime().exec(new String[]{"java","-jar","A.jar"});
        ps.waitFor();
        java.io.InputStream is=ps.getInputStream();
        byte b[]=new byte[is.available()];
        is.read(b,0,b.length);
        System.out.println(new String(b));
    }
}
 adatapost09 янв. 2014 г., 15:02
@logan - в каталоге, куда вы загружаете программу.
 winsontan52024 авг. 2009 г., 08:44
спасибо большое, это работает!
 Jherico24 авг. 2009 г., 06:35
Я думаю, что идея заключается в том, что, предоставляя доступ к банке, как вы добавляете его в путь к классам, чтобы загружать из него классы.
 logan09 янв. 2014 г., 10:33
@AVD: где следует хранить файл A.jar?
 poussma20 нояб. 2012 г., 16:37
Примечание: это работает только потому, что у вас есть java bin в вашем PATH, это не так для установки Windows по умолчанию

Ваш ответ на вопрос