重新启动Java应用程序
如何在JavaSwing应用程序中引入自动更新和重启功能。 我还需要回滚到以前的版本。 我制作了一个应用程序jar文件和启动器jar文件,它启动了应用程序jar文件。 这一尝试是成功的。但在为MacOSX创建安装程序时,我无法集成这两个jar文件重新启动Java应用程序,java,Java,如何在JavaSwing应用程序中引入自动更新和重启功能。 我还需要回滚到以前的版本。 我制作了一个应用程序jar文件和启动器jar文件,它启动了应用程序jar文件。 这一尝试是成功的。但在为MacOSX创建安装程序时,我无法集成这两个jar文件 启动器类如下所示: public class Launcher { private final Logger logger = Logger.getLogger(Launcher.class.getName()); private String g
启动器类
如下所示:
public class Launcher {
private final Logger logger = Logger.getLogger(Launcher.class.getName());
private String getVersionNumber() throws IOException {
try {
JarFile runningJarFile = new JarFile(new File("Application.jar"));
String versionNumber = runningJarFile.getManifest()
.getMainAttributes().getValue("Bundle-Version");
runningJarFile.close();
logger.log(
Level.SEVERE,
new StringBuilder()
.append("The version number of existing Application.jar file is ")
.append(versionNumber).toString());
return versionNumber;
} catch (IOException e) {
logger.log(
Level.SEVERE,
new StringBuilder()
.append("Could not read the version number from existing Application.jar")
.append(Arrays.toString(e.getStackTrace()))
.toString());
throw new IOException(e);
}
}
private void updateApplication() {
try {
File updateDirectory = new File("Update");
if (updateDirectory.isDirectory()) {
if (updateDirectory.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.startsWith("\\.");
}
}).length > 0) {
String versionNumber = getVersionNumber();
logger.log(
Level.SEVERE,
new StringBuilder()
.append("A new update is available. Rename the existing Application.jar to ")
.append(versionNumber)
.append(".jar")
.append(" and rename the new_Application.jar to Application.jar")
.toString());
File Application = new File("Application.jar");
Application.renameTo(new File(new StringBuilder()
.append(versionNumber).append(".jar").toString()));
File newApplication = new File("Update/new_Application.jar");
newApplication.renameTo(new File("Application.jar"));
newApplication.delete();
}
}
} catch (Exception e) {
logger.log(Level.SEVERE,
new StringBuilder().append("Could not update Application")
.append(Arrays.toString(e.getStackTrace()))
.toString());
}
}
private void launchApplication() {
try {
logger.log(Level.SEVERE, "Lauching Application.jar");
ProcessBuilder pb = new ProcessBuilder("Java", "-jar", "Application.jar");
pb.start();
} catch (IOException e) {
logger.log(Level.SEVERE,
new StringBuilder().append("Could not launch Application.jar ")
.append(Arrays.toString(e.getStackTrace()))
.toString());
}
}
private void quitLauncher() {
logger.log(Level.SEVERE, "Launcher is exiting");
System.exit(0);
}
private void startApplication() {
updateApplication();
launchApplication();
quitLauncher();
}
public static void main(String[] args) {
Launcher launcher = new Launcher();
launcher.startApplication();
}
}
谢谢首先,您是否正在创建标准安装程序包(mpkg或pkg) 您应该让启动器下载更新,然后执行它(使用/usr/sbin/installer)。在这之后,安装程序应该有一个postflight/postinstall/postprocessing脚本,该脚本可以杀死任何名为您的应用程序(这可能与查找具有给定名称的进程一样棘手),然后启动最近安装的应用程序 这使得您的应用程序甚至在第一次安装后也会启动(您可以避免这样做,让它检查是否是更新-从启动器“update.txt”保存标记文件就足够了-) 以下是如何创建安装程序包(几乎是从头开始)的完整指南: 或者,你可以使用这个很酷的工具:
我想这一切对你所寻找的东西来说都不是过分的。你现在如何包装它们?例如,您可以将jar放入一个jar中,这并不完全符合您的要求,但可能值得考虑使用JavaWebStart