Выполнение другого файла JAR из другой программы Java - PullRequest
0 голосов
/ 06 июля 2011

Как часть моей программы, у меня есть менеджер соединений, который получает соединение от клиента, а затем дает клиенту номер порта и пароль для подключения. В этот момент менеджеру нужно вызвать jar-файл, который я должен обработать для этого соединения, с несколькими аргументами и продолжить (игнорируя действия другой программы).

Моя проблема была с выполнением файла JAR. Я посмотрел похожие вопросы и попытался с помощью компоновщика процессов и с помощью Runtime.exec. Я перемещался по файлу jar и проверял его разрешения. Он просто отказывается работать из другой Java-программы, но отлично работает из командной строки. Вот пример одного из моих тестовых прогонов.

package test;

import java.io.*;

public class Main {
    public static void main (String [] args ) throws IOException, ClassNotFoundException, InterruptedException {
        Process p = Runtime.getRuntime().exec("java -jar \'/home/ryan/CytoscapeInterface.jar" +
        "\' arg1 arg2");
        //Process builder way
        /*ProcessBuilder pb = new ProcessBuilder("/home/ryan/CytoscapeInterface.jar",
           "-jar", "CytoscapeInterface.jar", "agr1", "arg2");
        pb.redirectErrorStream();
        Process p = pb.start();*/
        BufferedInputStream bis = new BufferedInputStream(p.getErrorStream());
        synchronized (p) { p.waitFor(); }
        System.out.println(p.exitValue());//its 1 for runtime, 2 for process Builder
        int read = bis.available();
        //had a loop, found out I just needed to go through once
        byte[] b = new byte [read];
        bis.read(b);
        read = bis.available();
        bis.close();
        FileOutputStream fos = new FileOutputStream (new File("/home/ryan/Desktop/FileTest.txt"));
        fos.write(b);//Writes error file
        fos.close();
    }
}

waitFor возвращает 1 для среды выполнения и 2 для компоновщика. Вывод ошибки для среды выполнения: «Невозможно получить доступ к jarfile» /home/ryan/CytoscapeInterface.jar ». При использовании компоновщика выдается пара строк ошибок, в которых были некоторые странные символы, первой ошибкой была команда не найдена.

Ответы [ 2 ]

5 голосов
/ 06 июля 2011

Я успешно протестировал сценарий и могу выполнить файл jar с помощью java-программы (без указания пути к классу).

Можете ли вы убедиться, что вы добавили файл Manifest в jar, которыйимеет атрибут Main-Class .

Мои шаги и вывод:

  1. Создан файл Mainfest со следующей строкой: Main-Class: com.test.TestJSSJar
  2. Создана тестовая Java-программа:

package com.test;</p> <pre><code>public class TestJSSJar extends Object { public static void main(String args[]) { System.out.println("Hi! I'm in the jar"); System.out.println("Arg:" + args[0]); } }

3.Упаковать банку (перемещено во временную папку): jar cvfm jss.jar manifest.txt com

4.Пишите тестовую программу:

import java.io.BufferedInputStream;
import java.io.IOException;

public class TestJSS extends Object {

    static int i = 0;

    public static void main(String args[]) throws IOException, InterruptedException {
        System.out.println("Calling jar");
        Process p = Runtime.getRuntime().exec("java -jar /temp/jss.jar arg1 arg2");
        BufferedInputStream bis = new BufferedInputStream(p.getInputStream());
        synchronized (p) {
            p.waitFor();
        }
        System.out.println(p.exitValue());
        int b=0;
        while((b=bis.read()) >0){

            System.out.print((char)b);    
        }        
        System.out.println("");
        System.out.println("Called jar");
    }
}

5. Выход

Calling jar
0
Hi! I'm in the jar
Arg:arg1

Called jar
0 голосов
/ 06 июля 2011

Включите jar в classpath и вызовите основной метод Main-класса jar из вашего main.

Предположим, что Main-класс CytoscapeInterface.jar - это JarMain.class (Вы можете посмотреть его вMETA-INF из CytoscapeInterface.jar), затем из вашей программы назовите его так:

JarMain.main(new String[]{"arg1", "arg2"});

Вы также можете вызвать его из нового потока, чтобы продолжить работу с вашей программой.

        new Thread(
        new Runnable() {
            public void run() {
                try {
                    JarMain.main(new String[]{"arg1", "arg2"});
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...