有没有一种方法可以在运行时确定Java EE版本?

8
有没有编程的方法来确定可用的Java EE环境版本?

2
你标记了Tomcat7。只是想说,Tomcat7并不是一个完整的Java EE应用服务器,它只是一个JSP/Servlet容器。Glassfish、JBoss AS和TomEE是完整的Java EE应用服务器的例子(包括JSP/Servlet/JSF/JPA/EJB等等)。 - BalusC
明白了。我大部分时间都在使用TomEE,但需要弄清楚在安装过程中是否会提供正确的环境。 - Josue
3个回答

6
没有一种标准方式可以实现这个。你可以使用反射/ClassLoader方法,并检查在给定Java EE版本中引入的特定API类/方法。
下面是我能想到的:
Java EE 6 / EJB 3.1添加了javax.ejb.Singleton Java EE 5 / EJB 3.0添加了javax.ejb.Stateless J2EE 1.4 / EJB 2.1添加了javax.ejb.TimerService J2EE 1.3 / EJB 2.0添加了javax.ejb.MessageDrivenBean
在此之前是J2EE 1.2 / EJB 1.1
但是请注意,如果这是为Tomcat(根据标签判断)设计的,最好的方法是只需检查System.getProperty("tomcat.version")。你应该能够基于Tomcat版本推断出Servlet版本。

谢谢。我就怕这个。 - Josue
Tomcat的版本及其支持的API可以在https://tomcat.apache.org/whichversion.html上查看。 - Queeg

6
我不知道是否有获取Java EE版本号的方法,但是您可以获取Servlet API版本号和JSP版本号:
  • 您可以从ServletContext对象中以实现无关的方式获取servlet api版本。查找getMajorVersion()getMinorVersion()方法。
  • 您可以按以下方式获取JSP版本:
  • JspFactory.getDefaultFactory().getEngineInfo().getSpecificationVersion()

并且毫无疑问,有平台(即应用服务器)特定的方法来查找或推断各种版本号。
值得注意的是,“Java EE版本”是一个模糊的概念,如果考虑到应用服务器供应商可能会做的事情;例如挑选他们支持的Java EE技术,可能还会挑选版本。例如Tomcat不支持所有Java EE - 缺少EJB支持。

2
请注意,web.xml中的<web-app version>会影响ServletContext#getMajorVersion()getMinorVersion()。理论上,这可以设置为2.5,而容器本身支持3.0。容器随后以回退模式运行。如果必要,可以与检查类路径中是否存在Servlet 3.0特定类(例如@WebServlet注释)相结合,具体取决于OP需要此信息的原因。 - BalusC
请注意,在任何经过认证的Java EE服务器上都不允许挑选代码。这是创建TomEE的主要原因,因为普通的Tomcat排除了比EJB更多的内容 - David Blevins
ServletContext有四个相关方法:get[Effective]{Major|Minor}Version()。详情请参阅JavaDoc。 - Per Lindberg

2
如果您使用的是Tomcat,您可以使用org.apache.catalina.core.Constants类获取运行时的Servlet API版本。例如:
if (Constants.MINOR_VERSION == 2 && Constants.MINOR_VERSION == 5) {
    // Servlet 2.5
} else if(Constants.MINOR_VERSION == 3 && Constants.MINOR_VERSION == 0) {
    // Servlet 3.0
} ...

有一种便携式的方法可以做到这一点...请查看我的回答。 - Stephen C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接