JAVA ClassLoader的类名相同

时间:2012-09-25 20:53:07

标签: java java-ee

昨天我想到了一个问题,下面是细节:

我有3个JAR文件, a.jar b.jar c.jar 。这两个jar文件都有一个名为 com.test.Test 的类,并且在此类中定义了 sayHello()

我创建了一个Web应用程序,我引用了a.jar,b.jar,c.jar。在main方法中,我涉及sayHello(); 。这次,哪个com.test.Test会加载?

结果是a.jar。

任何人告诉我原因?提前谢谢!!!

4 个答案:

答案 0 :(得分:3)

这就是java language specification所说的。它会加载类在类路径中首次出现的内容,并忽略其他内容。

答案 1 :(得分:1)

不要专注于将加载哪一个,而是要意识到JAR文件中的内容可能需要他们的 com.test.Test类而不是其他人的 {{ 1}}正常工作。这意味着对于功能系统,您必须让com.test.Test找到a.jar a.jar's而不是com.test.Test中的那个。 b.jar优先于 b.jar找到它的类也是如此。

执行此操作的唯一方法是使用添加名称间距超出 java包机制的框架。这通常使用多个类加载器完成,通常每个JAR文件一个。你可以自己编写这样的东西(Tomcat did),你需要指定交叉加载器发现的规则,或者使用类似于OSGi框架的东西。

答案 2 :(得分:0)

将使用您的类路径中首先出现的Jar文件。 您可以将CLASSPATH环境变量修改为Jar文件的路径

假设你修改如下: -

set CLASSPATH = %CLASSPATH%;.;a.jar;b.jar

然后将使用a.jar ..

您也可以通过以下方式修改它: -

set CLASSPATH = %CLASSPATH%;.;b.jar;a.jar

在这种情况下,将使用b.jar .. 您需要从Command Line ..

运行这些命令

**注意: - 如果您使用的是任何IDE,则它们不使用系统类路径。您需要为正在使用的IDE设置不同的类路径..

答案 3 :(得分:0)

如果您使用的是IDE,例如eclipse,您可以在项目的属性上修改类路径,然后转到Build Path,然后您可以在Order and Export选项卡中向上和向下移动jar 。顶部之一将是您的应用程序首先采用的。

您也可以通过编辑项目中名为“classpath”的文件手动完成,然后移动到您希望应用程序首先使用的jar的顶部。