如果在Web应用程序中运行(例如,整个应用程序部署在tomcat / web sphere等上)或作为独立应用程序运行,是否有办法区分内部特定方法?
答案 0 :(得分:2)
答案是“不”。没有保证的方法可以确定您的代码是在某种应用服务器/ servlet容器中运行还是独立运行而不依赖于外部信息。
但是,您可以在一个案例中指定一个系统属性,而不是另一个案例属性,并检查它是否存在:
java -Dstandalone.mode=true MyApplication
在您的代码中:
if (Boolean.getBoolean("standalone.mode")) {
// we're in standalone mode
}
答案 1 :(得分:1)
您可以检查当前堆栈跟踪中是否显示HttpServlet
的任何实例。虽然它不是万无一失的,但它可能满足您的特定需求。
注意:我没有尝试过运行此示例代码。遗漏处理已被遗漏。
public boolean isWebApplication() {
Class<?> httpServletClass;
try {
httpServletClass = Class.forName("javax.servlet.http.HttpServlet");
} catch (ClassNotFoundException e) {
return false;
}
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace()
for (StackTraceElement element : stackTrace) {
Class<?> elementClass = Class.forName(element.getClassName());
if (httpServletClass.isAssignableFrom(elementClass)) {
return true;
}
}
return false;
}
答案 2 :(得分:1)
据推测,您希望在类路径中未使用任何应用服务器或J2EE API编译的某些“通用”业务逻辑代码中检查此内容,即您无法直接访问HttpServlet。在这种情况下,我认为为J2EE或app-server-sepcific类做Class.forName()
将是你最好的选择。如果它抛出异常,它是独立的,否则,也许你在app服务器中。
答案 3 :(得分:0)
你的问题很难,因为除了运行之外,两者之间并没有很多“不同”。你可以试着打电话
org.apache.catalina.util.ServerInfo.getServerBuilt()
如果失败,那么你就没有运行Tomcat。我不熟悉网络领域,但我想,尝试调用一个特定的方法也可以。这绝对是一种肮脏的做事方式,但它会起作用。
答案 4 :(得分:0)
我认为最简单的方法是测试JNDI system properties(假设那些没有在独立模式下设置到远程服务器 - 甚至那时你应该能够知道值的差异,比如因为服务器没有引用本地主机。)