我正在制作一个使用RxTx串行库的可执行JAR。它需要访问rxtxSerial.dll,我希望JAR自动将它放在那里。这样我就不需要安装程序 - 只需一个独立的JAR。可以这样做吗?
当我调用新的FileOutputStream(新文件(“C:/Windows/rxtxSerial.dll”))时,我得到以下异常:
java.io.FileNotFoundException:C:\ Windows \ rxtxSerial.dll(访问被拒绝)
谢谢,
尼尔
答案 0 :(得分:2)
权限将阻止您在现代版本的Windows中写入系统目录。即使系统允许你这样做,也不是一个好习惯。
通过使用One-Jar打包您的应用程序,您可以将您的本机库捆绑在jar中,它们将在运行时展开并添加到类路径中。
很容易集成到Ant或Maven构建中。作为奖励,您还可以在jar中包含任何依赖库和其他资源,并且它们将在运行时扩展为临时文件。
在蚂蚁中,重新包装现有的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>
答案 1 :(得分:1)
是的,您可以将DLL文件放在系统文件夹中。但是,最新版本的Windows实现User Access/Account Control,如果您没有足够的权限,可能会阻止您这样做。然而,您使用什么语言或工具来解决这个问题并不重要。为了使您的Java应用程序能够将文件放在C:\ Windows中,它应该以管理员身份运行。但要求用户始终以管理员身份运行应用程序对用户来说可能不太方便。所以我建议做的是检查文件是否已存在,如果没有,则触发UAC并将其复制到那里。在这种情况下,管理员权限只需要一次。这是Mark S. Kolich在how to trigger UAC from Java上发表的一篇非常好的博客文章。
希望它有所帮助。