无法访问/运行放置在项目中的可执行jar

时间:2015-01-23 08:03:45

标签: java jar executable-jar

我正在尝试在项目的resources文件夹中运行可执行jar。如果我将jar放在我的文件系统的任何目录中并提供绝对路径,它就可以正常工作。 请参阅以下代码:

    String jarPath = "C:\\JarFolder\\myJar.jar";        
    String command = "java -jar";
    String space = " ";
    String params = "-a abc";
    try {
        proc = Runtime
                .getRuntime()
                .exec(command + space + jarPath + space + params);
    } catch (IOException e) {
        e.printStackTrace();
    }

但是当我将jar放在resources文件夹中时,将相对jar路径设置为:

    String jarPath = "..\\..\\..\\resources\\myJar.jar";

我收到错误:Error: Unable to access jarfile ..\\..\\..\\resources\\myJar.jar

我已经验证了路径,它是有效的。 我在这里做错了吗?这是正确的方法吗?

3 个答案:

答案 0 :(得分:4)

使用ClassLoader获取资源的路径。

String jarPath = this.getClass().getClassLoader().getResource("myJar.jar").getPath();      
String command = "java -jar";
String space = " ";
String params = "-a abc";
try {
    proc = Runtime
            .getRuntime()
            .exec(command + space + jarPath + space + params);
} catch (IOException e) {
    e.printStackTrace();
}

如果这是从主静态方法运行的,那么只需用YourClass.class替换this.getClass()。

答案 1 :(得分:0)

相对路径应该直接工作。需要更多有关您看到的错误描述和项目文件夹结构的详细信息(放置执行jar的位置以及放置导入文件夹的位置。)

其他替代解决方案是查找当前正在执行的jar文件的绝对文件位置。您可以使用以下代码段获取它。

MyClass.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath();

要执行的其他jar文件必须放在同一文件夹或某些子文件夹中的某个位置。

现在从绝对路径中删除当前jar文件名,并附加另一个jar文件的相对路径并执行它。它应该工作。

答案 2 :(得分:0)

如果您在窗口,可以按照以下方式使用。我已经测试了这段代码并且有效。

public class test {
    public static void main(String[]args) throws IOException{
        String jarPath = test.class.getClass().getResource("/resources/b.jar").getPath();      
        System.out.println("jarPath "+ jarPath);
//the result path have extra "/" so we have to remove it as follow.
        jarPath = jarPath.substring(1);
//and again the result is encoded so we need to decode it back
        jarPath = URLDecoder.decode(jarPath);
        Runtime
        .getRuntime()
        .exec("java -jar \""+jarPath+"\"");
    }

}

注意:我将我的runnable jar放在我的资源文件夹中,名称为" b.jar"。

以上代码需要进行一些修改才能满足您的需求。 祝你好运