2013-04-29 71 views
4

我不明白的Java是如何知道的任何规格的实现..Java如何找到规范实现?

例如,我有一个Spring应用程序使用JSF,如果我放在classpath中应用的工作原理的钻嘴鱼科罐子,但我没有做什么但是将它添加到classpath中,全部没有配置

如果我拿出Mojarra罐子,那么我的应用程序不起作用。

即使在没有任何改变的情况下,Mojarra或MyFaces如何区分?

我只是想知道的Java如何找到的实现,不为什么,如果我拿出罐子不工作;)

+1

Java只是寻找要加载的类名。它检查它的构建路径并通过所有的jar文件和其他库工作,直到它找到它所寻找的类文件的实现。 – 2013-04-29 19:55:54

+3

@MaheshGuruswamy可能会发布一个答案? – 2013-04-29 19:57:13

+0

@LuiggiMendoza,我确实发布了一个答案。它为OP提供了一个提示,以查找类加载以及它在Java中的工作方式。 – 2013-04-29 20:02:09

回答

0

我见过的钻嘴鱼科罐子(JSF参考实现),我发现它使用服务装载机API,因为它把javax.servlet.ServletContainerInitializer,javax.enterprise.inject.spi .extension和com.sun.faces.spi.injectionprovider位于javax.faces-2.2.0.jar中的/ META-INF/services文件夹内。

这是java如何区分实现和另一个(mojarra或myfaces)之间的区别。

2

通常情况下,Java规范类分为两个部分:

  1. 一个API部分(jar),主要包含由specs提供的接口。
  2. 包含这些接口的实现的实现部分(jar)。

上面是JDBC的一个例子:javax.sql.*类由sun/oracle提供,但实现在由每个分贝供应商提供的JDBC驱动程序来完成。在这种情况下,为了将API“映射”到其实现中,需要某种配置,因为仅使用API类。

您与JSF例子是,无论MojarraMyFaces包含javax.faces.*API类有一点不同,基本上有不同的类具有相同的名称。因此,不需要配置,这两个类在两个库中都具有相同的名称,并且在需要时由类加载器加载类别路径中的任何一个的MojarraMyFaces罐。

+0

感谢@dcernahoschi,但我想知道'map'是如何完成的,因为如果我放置mojarra jar或myfaces jar,它们中的每一个都有不同的实现类名称,因此java如何读取javax.jsf.Impl1或javax.jsf.other.Impl2 ??? – rvillablanca 2013-04-29 20:48:30

+0

也许我没有解释清楚:在Mojarra和MyFaces的情况下,类(虽然不同)具有相同的名称,不需要映射。 – dcernahoschi 2013-04-29 21:16:52

0

我找到了JSF的MyFaces和Mojarra实现。我意识到两者都具有相同的pachage结构,因此它意味着所有符合JSF规范。换句话说,哪个实现jar被放到classpath中,classpath loader会处理它。

这完全是关于JVM的Java Class Loader机制。您可以在Java Class Loader上找到详细的讨论:

下面是两个JSF实现包结构的图片。

enter image description here