如何在Eclipse启动时将本机库添加到“ java.library.path”(而不是覆盖它)


90

我有一个本机库,需要添加到java.library.path中。使用JVM参数-Djava.library.path = path ...我可以根据需要设置路径。

我的问题是我的其他库(pentaho报告)基于默认的java.library.path(包括系统目录等)搜索字体,而手动设置覆盖了默认路径。

因此:如何路径条目添加到默认java.library.path而不是覆盖它(这似乎是通过-Djava.library.path完成的)?(我不想手动添加默认路径,这对于部署来说不是很好)

编辑:对不起,缺少详细信息;我正在使用Eclipse。(部署是通过JNLP完成的,在那里我可以在资源下使用 nativelib


1
请参阅接受的答案对于这个问题,而不是-对我来说要好得多:stackoverflow.com/questions/957700/...
laher

问题“如何将本地库添加到..”令人困惑。这可能是关于添加(添加或添加)另一个“库路径”的,即假设默认情况下Eclipse显示类似java.library.path = path1:path2:path3的内容,问题是如何启动以java.library结尾的Eclipse .path = my / lib / folder:path1:path2:path3
whaefelinger 2014年

Answers:


46

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

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

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

一定不要忘记引号,否则PATH中的空格有问题。


7
如果有两个共享库,一个依赖于另一个,则此库将不起作用。第一个由Java运行时找到,但是第二个由系统动态加载程序解决。我发现的唯一解决方案是设置LD_LIBRARY_PATH。
凯文·克莱恩

4
@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 :。
whaefelinger 2014年

如果在Eclipse中使用TestNG,则需要编辑TestNG运行配置:-在“运行配置”窗口中,选择目标TestNG配置。-选择环境选项卡-添加PATH变量并将其值设置为目标-保留默认的“将环境附加到本机环境”切换。
菲利普2014年

我可以举个例子吗?
basickarl 2014年

@kevincline您想详细说明为什么在这种情况下它不起作用吗?我刚刚遇到了这个问题,并且试图了解该解决方案出了什么问题。
anula 2015年

14

如果要添加本机库而不干扰java.library.pathEclipse在开发时的使用(以避免包含绝对路径,而不必在启动配置中添加参数),则可以为Java Build中的每个Jar提供到本机库位置的路径。机库位置下的路径对话框。请注意,本机库文件名必须与Jar文件名相对应。另请参见此详细说明


3
-1。您假设最终用户正在从IDE运行应用程序,这不太可能。
finnw 2010年

@finnw我明白你的意思了。我发现了一个问题,寻找关于如何在开发过程中在IDE中添加本机库java.library.path的解决方案而又没有覆盖的问题,在找到其他解决方案后又回来了。将编辑我的答案以使其更清楚。
Fabian Steeg,2010年

实际上,尽管我没有在问题上提到它,但我正在使用Eclipse。
Touko

实际上,这在当前版本的Eclipse(Luna)中不起作用,因为设置属性会覆盖java.library.path,就像用户描述的那样是问题所在。
亚历克斯N.

9

SWT将必要的本机DLL放入JAR。搜索“ org.eclipse.swt.win32.win32.x86_3.4.1.v3449c.jar”作为示例。

DLL必须在JAR的根目录中,必须对JAR进行签名,并且DLL必须在META-INF / MANIFEST.MF中带有校验和,以供VM提取。


2
如何使用NetBeans做到这一点?
Maciek Sawicki 2009年

AFAIK,NetBeans使用Ant来构建项目。阅读有关Ant的文档,了解如何创建签名的JAR以及如何将DLL之类的东西放入清单中。
亚伦·迪古拉

如何在Eclipse中设置它以添加.dll?
NoBugs 2012年

@NoBugs:在Eclipse中,此帖子应该有所帮助:eclipsezone.com/eclipse/forums/t49342.html
亚伦·迪古拉

@AaronDigulla您是否建议DLL总是以这种方式连接?我以为它只会搜索类似的内容java.library.path。您是否建议仅搜索根目录jar

4

在Windows中,如下所示:

-Djava.library.path =“ C:/ MyLibPath;%PATH%”

%PATH%是您的旧-Djava.library.path


尝试过这个想法,但结果为java.library.path:D:\ Workspace \ myProject \ lib;%PATH%
Touko 2010年

您还可以使用$ {system_property:java.library.path}
Rob Elsner,2010年

2
在UNIX / Mac / GNU Linux上,默认值为LD_LIBRARY_PATH。PATH是Windows的东西。
whaefelinger 2013年


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

1

在UNIX系统中,您可以附加到LD_LIBRARY_PATH环境变量。在Windows上,JVM自动将系统属性java.library.path设置为PATH。因此,如果dll位于您的PATH上,那么您已设置好。


线程启动器非常具体地介绍了如何“附加”第二个本机库文件夹,您不同意吗?
whaefelinger 2013年

@ user667073我一直在说同样的话...附加的问题是,线程启动器已经知道如何加载共享库;-)
Ustaman Sangat 2013年

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,而导出LD_LIBRARY_PATH = / opt / local / lib;STS曾是负面的。
whaefelinger 2014年

