Cha*_*lie 26 java platform-independence java.library.path
到目前为止,我已经了解了有关java.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}}
Run Code Online (Sandbox Code Playgroud)
Ian*_*ird 16
这不是一个完全不合理的问题,但是没有好的答案,所以对后人来说,我会尝试解释你为何陷入困境,以及为什么它不起作用.
java.library.path不保证根据环境变量设置.您可以指定您想要的内容-Djava.library.path=.很可能,这是你真正想做的事情.这就是选项存在的原因.
事实证明(至少在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<String, String> 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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
你会注意到它运行时,它打印的前两个东西是不同的.如果Java正在使用windows PATH变量,那么它首先要摆弄这个值.我放弃了调查正在发生的事情.关键是,没有一个与之完全匹配的环境变量java.library.path.我没有试过Linux或OSX,你的里程可能会有所不同
像这样混淆某人的环境变量真的不太好.它们用于整个shell,因此您要让用户在其环境中使用共享库,但有时仅限于此.改变的唯一真正原因java.library.path是添加本机库.如果您正在使用本机库,那么您已经拥有特定于操作系统的代码(必须为平台编译,对吧?),所以您已经放弃了"没有平台特定的边缘情况"的斗争.最好的办法是将您的本机库放在系统路径(可能是任何可能的)已经找到它的位置,或者使用某种安装程序永久地将库的路径添加到它.如果您不想做其中任何一项,那么我建议使用@ malat代码的变体,打印真实内容java.library.path,然后在脚本中附加您的路径到该结果,然后使用该-D选项进行设置对于真正的程序运行.
mal*_*lat 10
在我的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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
43650 次 |
| 最近记录: |