我正在尝试开发一个可以更新正在运行的Java Desktop App的模块。 问题是我必须用另一个jar替换实际运行的jar,同时显示图像和进度条以及更新过程的剩余时间。
我想到的一个解决方案是我可以在我的主罐子里放一个罐子,并且在启动更新过程时,提取第二个罐子,它将显示图像和progess条,并且还将替换旧的main罐子里有一个新的主罐子。 我的问题是,如果这是可能的,我该怎么做。 我没有很多java和java包装的经验,所以如果你有任何例子或链接,对我来说会有很大的帮助。
非常感谢你。 R上。
答案 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>