java / scala / etc代码可以告诉它何时由tomcat运行吗?

问题描述 投票:3回答:6

我将Web应用程序的数据保存在一个数据库中,该数据库的访问位置不同。没有通用代码可以同时为两者实现。因此,我想在运行时知道我所处的环境。实际上,要运行的代码实际上取决于它是在tomcat内运行还是不运行,因此我想在运行时检测到它。我该怎么做?

java tomcat scala
6个回答
2
投票

我会同意kbrasee的观点,这不是一个很好的情况,所以如果可以的话,我会尽可能解决。

就是说,假设您别无选择,并且需要执行此操作,那么他们将在Liferay实现中执行此操作。看看ServerDetector class

您会在_detect方法中(在底部附近)注意到,如果它们在给定的服务器中运行,它们将查找他们确定存在的类。它们在TOMCAT_BOOTSTRAP_CLASS和TOMCAT_EMBEDDED_CLASS常量的顶部定义类。

我们在检测玻璃鱼中嵌入的雄猫时遇到问题。我不确定在我链接的版本中是否已解决此问题,但这对您来说可能不是问题。


3
投票

这听起来不像代码必须检测的东西。通常,将检测环境的负担和在同一个类中采取不同的行为的负担放到一个不太理想的想法。如果需要以不同的方式完成操作,则应制作几个不同的数据访问类(实现相同的接口,并且可能在它们都扩展的抽象类中共享公共代码)。然后,您的Web Servlet将实例化并使用一个类进行数据库访问,而您的非Web代码将实例化另一类进行数据库访问。

[如果出于某种原因您确实需要检测您是否在单个类中的Web abb中,我想可能是一种比较干净的方法是在服务器运行时设置System属性(我认为这是-D命令行选项),然后查找在您的班级中设置的内容。如果是,请执行Web逻辑,否则请执行非Web逻辑。


2
投票

好吧,除了所有认真的警告,我想在讨论中投入我的$ 0.02。

[我认为ServerDetector使用系统类路径上特定类的存在来确定正在运行的服务器的类型有一点缺陷:如果包含该类的jar恰好在类路径上但未被使用,该怎么办?我提出了一种使用堆栈跟踪元素来检测正在运行的服务器的不同方法。它可能并不完美,但我认为它比检测类路径中某个类的存在要好。

这里在Scala:

def inTomcat: Boolean = (new Throwable).getStackTrace.exists(_.getClassName.startsWith("org.apache.catalina"))

0
投票

如果这不是现在快速破解,而是长期解决方案,请注意,您选择的任何启发式决策(如果没有放在API石头里,都会最终失败)。 OSGi的重点是彼此隐藏JVM中无关的部分。

我认为对于这种特殊情况,查看您是否在Tomcat中的最佳方法是查看是否有JNDI环境可用。如果不是这样,则说明您处于独立环境中,如果有,则说明您位于Tomcat内部。


0
投票

我理解其他警告的答案,但是有时在早期开发期间,我正在通过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;
}

0
投票

我发现以下解决方案简单明了(taken from another stack overflow q&a):

String path = getClass().getProtectionDomain().getCodeSource().getLocation().getFile();
boolean insideWarFile = path.contains("WEB-INF");
© www.soinside.com 2019 - 2024. All rights reserved.