如何使用 Eclipse 启动将本机库添加到“java.library.path”(而不是覆盖它)
Posted
技术标签:
【中文标题】如何使用 Eclipse 启动将本机库添加到“java.library.path”(而不是覆盖它)【英文标题】:How to add native library to "java.library.path" with Eclipse launch (instead of overriding it) 【发布时间】:2010-10-14 06:19:00 【问题描述】:我有一个需要添加到 java.library.path 的本机库。使用 JVM 参数 -Djava.library.path=path... 我可以根据需要设置路径。
我的问题是我的其他库(pentaho 报告)根据默认的 java.library.path(包括系统目录等)搜索字体,并且手动设置会覆盖默认路径..
那么:我如何添加一个路径条目到默认的 java.library.path 而不是覆盖它(这似乎是用 -Djava.library.path 完成的)? (我不想手动添加默认路径,这对部署不利)
编辑:抱歉遗漏细节;我正在使用 Eclipse。 (部署是用 JNLP 完成的,我可以在 resources 下使用 nativelib)
【问题讨论】:
请查看这个问题的公认答案 - 对我来说更好:***.com/questions/957700/… “如何将本机库添加到..”的问题令人困惑。这可能是关于添加(附加或前置)另一个“库路径”,即假设 Eclipse 默认显示类似 java.library.path=path1:path2:path3 的内容,问题是如何启动 Eclipse 以结束 java.library .path=my/lib/folder:path1:path2:path3 【参考方案1】:-
在 Windows 上:将库的路径添加到 PATH 环境变量中。
在 Linux 上:将库的路径添加到 LD_LIBRARY_PATH 环境变量中。
在 Mac 上:将库的路径添加到 DYLD_LIBRARY_PATH 环境变量中。
java.library.path
在其对应的平台上使用上述变量的值进行初始化。
这应该适用于任何 IDE。
您可以通过调用java -XshowSettings:properties
来测试该值是否符合您的预期
【讨论】:
【参考方案2】:Rob Elsner 在上述 cmets 之一中提供的解决方案完美运行(OSX 10.9,Eclipse Kepler)。必须将它们的附加路径附加到以“:”分隔的路径。
您也可以使用 $system_property:java.library.path – Rob Elsner 2010 年 11 月 22 日 23:01
【讨论】:
【参考方案3】:在 Windows 中,像这样:
-Djava.library.path="C:/MyLibPath;%PATH%"
%PATH% 是你的旧 -Djava.library.path
【讨论】:
试过这个想法,但结果是 java.library.path : D:\Workspace\myProject\lib;%PATH% 你也可以使用 $system_property:java.library.path UNIX/Mac/GNU Linux 上的默认值为 LD_LIBRARY_PATH。 PATH 是 Windows 的东西。【参考方案4】:许多现有答案假设您想为特定项目设置此选项,但我需要为 Eclipse 本身设置它以支持 SQL Server JDBC 驱动程序的集成身份验证。 p>
为此,我按照 these instructions 从 Java 命令行启动 Eclipse,而不是其正常启动器。然后我只是修改了该脚本,将我的 -Djava.library.path 参数添加到 Java 命令行。
【讨论】:
【参考方案5】:https://bugs.eclipse.org/bugs/show_bug.cgi?id=102239 声明在 Eclipse 的启动器中没有实现替代机制,至少在 Juno 发布之前没有实现。
因此,在不事先了解默认设置的情况下启动 Eclipse 时,(几乎)不可能将另一个库文件夹附加或预先添加到 java.library.path。
我写的差不多了,因为应该可以让 Eclipse 启动,转储 java.library.path 的内容,并在一个命令中停止 Eclipse。转储将被解析,然后作为启动 Eclipse 的输入,即
#!/bin/bash
# get default value of java.library.path (somehow)
default_lib_path=$( start_dump_stop_eclipse_somehow )
# now launch Eclipse
eclipse --launcher.appendVmargs \
-vmargs \
-Djava.library.path="/my/native/lib/folder:$default_lib_path"
【讨论】:
【参考方案6】:在 Windows 上,我发现重要的是从命令行启动 Eclipse,而不是从“开始”菜单或快捷方式,前提是本机 DLL 位于 PATH 中的目录中.显然,这确保了正确的目录位于路径上。
【讨论】:
如果我错了,请纠正我,但我相信在搜索 DLL(或可执行二进制文件)时会自动包含 Windows 上的当前工作目录。因此,当您切换到 DLL 所在的文件夹并启动 Eclipse 时,是的,您正在寻找的 DLL 已找到。除此之外,这个答案与线程启动问题有什么关系?【参考方案7】:由于某种原因,我无法让多个文件夹工作(它确实有一段时间,但只要我需要更多 dll 并添加更多文件夹,路径中没有空格)。然后我将所有需要的 dll 复制到一个文件夹中,并将其作为我的 java.library.path 并且它有效。我没有解释——如果有人解释,那就太好了。
【讨论】:
好吧,如果通过 java.library.path 找到了本机库,并且您将另一个库复制到该文件夹中,那么很自然地也找到了第二个库,不是吗?跨度> 当然,这就是我使用它的原因,呵呵!我想知道的是是否可以向其中添加多个文件夹而无需移动或符号链接。【参考方案8】:窗口->首选项->Java->已安装的 JRE。然后选择您当前的 JRE(JDK) 并单击编辑。 填充默认 VM 参数:-Djava.library.path=/usr/local/xuggler/lib。 完成!
【讨论】:
这个答案没用,因为线程启动器专门询问“如何添加本机库 [..] 而不是覆盖 [..]”。这个答案只是覆盖了默认设置。【参考方案9】:本机库文件名必须与 Jar 文件名相对应。这是非常非常重要的。 请确保 jar 名称和 dll 名称相同。 另外,请参阅 F*** Steeg 的帖子 我下载的jawin 包含不同的dll 和jar 名称。 它是jawin.jar 和jawind.dll,请注意dll 文件名中的额外“d”。 我只是将它重命名为jawin.dll,并将其设置为 Eclipse 中的本机库,如帖子中所述 "http://www.eclipsezone.com/eclipse/forums/t49342.html"
【讨论】:
问题是关于在启动 Eclipse 时添加本机库(文件夹)。【参考方案10】:忘记了这个问题...我实际上是在向 Eclipse 询问,很抱歉最初没有说明这一点。 答案似乎太简单了(至少在 3.5 中;可能还有旧版本):
Java 运行配置的参数:VM 参数:
-Djava.library.path="$workspace_loc:project\lib;$env_var:PATH"
一定不要忘记引号,否则PATH中有空格有问题。
【讨论】:
如果有两个共享库,一个依赖另一个,这将不起作用。第一个由 Java 运行时找到,而第二个由系统动态加载器解析。我找到的唯一解决方案是设置 LD_LIBRARY_PATH。 @Touko 给出的答案不符合原始问题,即关于附加或附加本机库文件夹。至少在 Mac OS 10.8 上,$PATH、$LD_LIBRARY_PATH 和 $workspace_loc:project\lib 都与默认值无关。例如,在我的 Mac 上,默认值为 $HOME/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java :. 如果您在 Eclipse 中使用 TestNG,您将需要编辑 TestNG 运行配置: - 在“运行配置”窗口中,选择您的目标 TestNG 配置。 - 选择环境选项卡 - 添加一个 PATH 变量并将其值设置为您的目标 - 保留默认的“将环境附加到本机环境”切换。 我能举个例子吗? @kevincline 您介意详细说明为什么它在这种情况下不起作用吗?我刚刚遇到了这个问题,我正试图了解这个解决方案有什么问题。【参考方案11】:如果您想在 Eclipse 中的开发时添加原生库而不干扰 java.library.path
(以避免包含绝对路径和必须向启动配置添加参数),您可以提供原生库位置的路径Native library location 下 Java Build Path 对话框中的每个 Jar。请注意,本机库文件名必须与 Jar 文件名相对应。另请参阅detailed description。
【讨论】:
-1。您假设最终用户正在从 IDE 运行应用程序,这不太可能。 @finnw 我明白你的意思。我发现这个问题正在寻找关于如何在开发过程中在 IDE 中添加本机库的解决方案,而不覆盖java.library.path
并在其他地方找到解决方案后回来。将编辑我的答案以使其更清楚。
实际上我正在使用 Eclipse,即使我没有在问题中提及它。
这实际上在当前版本的 Eclipse(Luna) 中不起作用,因为设置属性会覆盖 java.library.path,就像用户在问题中描述的那样。【参考方案12】:
SWT 将必要的本地 DLL 放入 JAR。搜索“org.eclipse.swt.win32.win32.x86_3.4.1.v3449c.jar”为例。
DLL 必须位于 JAR 的根目录中,必须对 JAR 进行签名,并且 DLL 必须与 META-INF/MANIFEST.MF 中的校验和一起出现,以便 VM 获取它们。
【讨论】:
我如何使用 NetBeans 做到这一点? AFAIK,NetBeans 使用 Ant 构建项目。阅读 Ant 的文档,了解如何创建签名的 JAR 以及如何将 DLL 等内容放入清单中。 如何设置它以在 Eclipse 中添加 .dll? @NoBugs:在 Eclipse 中,这篇文章应该会有所帮助:eclipsezone.com/eclipse/forums/t49342.html @AaronDigulla 您是否建议始终以这种方式附加 DLL?我以为它只搜索java.library.path
之类的东西。您是否建议它只搜索 jar
的根?【参考方案13】:
在 UNIX 系统中,您可以附加到 LD_LIBRARY_PATH 环境变量。在 Windows 上,JVM 自动将系统属性 java.library.path 设置为 PATH;所以如果 dll 在你的 PATH 上,那么你就设置好了。
【讨论】:
线程启动器非常具体地介绍了如何“附加”第二个本机库文件夹,您不同意吗? @user667073 我一直在说同样的事情......附加是问题,线程启动器已经知道如何加载共享库;-) STS 3.4.0 和 Mac OS 10.8:LD_LIBRARY_PATH 的设置对 java.library.path 没有任何影响。我用 Subclipse/JavaHL 对此进行了测试。这个有效: STS --launcher.appendVmargs -vmargs -Djava.library.path=/opt/local/lib 而 export LD_LIBRARY_PATH=/opt/local/lib ; STS 为阴性。【参考方案14】:您可以通过调用System.load() 以编程方式加载您的本机库来解决这个问题吗?此方法(与System.loadLibrary() 不同)允许您指定绝对路径。
【讨论】:
请详细说明在启动 Eclipse 时如何以编程方式调用 System.load()?以上是关于如何使用 Eclipse 启动将本机库添加到“java.library.path”(而不是覆盖它)的主要内容,如果未能解决你的问题,请参考以下文章