首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CLASSPATH vs java.ext.dirs

CLASSPATH vs java.ext.dirs
EN

Stack Overflow用户
提问于 2011-02-18 17:57:56
回答 3查看 42.2K关注 0票数 21

有什么理由支持在应用程序运行期间使用(可能很长) CLASSPATH变量来设置哪些jars应该在类路径上,然后使用java 1.5+属性-Djava.ext.dirs来指定要搜索的jars的整个目录(目录)?

为了让它成为真实的例子,我有一个独立的java应用程序,它的lib文件夹包含所有依赖的jars。到目前为止,启动脚本将所有(可能20个) jars逐个设置为CLASSPATH变量。因为现在我的应用程序归档是由Maven生成的,所以我不能提前看到jar的名称(例如,我更改了JAR的版本)。当然,我可以遍历启动脚本中的lib目录,并再次将在那里找到的所有jars添加到CLASSPATH变量中。或者让maven为我生成这个脚本。

问题:通过简单地将java.ext.dirs属性设置为包含它所包含的内容+我脚本中的额外lib目录,替换所有这些内容是否合适?有什么隐含的注意事项吗?

感谢您的回复。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-18 18:08:15

java.ext.dirs有一个非常特殊的用途:它用于指定extension mechanism从何处加载类。它用于向JRE或其他库(如JAI)添加功能。它并不是一种通用的类加载机制。

请改用wildcard character *。它是在Java6中引入的,所以很多人仍然不知道这是可能的。

票数 38
EN

Stack Overflow用户

发布于 2014-08-23 23:54:26

Joachim对通配符的快捷方式提出了一个很好的观点。但由于问题是询问不同之处和需要注意的事项...

一个不同之处是,如果我们在-Djava.ext.dirs标志下指定我们的库,它们将是 (例如sun.misc.Launcher.ExtClassLoader)而不是系统类加载器(例如sun.misc.Launcher.AppClassLoader)。

假设在我们的库中,我们有一个名为Lib的类。我们的应用程序运行以下代码:

代码语言:javascript
运行
复制
public class Main {
    public static void main(String args[]) {
        System.out.println(System.getProperty("java.ext.dirs"));
        ClassLoader test_cl = Main.class.getClassLoader();
        ClassLoader lib_cl = Lib.class.getClassLoader();
        System.out.println(test_cl == lib_cl);
        System.out.println(test_cl);
        System.out.println(lib_cl);
    }
}

控制台输出将为:

代码语言:javascript
运行
复制
C:\Program Files\Java\jdk1.6.0\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext
true
sun.misc.Launcher$AppClassLoader@107077e
sun.misc.Launcher$AppClassLoader@107077e

当使用命令java -cp "folder/*;." Main运行应用程序时。

但是,当使用命令java -Djava.ext.dirs=folder Main运行应用程序时,输出将改为:

代码语言:javascript
运行
复制
folder
false
sun.misc.Launcher$AppClassLoader@107077e
sun.misc.Launcher$ExtClassLoader@7ced01
票数 6
EN

Stack Overflow用户

发布于 2011-02-18 18:33:18

将内容放在lib.ext目录中的一个大问题是,不同的应用程序可能需要不同版本的库,并且这些库很可能相互冲突。

想想Windows 3时代的旧DLL地狱(如果你还记得的话),当时出现了类似的情况,许多(如果不是大多数)软件开发人员将共享库放在Windows/System目录中,因为它们是自动从那里获取的,而不是将它们包含在应用程序中并显式加载它们。

相反,您想要的是为每个应用程序设置一个单独的类路径(因此没有系统级类路径!),并在其启动脚本中设置,并且只指向适用于该特定应用程序的那些jar文件和类目录。这样,具有冲突库需求的几个应用程序可以并排启动,而不会干扰彼此的功能。

如果你是一名开发人员,你不希望任何外部库在测试应用程序时干扰你的应用程序,情况就更是如此。还有一件事:如果您正在开发和使用lib/ext技巧(或系统级类路径),您如何确保将要发布的应用程序附带正确的库?如果您忘记在您的安装程序或安装包中包含,您永远不会注意到,因为它在您的机器上的一个共享位置。但是,没有该库的客户会收到运行时错误,并且很快就会打电话要求支持(可能还会退款,并在媒体上给你一个有缺陷的产品的负面评价)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5039862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档