某些代码可能会在包括Java EE Application Server在内的各种环境中重用。有时很高兴知道代码是在应用程序服务器下运行,以及它是应用程序服务器。
我更喜欢通过检查应用程序服务器的典型系统属性来实现。 例如,它可能是
jboss.server.name
适用于JBoss catalina.base
for Tomcat 是否有人知道其他服务器的相应属性名称? Weblogic,Websphere,Oracle IAS,其他?
检查是否安装了特定的应用程序服务器非常容易。只需添加行 System.getProperties()到任何JSP,Servlet,EJB并打印结果。
我可以自己做,但是需要花很多时间来安装服务器并使其正常工作。
我已阅读此讨论:How to determine type of Application Server an application is running on?
但我更喜欢使用系统属性。它更容易,绝对便携的解决方案。代码不依赖于任何其他API,如Servlet,EJBContext或JMX。
答案 0 :(得分:1)
这不是一种“标准”方式,但我所做的是尝试加载一个AppServer类。
对于WAS:
try{
Class cl = Thread.getContextClassLoader().loadClass("com.ibm.websphere.runtime.ServerName");
// found
}
// not Found
catch(Throwable)
{
}
// For Tomcat: "org.apache.catalina.xxx"
等
让我知道你的想法
答案 1 :(得分:1)
JBoss AS设置了许多不同的系统属性:
jboss.home.dir
jboss.server.name
您可以使用VisualVM或其他工具检查其他属性。
我不知道其他服务器,但我认为您可以为每个服务器找到某种属性。
答案 2 :(得分:1)
//for Tomcat
try {
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
ObjectName name = new ObjectName("Catalina", "type", "Server");
StandardServer server = (StandardServer) mBeanServer.getAttribute(name,"managedResource");
if (server != null) {
//its a TOMCAT application server
}
} catch (Exception e) {
//its not a TOMCAT Application server
}
//for wildfly
try {
ObjectName http = new ObjectName("jboss.as:socket-binding-group=standard-sockets,socket- binding=http");
String jbossHttpAddress = (String) mBeanServer.getAttribute(http, "boundAddress");
int jbossHttpPort = (Integer) mBeanServer.getAttribute(http, "boundPort");
String url = jbossHttpAddress + ":" + jbossHttpPort;
if(jbossHttpAddress != null){
//its a JBOSS/WILDFLY Application server
}
} catch (Exception e) {
//its not a JBOSS/WILDFLY Application server
}