如何使用Eclipse启动时添加本地库到"java.library.path"(而不是覆盖它)

101

我有一个本地库需要添加到java.library.path中。使用JVM参数-Djava.library.path=path...,我可以按照自己的意愿设置路径。

我的问题是,我的另一个库(pentaho reporting)根据默认的java.library.path(包括系统目录等)搜索字体,而手动设置会覆盖默认路径。

那么:我如何将路径条目添加到默认的java.library.path中,而不是覆盖它(似乎是使用-Djava.library.path完成的)?(我不想手动添加默认路径,这对于部署来说不太好)

编辑:对于缺少的细节我表示抱歉;我正在使用Eclipse。(部署使用JNLP完成,在那里我可以在资源下使用nativelib


1
请查看此问题的已接受答案,对我来说更好:https://dev59.com/gHNA5IYBdhLWcg3wcddk - laher
问题“如何将本地库添加到..”很令人困惑。它可能是关于添加(附加或前置)另一个“库路径”的,即假设Eclipse默认显示类似java.library.path=path1:path2:path3的内容,该问题是如何启动Eclipse以得到java.library.path=my/lib/folder:path1:path2:path3。 - wh81752
14个回答

52

我忘记了这个问题...实际上我是在使用Eclipse时提问的,抱歉当时没有说明。 而答案似乎太简单了(至少在3.5版本中是这样;可能在旧版本中也是):

Java运行配置的参数:VM参数:

-Djava.library.path="${workspace_loc:project}\lib;${env_var:PATH}"

必须记得添加引号,否则路径中含有空格会出现问题。


7
如果有两个共享库,其中一个依赖于另一个,那么这种情况是行不通的。Java运行时会找到第一个库,但第二个库需要系统动态加载器来解决。我所发现的唯一解决方案是设置LD_LIBRARY_PATH。 - kevin cline
5
@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:。 - wh81752
如果您在Eclipse中使用TestNG,则需要编辑TestNG运行配置:
  • 在“运行配置”窗口中,选择目标TestNG配置。
  • 选择“环境”选项卡
  • 添加一个PATH变量并将其值设置为您的目标
  • 保留默认的“将环境附加到本机环境”开关。
- Philippe
我能得到一个例子吗? - basickarl
@kevincline,您能否详细说明为什么在这种情况下它不起作用?我刚遇到了这个问题,正在尝试理解这个解决方案的问题所在。 - anula

14

如果您想在Eclipse的开发期间添加本地库而不会干扰java.library.path(以避免包含绝对路径并且必须向启动配置添加参数),您可以在Java Build Path对话框下的每个Jar中提供本地库位置的路径。请注意,本地库文件名必须与Jar文件名相对应。有关详细说明,请参见此处


5
你假设最终用户从集成开发环境(IDE)中运行应用程序,这种情况不太可能。 - finnw
@finnw 我明白你的观点。我在寻找如何在开发过程中添加本地库到IDE,而不覆盖java.library.path的解决方案时发现了这个问题,并在其他地方找到解决方案后回来了。我会编辑我的答案以使其更清晰明了。 - Fabian Steeg
实际上,我正在使用Eclipse,尽管在问题中没有提到它。 - Touko
在当前版本的Eclipse(Luna)中,这实际上不起作用,因为设置属性会覆盖java.library.path,就像用户在问题中描述的那样。 - Alex N.

9

SWT将必要的本地DLL文件放入JAR中。 查找“org.eclipse.swt.win32.win32.x86_3.4.1.v3449c.jar”以获取示例。

DLL文件必须位于JAR的根目录下,JAR必须已签名,并且DLL文件必须在META-INF/MANIFEST.MF中以校验和的形式出现,以便虚拟机(Virtual Machine)可以识别它们。


2
我该如何在NetBeans中实现它? - Maciek Sawicki
据我所知,NetBeans使用Ant来构建项目。阅读Ant文档以了解如何创建签名的JAR文件以及如何将诸如DLL之类的内容放入清单中。 - Aaron Digulla
我该如何在Eclipse中设置添加.dll文件? - NoBugs
@NoBugs:在Eclipse中,这篇文章应该会有所帮助:http://www.eclipsezone.com/eclipse/forums/t49342.html - Aaron Digulla
@AaronDigulla你认为DLL可能总是以这种方式附加吗?我认为它只会搜索类似于java.library.path的内容。你是否建议它只搜索jar文件的根目录? - user6023611
@user6023611 不,两种方法都可以。这取决于你想要实现什么。如果你有一个现有的系统库想要让Java代码使用,那么java.library.path是正确的选择。对于自己编写的自定义DLL,将它们放入JAR包更容易消费。 - Aaron Digulla

5
在Windows中,可以像这样设置:-Djava.library.path="C:/MyLibPath;%PATH%"。其中%PATH% 是旧的 -Djava.library.path

尝试了这个想法,但结果是java.library.path:D:\Workspace\myProject\lib;%PATH%。 - Touko
你也可以使用 ${system_property:java.library.path}。 - Rob Elsner
2
UNIX/Mac/GNU Linux 的默认值是 LD_LIBRARY_PATH。而 PATH 是 Windows 特有的。 - wh81752

2

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}"

2
在UNIX系统中,您可以将路径添加到LD_LIBRARY_PATH环境变量中。在Windows上,JVM会自动将系统属性java.library.path设置为PATH;因此,如果dll文件在您的PATH中,则已经完成设置。

线程发起者非常明确如何“追加”第二个本地库文件夹,你同意吗? - wh81752
@user667073 我一直在说同样的事情... APPENDING 是问题,主题发起人已经知道如何加载共享库了 ;-) - Ustaman Sangat
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则不行。 - wh81752

2
你可以通过以编程方式调用System.load()来加载你的本地库来解决这个问题吗?这种方法(与System.loadLibrary()不同)允许你指定绝对路径。

1
请详细说明在启动Eclipse时如何以编程方式调用System.load()函数? - wh81752

2
  1. 在Windows系统中:将库的路径添加到PATH环境变量中。
  2. 在Linux系统中:将库的路径添加到LD_LIBRARY_PATH环境变量中。
  3. 在Mac系统中:将库的路径添加到DYLD_LIBRARY_PATH环境变量中。

java.library.path会根据相应平台上述变量的值进行初始化。

这适用于任何IDE。

您可以调用java -XshowSettings:properties来测试该值是否符合您的预期。


1
  1. 打开 Window->Preferences->Java->Installed JREs
  2. 选择当前的JRE(JDK),然后点击Edit
  3. 在 Default VM Arguments 中填写:-Djava.library.path=/usr/local/xuggler/lib

2
这个回答是无用的,因为主题发起者特别询问“如何添加本地库[..]而不是覆盖[..]”。这个回答只是覆盖了默认设置。 - wh81752

1
在上面的评论中,Rob Elsner提供的解决方案非常完美(适用于OSX 10.9,Eclipse Kepler)。一个人必须将他们的额外路径附加到由“:”分隔的路径中。您也可以使用${system_property:java.library.path}。- Rob Elsner Nov 22 '10 at 23:01

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接