Java如何找到规范实现?

时间:2013-04-29 19:52:29

标签: java specifications

我不明白java如何知道任何规范的实现..

例如,我有一个带有JSF的Spring应用程序,如果我将Mojarra jar放在类路径上应用程序正常工作,但我没有做任何事情,只是将它添加到类路径,所有没有配置

如果我取出Mojarra jar,那么我的应用程序就不起作用了。

甚至,它如何在没有任何变化的情况下区分Mojarra或MyFaces?

我只是想知道Java如何找到实现,而不是为什么如果我取出罐子它不起作用;)

3 个答案:

答案 0 :(得分:2)

通常,Java规范类分为两部分:

  1. API部分(jar),主要包含通常由规范人员提供的接口。
  2. 包含这些接口实现的实现部分(jar)。
  3. 上面的一个示例是JDBC:javax.sql.*类由sun/oracle提供,但实现是在每个数据库供应商提供的JDBC驱动程序中完成的。在这种情况下,需要某种配置才能将API“映射”到其实现中,因为您只使用API类。

    JSF的示例略有不同,MojarraMyFaces包含来自API包的javax.faces.*类,基本上有不同的类同名。因此不需要配置,这两个类在两个库中都具有相同的名称,并且在需要时从MojarraMyFaces jar中加载类加载器,无论哪个类都在类路径上。

答案 1 :(得分:0)

我找到了JSF的MyFaces和Mojarra Implementation。我已经意识到两者都具有相同的pachage结构,因此它意味着所有都符合JSF规范。换句话说,哪个实现jar被赋予classpath类路径加载器将处理它。

关于JVM的Java Class Loader机制。您可以在Java Class Loaders

中找到详细的讨论

以下是JSF实现包结构的图片。

enter image description here

答案 2 :(得分:0)

我见过mojarra jar(JSF Reference Implementation),我发现它使用了Service Loader API,因为它放置了javax.servlet.ServletContainerInitializer,javax.enterprise.inject.spi.Extension和com.sun。 face.spi.injectionprovider位于javax.faces-2.2.0.jar中的/ META-INF / services文件夹中。

这是java区分实现和另一个(mojarra或myfaces)的方式。

相关问题