我正在尝试在项目的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
我已经验证了路径,它是有效的。 我在这里做错了吗?这是正确的方法吗?
答案 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"。
以上代码需要进行一些修改才能满足您的需求。 祝你好运