昨天我想了一个问题,以下是详细信息:
我有 3 个 JAR 文件,a.jar,b.jar,c.jar。这两个 jars 文件都有一个名为com.test.Test的类,并且sayHello()是在这个类中定义的。
我创建了一个 Web 应用程序,我引用了 a.jar,b.jar,c.jar 。在主要方法中,我涉及 sayHello(); .此时,将加载哪个com.test.Test?
结果是一个.jar。
有人告诉我原因吗??提前致谢!!!
昨天我想了一个问题,以下是详细信息:
我有 3 个 JAR 文件,a.jar,b.jar,c.jar。这两个 jars 文件都有一个名为com.test.Test的类,并且sayHello()是在这个类中定义的。
我创建了一个 Web 应用程序,我引用了 a.jar,b.jar,c.jar 。在主要方法中,我涉及 sayHello(); .此时,将加载哪个com.test.Test?
结果是一个.jar。
有人告诉我原因吗??提前致谢!!!
这就是java语言规范所说的。它加载类路径中第一次出现的类并忽略其他类。
与其关注将加载哪个,不如意识到 JAR 文件中的内容可能需要他们的 com.test.Test
类而不是其他人的 com.test.Test
类才能正常工作。这意味着对于一个功能系统,您必须a.jar
找到一种方法,a.jar's
com.test.Test
而不是在b.jar
. 寻找b.jar
优先于 a.jar's
.
做到这一点的唯一方法是使用一个框架,它在 java 包机制之外添加名称间距。这通常使用多个类加载器来完成,通常每个 JAR 文件一个。您可以自己编写这样的东西(Tomcat 做过),您需要在其中指定跨加载器发现的规则,或者使用类似于OSGi框架的东西。
将使用类路径中首先出现的 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 设置不同的类路径。
如果您使用的是 IDE,例如 eclipse,您可以在项目的属性上修改您的类路径,然后转到 Build Path,然后您有 Order and Export 选项卡,您可以在其中上下移动 jar。顶部的一个将是您的应用程序首先采用的。
您也可以通过编辑项目中名为“classpath”的文件手动执行此操作,然后将您希望应用程序首先使用的 jar 移至顶部。