2

昨天我想了一个问题,以下是详细信息:

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

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

结果是一个.jar。

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

4

4 回答 4

3

这就是java语言规范所说的。它加载类路径中第一次出现的并忽略其他类。

于 2012-09-25T20:54:18.613 回答
1

与其关注将加载哪个,不如意识到 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框架的东西。

于 2012-09-25T21:11:35.363 回答
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 设置不同的类路径。

于 2012-09-25T20:54:28.597 回答
0

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

您也可以通过编辑项目中名为“classpath”的文件手动执行此操作,然后将您希望应用程序首先使用的 jar 移至顶部。

于 2012-09-25T21:18:22.453 回答