2013-10-16 136 views
0

我有几个罐子包含完全相同的类。相同的类是在多个罐子

可以说例如,A.jar和B.jar具有相同的类Hello.class。 ; B.jar com.testing.testcode

我的问题是,它是否将运行与否

的java -classpath a.jar文件:如果我运行下面会发生什么?从我理解的类加载器将扫描类路径,它将返回首先找到的任何Hello.class。

我知道我可以避免这个问题,如果我使用OSGi加载一个特定的类。

但我的问题是 - 这是否会运行?或者,java -classpath A.jar; B.jar com.testing.testcode将由于具有相同类的两个版本而分解。

+0

运行它时发生了什么?结果是否令人困惑? –

+0

只要您不使用冲突类,编译器就会保持沉默,只要您使用,就需要使用package.classname格式。其他代码不会编译。 –

+0

那么,当你尝试时发生了什么? – scottb

回答

3

这会工作,并在类路径中的第一个Hello类将在这种情况下使用,因此,从a.jar文件

+1

*通常*会起作用,类路径中的第一个类将是使用的类。但是,在某些情况下,引用问题类的类可能会在引用类的jar中为该版本“表示偏好”。这可能会导致“相同”类被加载两次,这并不总是一个问题,但可以。 –

+0

Thx为澄清 –

+1

如何可能出现一种情况,即它将如何表达偏好“的引用类的jar中的版本? – Exploring

0

类路径之一是“路径”。第一场比赛是采取的。

有一个引导类路径首先被检查,这包括JRE中的JAR。顺便说一句,你可以预先设置这些并覆盖系统类,但你不应该在许可协议中被允许。

0

无论何时将jar包括到类路径中,启动时/应用程序类都会加载到容器中。

现在你的代码是否将工作或没有将取决于罐子被第一次加载在你的容器,因此,如果你是幸运的,然后在您的当前设置,将工作否则你可能得到一些错误,指出method1 doesn't accept Type1 it should accept Type2

+0

或者你可能会得到一个类将TheClass转换为TheClass,如果TheClass被加载两次。 –

相关问题