使用Java执行jar文件只能在pc到pc的基础上工作

使用Java执行jar文件只能在pc到pc的基础上工作,java,windows,jar,process,Java,Windows,Jar,Process,我正在尝试为Java应用程序创建一个启动器,它将自动更新/下载计算机用户主页区域中的jar文件,然后继续执行它 我曾尝试使用Process和Runtime类来运行jar文件,在我自己的pc上只取得了成功,但似乎1:10尝试这种分布式软件(也是jar形式)的人似乎无法运行jar文件(作为参考,我已确保所有测试此应用程序的人员都安装了最新版本的Java) 负责运行jar文件的代码如下: public static void startApplication() { try {

我正在尝试为Java应用程序创建一个启动器,它将自动更新/下载计算机用户主页区域中的jar文件,然后继续执行它

我曾尝试使用Process和Runtime类来运行jar文件,在我自己的pc上只取得了成功,但似乎1:10尝试这种分布式软件(也是jar形式)的人似乎无法运行jar文件(作为参考,我已确保所有测试此应用程序的人员都安装了最新版本的Java)

负责运行jar文件的代码如下:

 public static void startApplication() {
        try {
             Process proc = Runtime.getRuntime().exec("java -jar "+(saveDirectory + fileName));
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }

我希望jar文件名能在location saveDirectory中打开,但在pc到pc的情况下,情况并非总是如此。我只是想知道是否有更好的方法可以确保100%的成功。如果
user.home
包含空格,则可能无法按原样计算命令由于作为
String
提供。请使用
Runtime.exec(String[])
版本:

Runtime.getRuntime().exec(new String[] { "java", "-jar", saveDirectory + fileName });
此外,您可能希望规范化JAR路径:

Path path = Paths.get(saveDirectory, fileName);
String fullPath = path.normalize().toAbsolutePath().toString();
Runtime.getRuntime().exec(new String[] { "java", "-jar", fullPath });

您的原始代码运行的前提是,“java”通常在“PATH”上可用(或者特别是在当前工作目录中可用)

@Karol的观点也可能是一个问题! (
exec(String[])
exec(String)
好得多)

但是,调用java/be独立于(OS)“PATH”变量的存在和内容的更可靠的方法是,预先挂起:
System.getProperty(“java.home”)/bin/
to
java
。 (因为这是,并且) 现在你只需要为
PATH\u EXT
variable.:(例如windows中的“.exe;.bat…”)祈祷……但是一个不错的希望是:至少(在客户端机器上)安装并运行了一个jvm!:)

为了使您的程序更具可移植性,您应该将所有
/
s和
\
s(平台相关路径分隔符)替换为:


是否转义
saveDirectory
变量中的空格?saveDirectory变量如下:
私有静态字符串saveDirectory=System.getProperty(“user.home”)+“/”
对于其他参考,fileName变量如下:
private static String fileName=“Client.jar”谢谢你的回答。你能不能澄清一下你所说的user.home包含空格的意思,这样我就可以更好地理解这个问题?是否也建议改为使用如下ProcessBuilder:
ProcessBuilderPB=newProcessBuilder(“java”、“-jar”、saveDirectory+fileName);进程p=pb.start()
java-jar C:\User\imf\My Documents\Downloads\app.jar
将失败,因为
C:\User\imf\My
不是jar位置,并且
Documents\Downloads\app.jar
不是
main()
参数。空格是
java-jar
语法的分词符。感谢您提供的说明和帮助。
System.getProperty("file.separator");