Java 程序可以将 DLL 放在 C:\Windows 中吗?
我正在制作一个使用 RxTx 串行库的可执行 JAR。它需要访问 rxtxSerial.dll,我希望 JAR 自动将它放在那里。这样我就不需要安装程序——只需要一个独立的 JAR。这可以做到吗?
当我调用 new FileOutputStream(new File("C:/Windows/rxtxSerial.dll")) 时,出现以下异常:
java.io.FileNotFoundException: C:\Windows\rxtxSerial.dll (访问被拒绝)
谢谢,
Neal
I'm making an executable JAR that uses the RxTx serial library. It requires access to rxtxSerial.dll and I want the JAR to put it there automatically. That way I don't need an installer -- just a standalone JAR. Can this be done?
When I call new FileOutputStream(new File("C:/Windows/rxtxSerial.dll")), I get the following exception:
java.io.FileNotFoundException: C:\Windows\rxtxSerial.dll (Access is denied)
Thanks,
Neal
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
评论(2)
权限将阻止您写入现代版本的 Windows 中的系统目录。即使系统允许你这样做,这也不是一个好的做法。
通过使用 One-Jar 打包您的应用程序,您可以将本机库捆绑到 jar 中,并且它们将在运行时扩展并添加到类路径中。
它很容易集成到 Ant 或 Maven 构建中。作为奖励,您还可以在 jar 中包含任何依赖库和其他资源,并且它们都将在运行时扩展到临时文件。
在 ant 中,重新打包现有的 jar 看起来像这样:
<one-jar destfile="libraryWithNativeCode.jar">
<manifest>
<attribute name="One-Jar-Main-Class" value="${main.class}"/>
</manifest>
<main jar="libraryWithoutNativeCode.jar" />
<binlib>
<fileset dir="${bin.dir}" includes="rxtxSerial.dll"/>
</binlib>
</one-jar>
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
是的,您可以将 DLL 文件放在系统文件夹中。但是,最新版本的 Windows 实现了用户访问/帐户控制,如果出现以下情况,可能会阻止您这样做:你没有足够的权限。不过,使用什么语言或工具来解决这个问题并不重要。为了使您的 Java 应用程序能够将文件放入 C:\Windows,它应该以管理员身份运行。但是要求用户始终以管理员身份运行应用程序对于用户来说可能不太方便。所以我建议做的是检查文件是否已经存在,如果不存在,则触发 UAC 并将其复制到那里。在这种情况下,仅需要一次管理员权限。这是 Mark S. Kolich 发表的一篇非常好的博客文章 如何从 Java 触发 UAC。
希望有帮助。
Yes you can put a DLL file in system folder. However, latest versions of Windows implements User Access/Account Control which can prevent you from doing so if you don't have enough priviliges. It does not matter what language or tool you are using to approach this though. In order for your Java application to be able to put files in C:\Windows, it should be ran as Administrator. But requiring user to run application as Administrator all the time might not be very convenient for the user. So what I'd suggest to do is to check if file is already there, if not, trigger UAC and copy it there. In this case Administrator privileges will be required only once. Here is a very good blog post by Mark S. Kolich on how to trigger UAC from Java.
Hope it helps.