簡體   English   中英

如何從另一個Java程序內部運行.jar文件?

[英]How to run a .jar file from inside another java program?

我有一個.jar文件,可以在命令行上運行:

java -jar myFile.jar argument1

我想將此.jar的輸出另存為另一個Java程序中的String變量。

我該怎么做?

我嘗試在程序中包含myFile.jar作為引用,並在程序中執行myFile.main(new String{"argument1"}) 但這只是將結果打印到控制台,我無法在程序中使用結果。

希望這不會太令人困惑。

一世

運行Jar文件要求您將jar文件包含在類路徑中。 這可以在運行時使用URLClassLoader 只需使用jar作為URL之一來構造URLClassLoader 如果知道類名(當然是全名forClass(...)則調用它的forClass(...) )。 或使用清單文件的“ findResources(String name)”檢查清單文件。

一旦獲得了類,就可以使用反射來獲取其靜態方法main

再次看到您的問題,您就知道了類名,因此,如果確定jar文件已經在類路徑中,則可以在嘗試時調用它。

II

要捕獲輸出,可以調用System.setOut(PrintStream out)System.setErrPrintStream out)更改打印流。 您可以傳遞您創建的打印流。 像這樣:

ByteArrayOutputStream BAOS = new ByteArrayOutputStream();
PrintStream MyOut = new PrintStream(BAOS);
System.setOut(MyOut);

// Do something to have something printed out.
...

String TheCaptured = new String(BAOS.toByteArray());

希望這可以幫助。

作為一個Jar文件,您可以將其添加到您的類路徑中,然后自行調用該程序的功能。 您可能需要更多地了解Jar背后的邏輯,以便在不輸出信息的情況下使用它。

我相信您正在尋找的是如何Shell執行Jar存檔。 可以在此處找到示例

看一下ProcessBuilder:

http://java.sun.com/javase/6/docs/api/java/lang/ProcessBuilder.html

它有效地創建了一個操作系統進程,然后您可以使用以下命令捕獲輸出:

process.getInputStream()

該行:

processbuilder.redirectErrorStream(true)

在以下示例中,將合並輸出流和錯誤流:

例如

public class ProcessBuilderExample {

    public ProcessBuilderExample() {
        // TODO Auto-generated constructor stub
    }
    public static void main(String[] args) throws IOException, InterruptedException {

        ProcessBuilder pb = new ProcessBuilder("java", "-jar", "gscale.jar");
        pb.redirectErrorStream(true);
        pb.directory(new File("F:\\Documents and Settings\\Administrator\\Desktop"));

        System.out.println("Directory: " + pb.directory().getAbsolutePath());
        Process p = pb.start();
        InputStream is = p.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        for (String line = br.readLine(); line != null; line = br.readLine()) {
                System.out.println( line ); // Or just ignore it
        }
        p.waitFor();                    
    }
}

如果您不能包括另一個罐子,

你可以用這樣的東西

Runtime re = Runtime.getRuntime();
BufferedReader output;          
try{ 
  cmd = re.exec("java -jar MyFile.jar" + argument); 
  output =  new BufferedReader(new InputStreamReader(cmd.getInputStream()));
} catch (IOException ioe){
  ioe.printStackTrace();
}
String resultOutput = output.readLine();

我知道我的代碼並不像捕獲的異常那樣完美,但是我認為這可以為您提供一個好主意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM