Может ли код java / scala / etc сказать, когда он запускается tomcat? - PullRequest
3 голосов
/ 08 октября 2009

У меня есть данные для моего веб-приложения в базе данных, доступ к которой по-разному осуществляется из разных мест. Не существует универсального кода, который может сделать это для обоих. Поэтому я хочу знать во время выполнения, в какой среде я нахожусь. Фактически, код для запуска действительно зависит от того, выполняется ли он внутри или без tomcat, поэтому я хотел бы обнаружить это во время выполнения. Как мне это сделать?

Ответы [ 5 ]

3 голосов
/ 08 октября 2009

Это не похоже на то, что код должен обнаружить. Возложение бремени обнаружения окружающей среды и действия по-разному в пределах одного класса, как правило, не идеальная идея. Если что-то должно быть сделано по-другому, вы должны создать пару разных классов доступа к данным (которые реализуют один и тот же интерфейс и, возможно, совместно используют общий код в абстрактном классе, который они оба расширяют). Затем ваш веб-сервлет создает экземпляр и использует один класс для доступа к базе данных, а ваш не-веб-код создает экземпляр другого класса для доступа к базе данных.

Если по какой-то причине вам ДЕЙСТВИТЕЛЬНО нужно определить, находитесь ли вы в веб-аббате внутри одного класса, я полагаю, что несколько более простой способ - установить свойство System во время работы сервера (я думаю, это -D параметр командной строки), а затем найдите его в вашем классе. Если это так, используйте веб-логику, в противном случае - не-веб-логику.

2 голосов
/ 08 октября 2009

Ну, в общем, если принять во внимание все хорошо продуманные предупреждения, я бы хотел добавить свои 0,02 доллара в обсуждение.

Я думаю, ServerDetector использует наличие определенного класса в системном пути к классам, чтобы определить тип работающего сервера, это немного ошибочно: что, если баночка, содержащая класс, просто оказалась на пути к классам, не используется? Я предлагаю другой метод обнаружения работающего сервера с использованием элементов трассировки стека. Это может быть не идеально, но я думаю, что это лучше, чем обнаружение присутствия какого-либо класса на пути к классам.

Вот это в Scala:

def inTomcat: Boolean = (new Throwable).getStackTrace.exists(_.getClassName.startsWith("org.apache.catalina"))
2 голосов
/ 08 октября 2009

Я бы согласился с kbrasee, что это не очень хорошая ситуация, поэтому, если вы можете, я вытащу ее, если это возможно.

Тем не менее, предполагая, что у вас нет выбора и вам нужно это сделать, они делают это в реализации Liferay. Взгляните на класс ServerDetector

В методе _detect (внизу) вы заметите, что они ищут класс, который, как они определили, присутствует, если он работает на данном сервере. Они определяют классы вверху в константах TOMCAT_BOOTSTRAP_CLASS и TOMCAT_EMBEDDED_CLASS.

У нас была проблема с обнаружением встроенного кота в стеклянной рыбе. Я не уверен, исправлено ли это в версии, на которую я ссылался, но это не может быть проблемой для вас.

0 голосов
/ 27 августа 2015

Я понимаю, что другие ответы предупреждают, но иногда в начале разработки я выполняю свои занятия через 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 голосов
/ 08 октября 2009

Если это не для быстрого взлома прямо сейчас, а для долгосрочного решения, то, пожалуйста, обратите внимание, что любая эвристика, которую вы выберете для принятия решения, которая не была заложена в камне API, в конечном итоге сломается. Весь смысл OSGi состоит в том, чтобы скрывать несвязанные части материала в JVM друг от друга.

Я думаю, что для этой конкретной ситуации лучший способ выяснить, находитесь ли вы внутри Tomcat или нет, это посмотреть, доступна ли среда JNDI. Если нет, то вы находитесь в отдельной среде, если есть, то вы внутри Tomcat.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...