首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JAVA ClassLoad同名

JAVA ClassLoad同名
EN

Stack Overflow用户
提问于 2012-09-25 20:53:06
回答 4查看 110关注 0票数 2

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

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

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

结果是a.jar。

有人告诉我原因吗??提前谢谢!

EN

回答 4

Stack Overflow用户

发布于 2012-09-25 20:54:18

这就是java 语言规范所说的。它加载类首先在类路径中发生的任何内容,并忽略其他类。

票数 3
EN

Stack Overflow用户

发布于 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框架的东西。

票数 1
EN

Stack Overflow用户

发布于 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设置不同的类路径。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12590884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档