barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)
Показаны сообщения с ярлыком soapUI mock-service WAR. Показать все сообщения
Показаны сообщения с ярлыком soapUI mock-service WAR. Показать все сообщения

четверг, 27 сентября 2012 г.

Уменьшение размера war-файлов моков веб-сервисов soapUI

У war-файлов с моками веб-сервисов, которые генерирует soapUI, есть одна существенная проблема - они очень большие (около 68Мб). Особенно эта проблема ощущается, когда нужно развернуть много моков сразу, а канал до сервера очень узкий. 
99% размера мока занимают библиотеки, которые у всех моков одинаковые. Поэтому первая идея, которая возникла - положить все эти библиотеки в /lib томката, на котором производится развертывание. Тогда в war-никах перед их деплоем можно удалять все jar-файлы из WEB-INF/lib (не руками конечно, написать для этого ant-билдфайл не проблема, тем более, что он позволит сразу и автоматизировать развертывание, чтобы не делать это через веб-интерфейс Tomcat Manager`а).
Но тут возникла следующая курьезная ситуация: мок, развернутый последним, каким-то чудесным образом заменял конфигурацию всех ранее развернутых моков на свою, и в результате все мок-сервисы на томкате начинали работать как один - выдавать одинаковые wsdl`ки и т.п. Конечно, такому поведению можно найти логичное объяснение, но лучше от этого не становится =)
Поэтому пришлось поступить хитрее. Во-первых, я переместил все soapui-шные библиотеки из /lib томката   в другое место (не суть важно, в какое). Во-вторых, процесс деплоя стал выглядеть так: 
  1. Мок деплоится без библиотек
  2. Только что развернутое веб-приложение останавливается
  3. В его WEB-INF/lib делаются симлинки на все необходимые библиотеки (чтобы не копировать и не занимать тем самым лишнее место на диске сервера)
  4. Приложение стартует
Для автоматизации такого процесса одним только ant-билдфайлом на стороне клиента (машины, с которой производится развертывание) не обойтись (если только поднять ssh / ftp на сервере, что мне показалось не лучшей идеей), пришлось на сервере разместить небольшой сервлет, выполняющий создание симлинков и вызываемый из клиентского билдфайла. Всё, задача решена, моки размером в несколько десятков килобайт деплоятся влет.

воскресенье, 10 июня 2012 г.

soapUI 4.5: особенность разворачивания WAR-ника Mock-сервиса, собранного на Windows, на томкате под Linux

Проблема:

При разворачивании WAR-ника Mock-сервиса, собранного на Windows, на томкате под Linux, в логи валятся ошибки вида:
ERROR [SoapUI] An error occured [Missing local file for [file:/D:/Документы/...%201.2%2005052012/wsdl/types/documents.xsd]], see error log for details
java.lang.Exception: Missing local file for [file:/D:/Документы/...%201.2%2005052012/wsdl/types/documents.xsd]
at com.eviware.soapui.impl.support.definition.export.AbstractDefinitionExporter.replaceLocation(AbstractDefinitionExporter.java:212)
at com.eviware.soapui.impl.support.definition.export.AbstractDefinitionExporter.replaceImportsAndIncludes(AbstractDefinitionExporter.java:184)
и, естественно, сервис не разворачивается. При этом при создании soapUI-проекта кэширование было включено.

Решение:

Очевидно, мок-сервис не находит xsd-схем, используемых wsdl-файлом, на основании которого создавался проект для мока. Вот только на виндовом томкате на машине, на которой также этих файлов и в помине нет, WAR-ник стартует без проблем, потому что копии всех необходимых моку ресурсов есть внутри WAR-ника (в XML-ке soapUI-шного проекта, которая там лежит) и по идее моку не нужно никуда за ними лазить. 
Оказалось, причина в том, что "умный" soapUI (не могу сказать точно, начиная с какой версии, но на 3.0 все было в этом плане в порядке, насчет 3.6 точно не помню), использует в XML-ке soapUI-шного проекта разделители, зависящие от ОС, для именования путей к файлам, которые он закэшировал (в 3.0 всегда использовался прямой слеш). При поиске закэшированных файлов также используется ОС-зависимый разделитель, поэтому сохраняются в проекте файлы с обратными слешами в названии, а ищутся при разворачивании - с прямыми.
Выход из такой ситуации - исправить вручную обратные слеши на прямые в soapUI-шном проекте, лежащем внутри WAR-ника мок-сервиса (где именно, сейчас не помню, попозже посмотрю и уточню). У меня правда после этого все равно не получилось развернуть моки на линуксе, исключения валиться перестают, но и мок не стартует, валится с 404-ошибкой с полной тишиной в логах, поэтому было принято решение разворачивать моки на виндовой машине.
PS При генерации WAR-ника под XP есть ещё одна проболема - неверная кодировка генерируемого web.xml, он кодируется в cp1251, тогда как нужно - в UTF-8 (что важно, если  soapUI-шный проект назывался по-русски), поэтому перед деплоем его нужно перекодировать.