软件更新如何工作?

时间:2009-06-26 19:04:25

标签: java version-control

我已经阅读了梁的Java编程简介几周了,当作者说“开发人员不需要创建和安装主要的新软件版本时,就会出现这个问题。”。< / p>

软件更新如何运作?例如,游戏补丁,新版产品和那类东西。在本书中,有一个例子,只要你保持一个类的接口相同,你就不需要在任何依赖于你改变的类的类中做任何改变。这很好,但仍然有点抽象(例如,如何仅使用该类创建更新补丁?)。

我也对这个主题的书感兴趣。

谢谢。

8 个答案:

答案 0 :(得分:3)

看看这本书

Practical API Design - Confessions of a Java Framework Architect(Jaroslav Tulach,Apress,2008)

我认为它涵盖了您所询问的大多数方面。

有关发布新软件版本或更新的主题,请查看技术Java Web Start,例如。

在用户面前,可以认为向Web应用程序发送更新是隐含的,因为在集中式服务器上进行的更改 1 是由Web浏览器本身提供的。

1 或一组服务器

答案 1 :(得分:2)

我认为您尝试理解的概念是将接口用作类型。在java程序中,可以将变量声明为具有某些已定义接口的类型。然后可以为接口类型的变量实例化实现该接口的类。但是,只能使用在接口上声明的方法。在编译时,该接口用于类型检查。然而,在运行时,实际完成工作的字节码来自接口实现者。一个例子:

public interface foo {
    public void bar();
}

public class A implements foo {
    public void bar() {
        // some code
    }
}

public class Example {
    public static void main(String[] args) {
        foo aFoo = new A();
        aFoo.bar();
    }
}

在类Example中,名为aFoo的变量被声明为foo类型,即接口。实现foo接口的A将包含执行方法bar()工作的代码。在类Example中,变量aFoo获取类A的实例,因此,当调用aFoo.bar()时,即使aFoo声明为foo类型,也会执行A的bar()方法中的任何代码。

因此,我们已经确定所有工作都在A类中完成。上面的两个类和一个接口都可以在它们自己的文件中定义。所有三个生成的.class文件都可以打包到jar中,并作为程序的1.0版发送给客户。稍后,在类A的bar()实现中可能会发现一个错误。一旦开发了一个修复程序,假设更改都包含在bar()方法中,那么只需要将A的.class文件发送到顾客。更新后的A.class可以插入到程序的.jar文件中(毕竟.jar文件只是.zip文件)覆盖了之前的破碎版本的A.class。重新启动程序时,JVM将加载A.bar()的新实现,类Example将获得新的行为。

与几乎所有内容一样,更复杂的程序可以变得更复杂。但原则是一样的。

答案 2 :(得分:0)

考虑一个已经架构为具有多个独立模块的游戏,每个模块仅通过接口相互交互。这种游戏的初始部署可能包含15或20个单独的jar文件。

应用更新将是连接到服务器,查询每个jar文件的最新版本,与您已有的jar文件进行比较,以及仅下载更改的文件。

如果你正在开发一个有15个罐子的项目,你就会对其中一个罐子进行严格的错误修复。您不必将所有15个罐子复制到您客户的系统 - 您只需复制更换的罐子。

jnlp(其中Webstart和新的applet实现是示例)使用定义良好的xml文件来定义每个库的哪些版本是必需的。在这种情况下,可以通过读取xml(由Web服务器提供)来执行应用程序的初始部署,并在引导操作期间将所需的jar文件动态下载到本地缓存。实际上根本没有初始安装。

值得注意的是,与减少模块之间的依赖关系以及使用定义良好的接口所带来的编译的可维护性和易用性相比,这种好处虽然肯定是有效且真实的,但却相当小。

答案 3 :(得分:0)

更新单个类的最简单方法是停止应用程序,使用新类重写旧类,然后重新启动。关闭应用程序可能不适合某些情况。要克服这个问题,您需要拥有某种类型的框架/容器,并开发自己的类加载器,以便在不重新启动的情况下更新类。这就是Java应用程序服务器正在做的事情。

对于桌面/胖客户端,可以使用一些商业和免费的软件更新解决方案。请参阅此article进行比较。它相当古老,必然会有新的解决方案。

答案 4 :(得分:0)

除了更新单个JAR文件(或者,在其他软件环境中,共享库文件或DLL)之外,还有二进制修补程序工具可用于在某些情况下针对基本文件传输一组更改。补丁程序将获取此差异文件并将其与基本文件合并以生成新的已更改文件。这仅在原始文件未在已安装的系统上进行修改时才有效,但在某些情况下可以用于逐步修补特定的程序组件。

答案 5 :(得分:0)

我实际上是在大学里稍微研究过这个问题,经过专门研究,我发现它非常有趣。要特别指定更新的一件事是记录版本,您发布的每个版本都指定更新的内容。例如,版本1.0.1和1.0.2之间的区别是mylib.dll已更新。现在说1.0.2和1.0.4之间的差异是myotherlib.dll已经改变然后如果有人将他们的软件更新到最新版本(1.0.4)并且他们目前有1.0.1那么这两个dll都包含在更新中

我不确定这是否已经实施,或者是否使用了更多的智能方法。它实际上取决于软件制造商,我假设使用了不同的方法,因为一些开发人员加密应用程序文件并将它们捆绑成自定义格式。

答案 6 :(得分:0)

下载一个简单的批处理文件自动更新程序,让您开始使用这个概念...... 你可以在后台运行它并使用它来更新文件而不是用java编写它,我觉得用c ++写它更容易。

@echo off
if not exists "file.jar" goto FM
cls
echo [1] Update
echo [2] Exit
set /p "main=1OR2:"

if %main% == 1 goto U
if %main% == 2 exit

:U
cls
echo Updating...
del "file.jar"
wget "http://yourserver.com/file.(EXTENSION)"
if not exists "file.jar" goto FM
cls




:FM
cls
echo You are missing important files!
pause >nul
exit

我建议您在java中学习如何执行此操作,但如果您想获得更高级的功能,可以将文件放在名为“version.bat”的服务器中,然后将其下载到用户笔记本电脑中以便它可以阅读它,如果它与他们拥有的版本相同,将跳过下载并说你有最好的版本可用!。

注意:为了这个代码你需要继续google并搜索wget,下载正确的文件并放在与上面代码相​​同的文件夹中,同时将上面的代码保存为(anything.bat)

答案 7 :(得分:-1)

这不是指单一责任原则。 http://en.wikipedia.org/wiki/Single_responsibility_principle

在实践中它似乎不起作用,除非你有像Windows这样真正巨大的东西,你可以更新一些或使用大量不需要改变的纹理的游戏。