运行java -cp和实现类加载器之间的区别

时间:2014-11-30 15:27:18

标签: java jvm classpath classloader

我想知道在运行我的Java应用程序与-cp命令行开关(提供文件夹或jar列表)和实现类加载器(例如,使用URLClassLoader类)之间是否存在任何功能差异加载类。

示例代码:

// -cp approach
java -jar <myjar.jar> -cp ~/folder/with/jars

另一种方法:

// URLClassLoader approach. urls is an array that points to the .jars under ~/folder/with/jars
URLClassLoader loader = new URLClassLoader(urls);
loader.findClass(...);

2 个答案:

答案 0 :(得分:1)

嗯,首先,在您的示例中使用类加载器意味着源代码中的硬编码路径,与-cp不同。

另外,你自己负责加载课程,而不是让jvm解决它们。看起来很多不必要的额外代码给我,除非有充分的理由这样做。

另一个区别(以及类加载器的优点)是能够按需加载它们。

答案 1 :(得分:1)

在我的OpenJDK 7中,系统ClassLoadersun.misc.Launcher$AppClassLoader的实例,而URLClassLoader的实例又是使用系统属性java.class.path中的文件创建的AppClassLoader的子类

正如您所看到的,在我的环境中,似乎没有重要的功能差异,尽管存在差异(例如,此ClassLoader.registerAsParallelCapable()已注册为“并行能力”ClassLoader,见{{1}} javadoc)。

由于Java是可移植的,我想JVM的其他实现可能会使用类似的机制。所以在我看来,没有重要的功能差异。也许默认权限政策,扩展等方面存在差异,我认为这些方法不起作用。