昨天我想了一个问题,下面是细节:
我有3个JAR文件,a.jar,b.jar,c.jar。这两个jars文件都有一个名为com.test.Test的类,并且在该类中定义了sayHello()。
我创建了一个web应用程序,我引用了a.jar、b.jar、c.jar。在主要方法中,我涉及sayHello();.at,这一次,将加载哪个com.test.Test?
结果是a.jar。
有人告诉我原因吗??提前谢谢!
发布于 2012-09-25 20:54:18
这就是java 语言规范所说的。它加载类首先在类路径中发生的任何内容,并忽略其他类。
发布于 2012-09-25 21:11:35
与其关注将加载哪些内容,不如认识到JAR文件中的内容可能需要它们的com.test.Test类而不是其他人的com.test.Test才能正常工作。这意味着对于一个功能系统,您必须找到一种方法,使a.jar能够找到a.jar's com.test.Test,而不是b.jar中的那个。同样的情况也适用于b.jar,发现它比a.jar's更喜欢它的类。
要做到这一点,唯一的方法是使用一个框架,它在java包机制之外添加名称间隔。这通常是通过多个类加载器完成的,通常每个JAR文件都有一个。您可以自己编写这样的东西(托姆凯特),您需要指定跨加载器发现的规则,或者使用类似于OSGi框架的东西。
发布于 2012-09-25 20:54:28
无论哪个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设置不同的类路径。
https://stackoverflow.com/questions/12590884
复制相似问题