Есть ли способ отличиться внутри конкретного метода, если он запущен в веб-приложении (например, все приложения развернуты на сфере tomcat/web и т. Д.) Или как отдельное приложение?Как отличить веб-приложение от отдельного приложения?
ответ
Ответ «НЕТ». Нет никакого гарантированного способа определить, работает ли ваш код в каком-либо контейнере сервера приложений или контейнере сервлетов или автономно, не полагаясь на внешнюю информацию.
Можно, однако, указать свойство системы в одном случае, а не другой, и проверить его существование:
java -Dstandalone.mode=true MyApplication
В коде:
if (Boolean.getBoolean("standalone.mode")) {
// we're in standalone mode
}
Ваш вопрос трудно, потому что там не так много, что это «разные» между ними в сторону от того, что он работает. Вы могли бы попытаться вызвать
org.apache.catalina.util.ServerInfo.getServerBuilt()
И если это не удается, то вам не работают Tomcat. Я не знаком с веб-сферой, но я бы предположил, что попытка вызвать конкретный метод для этого тоже будет работать. Это определенно грязный способ сделать что-то, но это сработает.
Вы можете проверить, не обнаружен ли какой-либо экземпляр 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;
}
«Не безупречный» - это преуменьшение. Это будет работать для сервлетов, но не для фильтров/порожденных потоков или, в случае полного контейнера EE, beans. – ChssPly76
В любом случае ваш образец кода потребует, чтобы HttpServlet находился в вашем пути к классам, что вряд ли будет иметь место для бизнес-логики. –
@ ChssPly76: Вот почему я сказал, что «это может удовлетворить ваши конкретные потребности». :) –
Предположительно, вы хотите, чтобы проверить это в какой-то «общий» бизнес-логики кода, который не компилируется с любым сервером приложений или API, J2EE на пути к классам, то есть вы не можете получить доступ к HttpServlet напрямую. В этом случае я думаю, что делать Class.forName()
для класса J2EE или app-server-sepcific будет вашим лучшим выбором. Если он выбрасывает и исключает, он является автономным, иначе, возможно, вы находитесь на сервере приложений.
Я думаю, что самый простой способ - проверить для JNDI system properties (предполагая, что они не устанавливаются в автономном режиме на удаленный сервер - и даже тогда вы должны знать разницу в значениях, таких как сервер не ссылаясь на локальный хост).
- 1. Как отличить видеовстречу от приложения Google Talk?
- 2. Как отличить ли пользователь от приложения FB или автономного приложения
- 3. Как отличить ByteArray от строк
- 4. Запуск приложения MVC как отдельного приложения
- 5. Развертывание R блестящего приложения как отдельного приложения
- 6. Как отличить платную и бесплатную версию приложения от форм xamarin
- 7. Как отличить запрос веб-службы от приложения Android?
- 8. Как отличить несколько клиентов от приложения client/server
- 9. Как отличить iPhone и iPad от универсального приложения?
- 10. Как отличить программу жмет от
- 11. Как отличить метод от функции?
- 12. Как отличить класс от функции
- 13. Как отличить объект от linq
- 14. Как отличить итератор от итерации?
- 15. Как отличить домен от поддомена
- 16. Как отличить кран от перетаскивания
- 17. Как отличить каталог от файла
- 18. Как отличить QChar от int
- 19. Как отличить WebControl от GridViewRow
- 20. Невозможно отличить от android.graphics.drawable.ColorDrawable
- 21. Как отличить состояние приложения и состояние ресурса
- 22. Как отличить один музыкальный файл от другого
- 23. Singnals от отдельного QProcess
- 24. JTextField от отдельного класса
- 25. Как отличить использование ссылки от адресации как «&»
- 26. Как отличить тестовые и производственные свойства приложения?
- 27. Как отличить интерфейсы «Роли» от интерфейсов «Результат»?
- 28. Как отличить в couchbase
- 29. Доставка веб-сайта как отдельного настольного приложения
- 30. Как создать exe для отдельного приложения php?
Что вы хотите, чтобы отличить ДЛЯ? –
Я имею дело с устаревшим кодом, приложение может работать автономно или под tomcat. И есть поток, который запускается во время инициализации приложения. Я могу теперь, когда веб-приложение уже запущено или собирается завершить работу. Я хотел получить картину. Проблема в том, что он не запускает автономный поток, бросая исключение во время запуска/остановки веб-приложения. – blefesd