我不明白的Java是如何知道的任何规格的实现..Java如何找到规范实现?
例如,我有一个Spring应用程序使用JSF,如果我放在classpath中应用的工作原理的钻嘴鱼科罐子,但我没有做什么但是将它添加到classpath中,全部没有配置
如果我拿出Mojarra罐子,那么我的应用程序不起作用。
即使在没有任何改变的情况下,Mojarra或MyFaces如何区分?
我只是想知道的Java如何找到的实现,不为什么,如果我拿出罐子不工作;)
我不明白的Java是如何知道的任何规格的实现..Java如何找到规范实现?
例如,我有一个Spring应用程序使用JSF,如果我放在classpath中应用的工作原理的钻嘴鱼科罐子,但我没有做什么但是将它添加到classpath中,全部没有配置
如果我拿出Mojarra罐子,那么我的应用程序不起作用。
即使在没有任何改变的情况下,Mojarra或MyFaces如何区分?
我只是想知道的Java如何找到的实现,不为什么,如果我拿出罐子不工作;)
我见过的钻嘴鱼科罐子(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)之间的区别。
通常情况下,Java规范类分为两个部分:
上面是JDBC的一个例子:javax.sql.*
类由sun/oracle
提供,但实现在由每个分贝供应商提供的JDBC驱动程序来完成。在这种情况下,为了将API“映射”到其实现中,需要某种配置,因为仅使用API
类。
您与JSF
例子是,无论Mojarra
和MyFaces
包含javax.faces.*
包API
类有一点不同,基本上有不同的类具有相同的名称。因此,不需要配置,这两个类在两个库中都具有相同的名称,并且在需要时由类加载器加载类别路径中的任何一个的Mojarra
或MyFaces
罐。
感谢@dcernahoschi,但我想知道'map'是如何完成的,因为如果我放置mojarra jar或myfaces jar,它们中的每一个都有不同的实现类名称,因此java如何读取javax.jsf.Impl1或javax.jsf.other.Impl2 ??? – rvillablanca 2013-04-29 20:48:30
也许我没有解释清楚:在Mojarra和MyFaces的情况下,类(虽然不同)具有相同的名称,不需要映射。 – dcernahoschi 2013-04-29 21:16:52
我找到了JSF的MyFaces和Mojarra实现。我意识到两者都具有相同的pachage结构,因此它意味着所有符合JSF规范。换句话说,哪个实现jar被放到classpath中,classpath loader会处理它。
这完全是关于JVM的Java Class Loader机制。您可以在Java Class Loader上找到详细的讨论:
下面是两个JSF实现包结构的图片。
Java只是寻找要加载的类名。它检查它的构建路径并通过所有的jar文件和其他库工作,直到它找到它所寻找的类文件的实现。 – 2013-04-29 19:55:54
@MaheshGuruswamy可能会发布一个答案? – 2013-04-29 19:57:13
@LuiggiMendoza,我确实发布了一个答案。它为OP提供了一个提示,以查找类加载以及它在Java中的工作方式。 – 2013-04-29 20:02:09