更新java桌面应用

时间:2015-03-24 08:41:04

标签: java desktop-application executable-jar auto-update

我正在尝试开发一个可以更新正在运行的Java Desktop App的模块。 问题是我必须用另一个jar替换实际运行的jar,同时显示图像和进度条以及更新过程的剩余时间。

我想到的一个解决方案是我可以在我的主罐子里放一个罐子,并且在启动更新过程时,提取第二个罐子,它将显示图像和progess条,并且还将替换旧的main罐子里有一个新的主罐子。 我的问题是,如果这是可能的,我该怎么做。 我没有很多java和java包装的经验,所以如果你有任何例子或链接,对我来说会有很大的帮助。

非常感谢你。 R上。

2 个答案:

答案 0 :(得分:2)

更新按钮时运行此代码..

if(Desktop.isDesktopSupported()){
            try {
                Desktop.getDesktop().open(new File("update.jar"));
                System.exit(0);
            } catch (IOException ex) {                
            }            
        }

这将打开 update.jar 并关闭 main.jar 。现在从 update.jar

的主类运行此代码
 if(isUpdateVersionAvailable()) { //first check update from database
      try{
          Thread.sleep(5000);
       } catch(Exception e){
          e.printStackTrace();
       }
       if(copyMainJarFileFromServer()){ //copy newMain.jar from server and paste
            new File("main.jar").delete();
            rename(new File("newMain.jar"));
        }
    }

    boolean isUpdateVersionAvailable() {
              //todo
    }
    boolean copyMainJarFileFromServer() {
              //todo
    }
    void rename(File file){
     file.renameTo(new File("main.jar"));
    }

答案 1 :(得分:0)

您可以拥有一个启动jar,用于检查更新并从主jar启动应用程序。

它将显示标准java可在启动时显示的起始徽标,图像。 start0er还可用于以另一种界面语言重启应用程序。

package starter;
...
public class StarterApp {
    public static void main(String[] args) {
        String workDir = System.getProperty("user.dir");
        Path mainJar = Paths.get(workDir + "...");
        Path nextMainJar = Paths.get(workDir + "...");
        if (Files.exists(nextMainJar)) {
            Files.copy(nextMainJar, mainJar, StandardCopyAction.REPLACE_EXISTING);
        }
        URLClassLoader classLoader = new URLClassLoader(new URL[] {mainJar.toURL()});
        Class<?> appClass = classLoader.find("mainjar.MainApp");
        ... instantiate the app
    }

如您所见,主jar不能过早加载,也许不能完全在类路径上,因此使用单独的ClassLoader。使用Class.forName("mainjar.MainApp")的主要jar on 类路径可能会使用{{1}}。 Class-Path可以在META-INF / MANIFEST.MF中指定。

secundary jar可以驻留在lib /目录中。

对于那些想要更多模块化,面向服务,可更新的应用程序的读者,可以制作一个 OSGi 应用程序,一个捆绑包(= jars)的容器,提供可交换的服务和终身控制。 / p>