我对java很陌生,理解java是如何实现的有一些困难。根据我所使用的资源,我所理解的是JAVA只是一组规范,而应用服务器才是这些规范的真正实现。
这是否意味着甲骨文的架构师刚刚想出了设计(只是框架:接口、抽象类、类)和应用服务器(Glassfish,WebLogic)程序员在实际代码中实现了这一点?
java中的所有内容都只是规范吗?
那JPA,JAX-RS呢?这是否意味着应用服务器供应商没有为这些规范实现代码?如果是,这是否也意味着应用程序服务器供应商选择了规范的子集,并在实际代码中实现了它,并留下了其他一些规范供其他供应商实现?
发布于 2015-04-20 07:50:43
除了漂亮的“JoD.‘”他的回答,很少有其他的想法:
JAVA只是规范的集合,应用服务器才是这些规范的真正实现。
一点儿没错。
这是否意味着甲骨文公司的建筑师们刚刚想出了这个设计。
准确地说,Sun的建筑师:)
那JPA,JAX-RS呢?这是否意味着应用服务器供应商没有为这些规范实现代码?
不是的。为了与Java兼容,每个应用服务器都应该实现所有的规范。它们是如何实现的,这是厂商特有的。例如,WildFly的JPA实现是Hibernate,但是Glassfish使用EclipseLink。它们都是JPA的超集,因此,如果您只使用实现JPA的类,则可以确定您的应用程序可以部署在各种应用程序服务器上,而不需要任何其他操作。但是,如果您使用来自例如org.eclipse.persistence.*包的类,那么您将无法在WildFly上部署,除非您与应用程序一起提供EclipseLink实现。
发布于 2015-04-19 20:33:07
抽象接口(API)
抽象接口允许您将代码编译到类/jar/war中,而无需知道或需要部署到的服务器上的确切实现。抽象接口通常由一个标准(JEE,JCP)组成。
通常,这些接口被打包到库中,这些库只在编译时使用(确保代码可以编译),而不将它们包含在war发行版中。在运行时,在服务器上,我们将使用任何已经可用并预先安装的内容.
使用maven依赖项,这是通过提供provided作用域来完成的,从而导致库被排除在打包(war文件)之外。
接口通常被命名为*-api,类似于java.faces-api-2.2.jar。
Implementation
在服务器端,我们通常已经使用一个实际的实现作为Application的一部分提供了库。这是一个标准的实施。
通过将带有抽象接口(标准)的库与具有特定实现的库分离开来,您将避免针对特定于供应商的API进行编译。
如果缺少实现,您可以选择在服务器上手动安装它(将jar复制到正确的位置),或者使用runtime作用域将其作为maven依赖项提供。在这种情况下,Maven将使库成为打包(war)的一部分,但绝不会针对它们进行编译。在这种情况下,您仍然将使用provided作用域提供api。
https://stackoverflow.com/questions/29730339
复制相似问题