关于规范,以及一个疑问
规范(Specification),有时也叫做“标准”,一般称为JSR-xxx,我的理解是:为了解决特定范围的问题,而设计的一系列接口和机制的集合
有了规范之后,开发人员就可以自由选择提供商实现,使用者的代码,不与具体的提供商绑定,以实现松耦合
比如说JSR315,也就是Servlet3.0规范,定义了Filter、Servlet、ServletRequest、ServletResponse等一系列接口,并规定了这些接口应该提供哪些功能,然后tomcat、jboss、WAS等servlet容器,就实现了这个规范。
开发人员开发的web应用,如果是仅仅依赖于servlet-api,不依赖某个厂商的特定实现类,那么这个web应用,应该是无论在哪个servlet容器中,都能部署的
单个或者几个接口,还不足以成为规范。比如spring框架中定义了一组接口ApplicationContext、BeanFactory、BeanDefinitionReader等。spring自己提供了实现,开发人员也可以对spring框架进行扩展。但是这还不能称为一种规范。
如果高度上升一点,比如称为JSR-xxx,Java Dependence Injection,然后规定一系列的接口,由不同的框架提供商来实现,大概就可以称为一种规范了
规范有3种角色的参与者,规范制定者(也就是JCP),提供商(Provider),以及使用者(开发人员)
不过我就有一个疑问,规范的api.jar,到底是谁来提供的呢,又应该从哪里获取到?
我看到tomcat里,有一个servlet-api.jar,我就很好奇是谁提供的,就下载了源码跟进去看了一下
可以看到,JSR315的API是由Apache基金会提供的,这里就觉得比较奇怪,为什么不是由JCP来提供这个规范的api.jar包?毕竟规范是由JCP制定的
难道规范的api.jar也是由各实现提供商自行提供吗?虽然理论上来说也是可以的,因为如果各实现都严格遵循规范的话,那么提供的接口也应该是一致的。但是还是觉得这个jar包,应该是由“官方”提供,比较合乎逻辑一点。像rfc2616这样的协议,不都是由官方提供的吗,只不过不需要提供二进制发布包而已
然后像今天想研究一下jms1.1,规范文档倒是很容易可以下载到,但是就找不到一个api.jar,下载了ActiveMQ,倒是找到了geronimo-jms_1.1_spec-1.1.1.jar,不过就感觉不对劲,看名字就觉得好像是跟实现绑定的
知道这2个问题的朋友请解答一下:
规范对应的jar包是由官方提供的,还是由实现提供商提供的?
作为开发者,怎么获取规范对应的jar包?比如说“jms-api-1.1.jar”这种 1 楼 vvvpig 2012-08-08 其实你用过maven有时候会遇到sun的依赖,但是由于这些依赖在sun的java.net私有网站上不能公开下载,所以别的组织会提供自己的api实现包,由于Oracle的收购同时关掉了很多项目,一些老的项目都可以在java.net的网站上下载到,包括规范和api参考实现,但是那个网站特别难用 2 楼 vvvpig 2012-08-08 可以参考
http://stackoverflow.com/questions/3622773/java-net-maven-repo-jms-artifact-missing 3 楼 kyfxbl 2012-08-08 原来是这样,感谢啊!