有人可以解释JAR文件和Java类加载器如何使用/usr/share/java
吗?这是一个特殊的目录,JVM将执行自动JAR加载和类查找,但没有其他目录吗?
例如,如果x.jar
取决于y.jar
。如果两个jar都在/usr/share/java
,则在加载y.jar
时会找到x.jar
依赖项。但是当从任何其他目录加载x.jar
时,我必须在类路径上明确地放置y.jar
,即使它仍然与x.jar
在同一目录中。这是为什么?
有没有办法让其他目录的行为像/usr/share/java
?
答案 0 :(得分:2)
这完全取决于您的classpath。
除了Debian安装从其包管理器下载的jar之外,/usr/share/java
没有什么特别之处。我假设只要包管理器安装的java程序需要它们,它们就会被添加到类路径中。
答案 1 :(得分:2)
根据您的发行版,/usr/share/java
可能属于系统属性java.ext.dirs
中指定的目录。文章Extension Mechanism Architecture更详细地解释了这一点。此类扩展的位置取决于平台和版本,如Installed Extensions中所述。
附录:您可以使用以下代码行检查平台上的属性:
System.out.println(System.getProperty("java.ext.dirs"));
附录:仔细观察,/usr/share/java
没有出现在任何系统属性中;效果可能是由于相关JAR清单的Class-Path
属性。使用这个方便的utility,可以检查它们。
/usr/share/java/ant-bootstrap.jar Class-Path: ant.jar xml-apis.jar xercesImpl.jar xalan.jar /usr/share/java/openoffice/java_uno.jar Class-Path: jurt.jar ridl.jar ../../lib/ ../bin/ /usr/share/java/openoffice/juh.jar Class-Path: ridl.jar jurt.jar ../../lib/ ../bin/ /usr/share/java/openoffice/jurt.jar Class-Path: ridl.jar unoloader.jar ../../lib/ ../bin/