5

我编写了一个包含自我更新程序的 Java 应用程序。自更新程序从 Web 服务器加载新的程序版本并替换应用程序文件。虽然如果应用程序安装在用户主目录中,这非常有效,但如果它安装在 C:\Program Files 文件夹中,它在 Windows 机器上会失败。这是因为 JVM 是在对程序目录没有写权限的用户帐户下执行的。如果本地程序(例如安装程序)尝试写入程序文件夹,通常会出现一个弹出窗口,要求用户允许写入操作。Java 应用程序不会发生这种情况。为什么?

有没有办法实现Java程序对受限文件夹的写入操作会弹出安全弹出窗口,以便用户可以允许访问该文件夹?


感谢您的回复。根据答案,我看到以下选项:

  1. Java Web Start
    对我来说,这不是最终用户的选择。我认为没有人可以期望普通的最终用户知道 Java Web Start 是什么,它有什么用处以及它是如何使用的,例如,我怀疑普通的 Windows 用户知道如何卸载 Java Web Start 应用程序。

  2. 使用带有清单的 exe 启动器来启动 Java 应用程序
    据我所知,这个解决方案 exe 启动器会在应用程序启动时请求扩展执行。这不是我想要的,因为对于我的用例,如果更新可用而不是在每个应用程序启动时获得扩展权限就足够了。

  3. 通过调用本机可执行文件执行更新操作
    可以调用本机可执行文件以使其执行更新操作。这样,应用程序将仅在更新可用时请求扩展权限。这听起来不错,但包含一些适用于 Windows 的本机编码,并且不适用于其他平台。

  4. 在程序文件夹中安装启动器,在
    用户主目录中安装应用程序可以在程序文件夹中放置启动器,以调用安装在用户主目录中的应用程序。这样就可以更新用户主文件夹中的应用程序。我使用 InnoSetup 在 Windows 上安装我的应用程序,据我所知,使用此安装程序很难实现拆分安装,可能也很难使用其他安装程序。

  5. 在用户的主目录中安装完整的应用程序
    因为用户对他的主目录具有写访问权,所以完全没有问题。对我来说,这看起来是最好的选择,因为它很简单。

4

2 回答 2

4

如果您使用 inno setup 编译器来生成启动器,那么您可以更改您的应用目录权限。

例如,如果您需要完全控制并想要更新 AppName/data 文件夹下的文件

[Dirs]
Name: "{app}"; 
Name: "{app}\data"; Permissions: everyone-full

[Files]
Source: data\*; DestDir: {app}\data\; Flags: ignoreversion recursesubdirs createallsubdirs; Permissions: everyone-full
于 2016-11-24T08:32:34.237 回答
2

不幸的是,当您第一次启动程序时需要请求增加的权限,您以后无法向他们提升。看起来像它们的程序实际上是在幕后以更高的权限重新启动自己。

几年前我在使用 Java 应用程序时遇到过这样的问题,最后我将应用程序安装到用户数据文件夹而不是程序文件中,否则自动更新是一场噩梦。您仍然可以将它添加到开始菜单中,这样对于用户来说它看起来就像任何其他程序一样。

于 2014-01-10T19:19:22.380 回答