确定应用程序正在应用程序服务器下运行

时间:2010-11-20 19:47:00

标签: java java-ee application-server

某些代码可能会在包括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。

3 个答案:

答案 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
}