我的Web应用程序数据存储在不同位置访问的数据库中。没有通用代码可以同时访问这两个位置。因此,我想在运行时知道当前环境。实际上,代码的运行方式取决于是否在Tomcat内部或外部运行,因此我希望在运行时检测它。如何做到这一点?
好的,撇开所有注意事项不谈,我想在讨论中提出我的两分钱意见。
我认为ServerDetector使用系统类路径上特定类的存在来确定正在运行的服务器类型有些缺陷:如果包含该类的JAR文件只是恰好在类路径上但未被使用怎么办?我建议使用堆栈跟踪元素来检测正在运行的服务器的不同方法。这可能并不完美,但我认为它比检测类路径上某个类的存在要好。
以下是Scala代码:
def inTomcat: Boolean = (new Throwable).getStackTrace.exists(_.getClassName.startsWith("org.apache.catalina"))
如果这不是为了快速的hack,而是为了长期的解决方案,请注意选择任何启发式决策的API都会最终失效。OSGi的整个重点是将JVM中不相关的部分隐藏起来。
我认为对于这种特定情况,最好的方法是查看是否有可用的JNDI环境来确定您是否在Tomcat内部。如果没有,则在独立环境中,如果有,则在Tomcat内部。
我理解其他答案的警告,但有时在早期开发阶段,我会通过CLI和Tomcat执行我的类,并且我只想知道我正在运行哪个环境,而不需要大量的样板文件。
我使用这个Java函数
public static boolean _amServer() {
StackTraceElement[] elements = new Throwable().getStackTrace();
for (StackTraceElement element : elements) {
if (element.getClassName().equals("org.apache.catalina.core.StandardEngineValve")) {
return true;
}
}
return false;
}
我发现以下解决方案简单明了(取自另一个Stack Overflow问答):
String path = getClass().getProtectionDomain().getCodeSource().getLocation().getFile();
boolean insideWarFile = path.contains("WEB-INF");