1

窗口->首选项-> Java->已安装的JRE。然后选择您当前的JRE(JDK),然后单击“编辑”。填写默认VM参数:-Djava.library.path = / usr / local / xuggler / lib。做完了!


1
这个答案没有用,因为线程启动器专门询问“如何添加本机库[..]而不是覆盖[..]”。此答案仅覆盖默认设置。
whaefelinger 2014年

1

Rob Elsner在上述评论之一中提供的解决方案可以完美地工作(OSX 10.9,Eclipse Kepler)。必须将其附加路径附加到以“:”分隔的路径上。

您还可以使用$ {system_property:java.library.path} – Rob Elsner,2010年11月22日,23:01


0

本机库文件名必须与Jar文件名相对应。这是非常非常重要的。请确保jar名称和dll名称相同。另外,请参阅Fabian Steeg的文章。我的下巴下载包含dll和jar的不同名称。它是jawin.jar和jawin d .dll,请注意dll文件名中额外的“ d”。我只是将其重命名为jawin.dll,并将其设置为eclipse中的本机库,如文章“ http://www.eclipsezone.com/eclipse/forums/t49342.html ”中所述


问题是关于在启动Eclipse时添加本机库(文件夹)。
whaefelinger 2014年

0

由于某种原因,我无法使多个文件夹正常工作(好一阵子了,但是当我需要更多的dll并添加了更多的文件夹时,路径中都没有空格)。然后,我将所有需要的dll复制到一个文件夹中,并将其作为java.library.path并成功运行。我没有解释-如果有人这样做,那就太好了。


好吧,如果通过java.library.path找到了本机库,然后将另一个库复制到该文件夹​​中,那么很自然地,第二个库也被找到了,不是吗?
whaefelinger 2013年

当然,这就是为什么我用它,du!我想知道的是,是否可以向其中添加多个文件夹而不必移动或符号链接东西。
Ustaman Sangat

0

许多现有答案都假定您要为特定项目设置此设置,但是我需要为Eclipse 本身设置此设置,以便支持对SQL Server JDBC驱动程序的集成身份验证。

为此,我按照以下说明从Java命令行而不是其正常启动器启动Eclipse。然后,我刚刚修改了该脚本,以将-Djava.library.path参数添加到Java命令行中。


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

java.library.path 在相应的平台上使用上述变量的值进行初始化。

这应该可以在任何IDE上运行。

您可以通过调用以下命令测试该值是否符合期望 java -XshowSettings:properties


-2

在Windows上,我发现重要的是从命令行而不是从“开始”菜单或快捷方式启动Eclipse,前提是本机DLL位于PATH的目录中。显然,这可以确保路径上有正确的目录。


如果我错了,请纠正我,但我相信搜索DLL(或可执行二进制文件)时会自动包含Windows上的当前工作目录。因此,当您切换到DLL所在的文件夹并开始然后启动Eclipse时,是的,找到了您要查找的DLL。除此之外,这个答案与线程启动程序问题有什么关系?
whaefelinger 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.