JAVA类加载相同的类名

JAVA类加载相同的类名,java,jakarta-ee,Java,Jakarta Ee,昨天我想了一个问题,下面是细节: 我有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就是这么说的。它加载类第一次出现在类路径中的内容,并忽略其他内容。这就是java所说的。它

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

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

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

结果是一个.jar


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

java就是这么说的。它加载类第一次出现在类路径中的内容,并忽略其他内容。

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

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

假设您对其进行如下修改:-

设置类路径=%CLASSPATH%;。;a、 罐子;b、 jar

然后将使用.jar

您也可以通过以下方式对其进行修改:-

设置类路径=%CLASSPATH%;。;b、 罐子;a、 jar

在这种情况下,将使用b.jar。。 这些命令需要从
命令行运行


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

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

假设您对其进行如下修改:-

设置类路径=%CLASSPATH%;。;a、 罐子;b、 jar

然后将使用.jar

您也可以通过以下方式对其进行修改:-

设置类路径=%CLASSPATH%;。;b、 罐子;a、 jar

在这种情况下,将使用b.jar。。 这些命令需要从
命令行运行


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

不要关注加载哪一个,要知道JAR文件中的内容可能需要它们的
com.test.test
类,而不是其他人的
com.test.test
才能正常工作。这意味着对于一个功能系统,你必须找到一种方法,让
a.jar
找到
a.jar的
com.test.test
,而不是
b.jar
中的方法。同样的道理也适用于
b.jar
查找优先于
a.jar的类


唯一的方法是使用一个框架,在java包机制之外增加名称间隔。这通常是通过多个类加载器完成的,通常每个JAR文件一个类加载器。您可以自己编写这样一个东西(),在这里您需要指定交叉加载程序发现的规则,或者使用类似于框架的东西。

而不是专注于加载哪一个,认识到JAR文件中的东西可能需要它们的
com.test.test
类而不是其他人的
com.test.test
才能正常工作。这意味着对于一个功能系统,你必须找到一种方法,让
a.jar
找到
a.jar的
com.test.test
,而不是
b.jar
中的方法。同样的道理也适用于
b.jar
查找优先于
a.jar的类


唯一的方法是使用一个框架,在java包机制之外增加名称间隔。这通常是通过多个类加载器完成的,通常每个JAR文件一个类加载器。您可以自己编写这样一个东西(),在这里您需要指定交叉加载程序发现的规则,或者使用类似于框架的东西。

如果您使用的是IDE,例如eclipse,您可以修改项目属性上的类路径,然后转到构建路径,然后你有订单和出口标签,在那里你可以上下移动罐子。顶部的一个将是您的应用程序的第一个


您还可以手动编辑项目中名为“classpath”的文件,并移动到您希望应用程序首先使用的jar顶部。

如果您使用的是IDE,如eclipse,则可以在项目属性上修改类路径,然后转到Build Path,然后你有订单和出口标签,在那里你可以上下移动罐子。顶部的一个将是您的应用程序的第一个


您还可以手动编辑项目中名为“classpath”的文件,并移动到您希望应用程序首先使用的jar的顶部。

您可以通过让sayHello方法打印与其他方法稍有不同的内容,轻松地进行测试。是的,我这样做了。a、 罐子被装上了。我想知道为什么:)哦,对不起。我错过了你回答你自己问题的部分。你可以通过让sayHello方法打印出与其他方法稍有不同的内容来轻松地测试它。是的,我这样做了。a、 罐子被装上了。我想知道为什么:)哦,对不起。我错过了你回答自己问题的部分。为什么b.jar不是第一个出现在classpath中。classpath由你设置。您可以修改类路径,将b.jar作为第一个,将a.jar作为第二个。为什么b.jar排名第二?你需要告诉我们。JVM不会限制您移动,除非b.jar对a.jar.ok有一些依赖关系,但是如果在web应用程序中?我将这些jar放在/web inf/lib/下。我没有修改类路径。如果它们在WEB\u INF/lib中,则无法控制。正如埃德温所说,您需要重新考虑您的打包结构。类路径中有多个jar的东西是jar地狱的一个很好的例子:-)您可能对JBoss模块或OSGi感兴趣,它允许您将jar/类放入不同的包/模块中,这些包/模块对于指定的客户机是可见的classpath.classpath由您设置。你