Java 程序可以将 DLL 放在 C:\Windows 中吗?

发布于 09-19 11:38 字数 288 浏览 8 评论 0原文

我正在制作一个使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

痕至2024-09-26 11:38:57

是的,您可以将 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.

夏日落2024-09-26 11:38:56

权限将阻止您写入现代版本的 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>

Permissions will prevent you from writing to system directories in modern versions of Windows. Even if the system let you do it, it would not be good practice.

By packaging your app with One-Jar, you can bundle your native libraries inside the jar, and they will be expanded and added to the classpath at runtime.

It is easy to integrate into an Ant or Maven build. As a bonus, you can also include any dependent libraries and other resources within the jar, and they will all be expanded out to temp files at runtime.

In ant, repackaging your existing jar would look something like this:

<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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文