【问题标题】:Executing a different Jar file from another java program从另一个 java 程序执行不同的 Jar 文件
【发布时间】:2011-07-06 15:47:06
【问题描述】:

作为我程序的一部分,我有一个连接管理器,它接收来自客户端的连接,然后为客户端提供端口号和密码以用于连接。此时管理器需要调用 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'。使用构建器时会出现几行错误,其中包含一些奇怪的字符,第一个错误是找不到命令。

【问题讨论】:

    标签: java jar


    【解决方案1】:

    我已经成功测试了这个场景,我可以在 java 程序中执行 jar 文件(无需设置类路径)。

    你能确定你已经在jar中添加了Manifest文件,它具有Main-Class属性

    我的步骤和输出:

    1. 使用以下行创建了 Mainfest 文件:Main-Class: com.test.TestJSSJar
    2. 已创建测试 Java 程序:

    package com.test;

    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(移动到temp文件夹):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
    

    【讨论】:

    • 试过了,同样的结果,“无法访问 jar 文件”。唯一奇怪的部分是当我使用 Main 时,主类所在的包,而不是 com,它说“Main:没有这样的文件或目录”。仍然在我的主目录中创建了 jar 文件。还检查了权限。
    • @Ryan - 请尝试以下步骤: 1. 检查创建 jar 的路径中是否存在“主”目录。 2.指定jar路径时不要使用单引号(根据你的原始帖子,看看我是怎么做到的)。 3. 还要检查你是否可以在命令提示符下执行相同的命令(不改变任何路径值)
    • 好吧,现在我觉得自己很愚蠢,删除了单引号,它起作用了......发誓我在一个例子中看到了它们......谢谢
    【解决方案2】:

    在类路径中包含 jar 并从你的 main 调用 jar 的 Main-class 的 main 方法。

    假设 CytoscapeInterface.jar 的 Main-class 是 JarMain.class(您可以在 CytoscapeInterface.jar 的 META-INF 中查找),然后在您的程序中这样调用它:

    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();
    

    【讨论】:

    • 以前从未更改过类路径,网上有示例,但它们似乎从未显示您指定哪个程序具有不同的类路径。有没有简单的方法在netbeans中做到这一点?
    • 尝试使用 netbeans,使用 projectproperties.libraries.run 添加它。同样的错误
    猜你喜欢
    • 2017-12-21
    • 2011-06-23
    • 2010-11-22
    • 2023-02-22
    • 1970-01-01
    • 2013-08-01
    • 2012-11-30
    • 1970-01-01
    相关资源
    最近更新 更多