我可以找出当前平台上java.library.path映射到的变量吗?
到目前为止,我已经了解了有关java.library.path属性的以下内容:
- 它在加载本机库时使用,而不是java类
- 其默认值取决于操作系统:
- 在Windows上,它映射到PATH
- 在Linux上,它映射到LD_LIBRARY_PATH
- 在OS X上,它映射到DYLD_LIBRARY_PATH
(如果我误解了上述任何一项,请纠正我)
我的动机:
我想从我设置的框架中修改Java应用程序看到的java.library.path的值,以调用Java应用程序。 我想这样做不是通过直接设置java.library.path属性,而是通过修改它映射到的系统路径变量。 我想要一个干净的方法来做这个没有丑陋的操作系统特定代码或尽可能省略边缘情况。
我的问题:
有没有办法要求本地Java实现java.library.path映射到哪个环境变量?
然后,在shell脚本中,我可以写下以下内容:
path_var = get_library_path_variable # the magic function I want to call ${path_var} = /my/custom/path:${${path_var}}
这不是一个完全不合理的问题,但是没有好的答案,所以对后人来说,我会尝试解释你为何陷入困境,以及为什么它不起作用。
-
根本不保证从环境变量设置
java.library.path
。 您可以使用-Djava.library.path=
指定您想要的内容。 更有可能的是,这是你真正想做的事情。 这就是选项存在的原因。 -
事实certificate(至少在Windows上),您正在寻找的环境变量不仅仅是不受干扰的。 试试这个代码。
package com.stackoverflow; import java.util.Map; public class LibPathFinder { public static void main(String[] args) { String javaLibPath = System.getProperty("java.library.path"); Map
envVars = System.getenv(); System.out.println(envVars.get("Path")); System.out.println(javaLibPath); for (String var : envVars.keySet()) { System.err.println("examining " + var); if (envVars.get(var).equals(javaLibPath)) { System.out.println(var); } } } } 你会注意到它运行时,它打印的前两件事情是不同的。 如果Java使用的是Windows
PATH
变量,那么它首先会摆弄该值。 我放弃了调查正在发生的事情。 关键是,没有一个与java.library.path
完全匹配的环境变量。 我没有试过Linux或OSX,你的里程可能会有所不同 -
弄乱像这样的人的环境变量真是不太好。 它们用于整个shell,因此您要让用户在其环境中使用共享库,但有时仅限于此 。 更改
java.library.path
的唯一真正原因是添加本机库。 如果您正在使用本机库,那么您已经拥有特定于操作系统的代码(必须为平台编译,对吧?),因此您已经放弃了“没有特定于平台的边缘情况”的争夺。 最好的办法是将您的本机库放在系统路径(可能是任何可能的)已经找到它的位置,或者使用某种安装程序永久地将库的路径添加到它。 如果您不想做其中任何一项,那么我建议使用@ malat代码的变体,打印真正的java.library.path
,然后在脚本中附加您的路径到该结果,然后使用-D
选项为实际程序运行设置它。
在我的linux机器上,这是我要做的:
$ cat GetSystemProperty.java import java.util.Properties; import java.util.Enumeration; public class GetSystemProperty { public static void main(String args[]) { if( args.length == 0 ) { Properties p = System.getProperties(); Enumeration keys = p.keys(); while (keys.hasMoreElements()) { String key = (String)keys.nextElement(); String value = (String)p.get(key); System.out.println(key + " : " + value); } } else { for (String key: args) { System.out.println(System.getProperty( key )); } } } } $ javac GetSystemProperty.java $ java GetSystemProperty java.library.path /usr/lib/jvm/java-6-openjdk/jre/lib/amd64/server:/usr/lib/jvm/java-6-openjdk/jre/lib/amd64:/usr/lib/jvm/java-6-openjdk/jre/../lib/amd64:/usr/java/packages/lib/amd64:/usr/lib/jni:/lib:/usr/lib
- 我希望抛出exception时退出程序的最佳方法是什么?
- 在xml中定义Spring @PropertySource并在Environment中使用它
- Springvalidation器:同时具有注释和validation器实现
- JTextArea setText()和UndoManager
- java.lang.NoSuchMethodError:org.slf4j.spi.LocationAwareLogger.log(Lorg / slf4j / Marker; Ljava / lang / String; ILjava / lang / String; [Ljava / lang / Obje
- Concat整数到字符串 – 从性能和内存的角度来看,使用字符串文字或原语?
- 如何从eclipse / osgi应用程序中包含对jar文件的依赖?
- JComboBox确定项目是否在下拉列表中不可见
- 如何在H2中解决JSON列