java.library.path和classpath之间有什么关系?

12
我正在寻找一个简单的解释来说明java.library.path和classpath之间的关系。虽然我不是新手,但我从未涉及过j.l.p。但是,我们在参与的WebSphere MQ应用程序中遇到了问题,我们想要开启追踪功能。不幸的是,一旦我告诉IBM我们重新打包了MQ jars以便通过Maven部署,除非我们将WebSphere MQ jars与java.library.path一起加载,否则他们甚至不会和我谈论这个问题。
那么,我们可以重新制定整个部署策略。我可以接受这种代价,但我的问题在于:
java.library.path和classpath之间的关系是什么? j.l.p上的类对编译器可见吗?你是否必须在编译器的命令行中指定j.l.p?你可以同时在j.l.p和classpath上指定这些类吗?哪个优先级更高?
请不要因为研究不足而批评这个问题。当然,我已经谷歌了“java.library.path”。当然有无数的结果。我尝试进行高级谷歌搜索,将表达式限制在oracle.com网站上。还是有无数的结果。我尝试谷歌两个术语。得到很多质量存疑的新手解释。我尝试搜索Java语言规范。没有结果。
我想要一个简明扼要且权威的解释。有人能指导我吗?
更新 - IBM坚持认为,除非我使用-Djava.library.path = {path to MQ jars}加载应用程序,否则他们的MQ跟踪功能将无法正常工作,并且即使我拥有服务合同,他们也不会支持我,除非我以这种方式进行操作。当然,我有引用这些类的代码,必须编译。这是本问题背后的动机。
1个回答

16
什么是java.library.path和classpath之间的关系?
它们之间没有关系,它们唯一的共同点是它们都是路径。
j.l.p上的类对编译器可见吗?
不。
您必须在编译器的命令行中指定j.l.p吗?
从不。您只需要在运行时这样做。
您可以在j.l.p和classpath上同时指定这些类吗?
只需将类放在类路径上即可。
j.l.p相当于LD_LIBRARY_PATH,告诉OpenJDK/HotSpot JVM在哪里找到共享本地库,例如.DLL或.so,而不是JARS,也不是类。

http://examples.javacodegeeks.com/java-basics/java-library-path-what-is-it-and-how-to-use/


谢谢你提供的链接,Peter。我认为MQ的一些JAR包确实是本地代码(Java的MQ类是C的封装器),所以这可能是合适的。但是,我已经将它们从类路径中运行了好几年,没有任何问题,直到我需要打开这个跟踪设施。 - Steve Cohen
1
你不能将JAR文件作为本地库加载,操作系统不支持这样做。你可以将本地库放在JAR文件中,但唯一的加载方式是将其提取到文件系统中,然后使用System.load()显式地加载它。MQ库可能会以一种意外的方式使用java.library.path,即库可以解析并使用任何它想要的属性。 - Peter Lawrey

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