使用Java执行jar文件只能在pc到pc的基础上工作
我正在尝试为Java应用程序创建一个启动器,它将自动更新/下载计算机用户主页区域中的jar文件,然后继续执行它 我曾尝试使用Process和Runtime类来运行jar文件,在我自己的pc上只取得了成功,但似乎1:10尝试这种分布式软件(也是jar形式)的人似乎无法运行jar文件(作为参考,我已确保所有测试此应用程序的人员都安装了最新版本的Java) 负责运行jar文件的代码如下:使用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 {
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/
tojava
。
(因为这是,并且)
现在你只需要为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");