【发布时间】:2014-01-29 21:39:26
【问题描述】:
我编写了一个包含自我更新程序的 Java 应用程序。自更新程序从 Web 服务器加载新的程序版本并替换应用程序文件。虽然如果安装了应用程序,这可以完美地工作,例如在用户主目录中,如果它安装在 C:\Program Files 文件夹中,它在 Windows 机器上会失败。这是因为 JVM 是在对程序目录没有写权限的用户帐户下执行的。 如果是本机程序,例如安装程序,尝试写入程序文件夹,通常会出现一个弹出窗口,要求用户允许写入操作。 Java 应用程序不会发生这种情况。为什么?
有没有办法实现Java程序对受限文件夹的写入操作会弹出安全弹出窗口,以便用户可以允许访问该文件夹?
感谢您的回复。根据答案,我看到以下选项:
Java Web Start
对我来说,这不是最终用户的选择。我认为没有人可以期望普通的最终用户知道 Java Web Start 是什么,它有什么用处以及它是如何使用的,例如我怀疑普通 Windows 用户知道如何卸载 Java Web Start 应用程序。使用带有清单的 exe 启动器来启动 Java 应用程序
据我了解此解决方案,exe-launcher 将在应用程序启动时请求扩展执行。这不是我想要的,因为对于我的用例,如果更新可用而不是在每次应用程序启动时获得扩展权限就足够了。通过调用本机可执行文件执行更新操作
可以调用本机可执行文件来让它执行更新操作。这样,应用程序将仅在更新可用时请求扩展权限。这听起来不错,但包含一些适用于 Windows 的本机编码,并且不适用于其他平台。在程序文件夹中安装启动器,在用户主页中安装应用程序
可以在程序文件夹中放置一个启动器,该启动器调用安装在用户主目录中的应用程序。这样就可以更新用户主文件夹中的应用程序。 我使用 InnoSetup 在 Windows 上安装我的应用程序,据我所知,使用此安装程序很难实现拆分安装,可能也很难使用其他安装程序。在用户的主目录中安装完整的应用程序
因为用户对他的主目录有写访问权,所以完全没有问题。对我来说,这看起来是最好的选择,因为它很简单。
【问题讨论】:
-
在另一个问题中,您询问的是 JWS。为什么不安装这个应用程序。使用 JWS?它提供自动更新..
-
我是 UAC,我会立即阻止您的应用程序并永远阻止它的执行。谁保证你不会在看似无辜的 java 东西中引入恶意可执行文件?
-
在 Program Files 中放置一个 starter/updater,并让真正的应用程序下载到用户的子目录 .MyApp。并且:JWS 比看起来更简单。
-
@user2662314 互联网上有很多使用 JWS 的应用程序。 ArgoUML 立即浮现在脑海中。但是,您知道自己的要求是什么,因此最终是您的选择。对于您的问题,我认为您所指的授权弹出窗口是特定于操作系统的。 Java 是跨平台的,它可能只是不支持它。您可能需要考虑进行 JNI 调用,甚至开发一些其他方法来更新,可能通过辅助程序或可以使用本机 Windows 的东西。
标签: java windows access-rights