使用Java扩展机制加载所有JAR包
作者:网络转载 发布时间:[ 2015/1/5 10:36:38 ] 推荐标签:软件开发 java

这张图展示了,给在扩展目录中的JAR文件重命名为没有后缀的文件并不妨碍类加载器加载JAR文件中的类。换句话说,类加载机制是通过文件类型而不是文件名或后缀来加载所有在扩展目录中的JAR文件的。正如可选包(Optional Package)概览所总结的,“JAR文件本身没有什么特别的地方,其中包含的class文件也没有让JAR成为已安装过的可选包。只有位于jre/lib/ext下,才可能让JAR成为已安装的可选包。”
在扩展目录中放包含太多类定义的JAR会有一些风险和负面效果。例如,当我们看到classpath中所指定的类方法存在,还报出NoSuchMethodErrors异常,会令人非常恼火。这是我以前写过众多可以导致NoSuchMethodError问题的其中一个。但是忘记扩展目录下JAR文件中的过时(outdated)和废弃的(obsolete)类是另一个潜在的原因。接下来会展示这一点。
接下来的两段代码展示了Main.java和HelloWorld.java修改后的版本。特别要注意的是,HelloWorld有一个全新的方法,这个 方法会被新版本的Main调用。在这个例子中,我会把新编译的HelloWorld.class文件和Main放在同一个目录下。这样当我运行Main 的时候,能证明扩展目录下的JAR中过时的类会比当前目录下的新类优先加载。
修改后的Hello World.java(新方法)
public class HelloWorld
{
@Override
public String toString()
{
return "Hello, World!";
}
public String directedHello(final String name)
{
return "Hello, " + name;
}
}
修改后的Main.java
import static java.lang.System.out;
public class Main
{
public static void main(final String[] arguments)
{
final HelloWorld helloWorld = new HelloWorld();
out.println(helloWorld);
out.println(helloWorld.directedHello("Dustin"));
}
}

后一张截图展示了,扩展目录下过时的HelloWorld类优先于同一目录下的新定义的HelloWorld类加载。甚至当我把当前目录写进 classpath中,扩展目录下的旧版本的类仍然优先。接下来的图也同样展示了扩展目录下的JAR文件“隐藏”了更新的JAR以及其中类的新方法。这些扩展目录下的JAR文件甚至都不是以.jar结尾的。

sales@spasvo.com