0

我有一个 C# 程序,它更新然后启动一个 Java 应用程序。在实际启动 Java 之前,它会检查程序使用的 .jar 文件的更新。有可能多人同时在给定机器上运行应用程序(它可能是终端服务器),或者同一个用户正在运行程序的多个实例。如果其他人正在运行该应用程序,则 .jar 文件将被使用且无法更新。我正在努力解决这个问题。

我的偏好是重命名 .jar 文件并更新它。当前运行应用程序的所有人员仍然可以使用重命名的 jar 文件。Windows 也不会让你重命名正在使用的文件(尽管我认为 Unix 系统会)。

不过,我注意到使用 Windows 资源管理器,您可以复制/粘贴 jar 文件并覆盖正在使用的 .jar 文件。这是如何工作的,我可以在我的更新程序/启动程序中以某种方式做类似的事情吗?

我还有其他方法可以使用吗?

4

3 回答 3

1

我会说没有(简单的)方法可以实现这一目标。我能想到的几个想法可能是;

  • 将更新下载到单独的下载位置。每次启动应用程序时,请尝试安装更新,如果有任何失败,请回滚并稍后重试。
  • 使用某种锁定文件来指示程序正在运行或正在进行更新,并采取相应的措施。例如。如果您有更新并且“运行”和“更新”锁定文件不存在,请创建“更新”锁定文件并安装更新,完成后删除“更新”锁定。如果您进行方式更新并且“更新”锁定文件存在,请等到“更新”锁定文件被删除,您可能需要在安装之前再次检查更新。如果您有更新并且存在“运行”锁,您将不得不跳过更新过程......
  • 告诉所有连接的用户,他们将被强制断开连接,并且服务器会在一段时间后重新启动。当时间段结束时,终止正在运行的应用程序并更新服务器。您可能需要添加某种“锁定”机制,以防止应用程序的新实例开始启动,直到更新过程完成......
于 2013-09-12T03:05:41.023 回答
0

更新 jar 文件并将其放在新位置。然后更改您的类路径以从新位置而不是旧位置获取更新的 jar。如果在这两个地方都找到了文件,那么您可以根据您的要求决定偏好。另一个重要的一点是,如果同一个 jar 被多次引用,那么在你的类路径中按顺序排在第一位的那个将首先被加载。

于 2013-09-12T03:22:46.410 回答
0

创建两个文件夹:旧的和新的

它们都将包含相同的文件。当没有更新时,每个人都将使用新文件夹中的文件。当有更新时,将新文件夹中的 jar 复制到旧文件夹中,每个新连接都将使用旧文件夹中的 jar 文件,直到与新文件夹中 jar 文件的每个连接都终止。最后,当大家使用旧文件夹中的jar文件时,将您的更新复制到新文件夹中(当然,这一切都应该是自动的),最后,更新完成后,每个新连接都会使用新文件夹中的jar文件文件夹。我希望这有帮助。

于 2013-09-12T03:43:13.193 回答