Может быть сложно объяснить, чего именно я хочу, поэтому, пожалуйста, позвольте мне сделать это шаг за шагом.
У нашей компании есть долгоживущий проект Java, который использует файлы Spring WS, XSD для создания WSDL и этих bean-компонентов из WSDL. Проект компилируется/собирается с использованием ANT с различными целями (одна цель для создания классов из XSD, другая для создания клиентского JAR, еще одна для создания сервера WAR/EAR). Этот проект использовался для запуска SOAP-сервера, а также для создания клиентского JAR-файла. Но единого исходного кода больше нет, и количество предварительно сгенерированных клиентских JAR-файлов постоянно летает. Мне нужно очистить этот беспорядок, используя Maven.
Я создал модульный проект Maven, но, по сути, единственный настоящий дочерний проект — это тот, который содержит весь пользовательский код, все XSD и т. д. (другой дочерний проект просто упаковывает EAR из WAR, сгенерированного первым проектом). Поскольку в этом проекте используется Spring WS, окончательный файл WSDL создается динамически при запуске на сервере.
До сих пор мне удалось сделать следующее:
- сгенерируйте классы из XSD вручную, добавьте эти классы в /src/main/java, чтобы они хранились постоянно, пусть Maven сгенерирует остальную часть архитектуры на стороне службы (WAR/EAR).
- отдельно, используя файл WSDL, импортированный с работающего сервера, сгенерируйте файл JAR клиента с помощью плагина eclipse WTP (создайте новый проект, поместите в него WSDL, используйте плагин WTP для создания файлов, затем экспортируйте проект в окончательный файл JAR), а затем распространите этот JAR на заинтересованные стороны.
Это работает, но, как видите, процесс сопровождения кода имеет проблемы (прегенерированные классы включены в основной исходный код), процесс генерации клиента в лучшем случае оторван от основного проекта. Так что это беспорядок, который я хотел бы иметь возможность очистить.
То, что я хотел бы сделать, это что-то вроде этого:
- создать проект Maven, в котором размещаются файлы XSD
- используйте его для создания классов и клиентского JAR
- обратитесь к этому проекту из проекта на стороне сервера, чтобы на сгенерированные классы можно было ссылаться с помощью кода на стороне сервера
- проект на стороне сервера - это тот, который будет использовать Spring WS и сможет генерировать файл EAR.
Проблема, с которой я столкнулся, проста: файлы XSD для динамического создания WSDL должны действительно находиться в этом серверном проекте, а не в клиентском проекте. Эти файлы должны находиться в /src/main/resources, чтобы они были перемещены в путь к классам встроенного файла WAR/EAR. Я мог бы использовать две разные копии XSD - одну в проекте на стороне клиента, другую в проекте на стороне сервера, но это звучит неправильно.
Итак, мой главный вопрос на самом деле заключается в том, как мне подойти к этой архитектуре проекта с помощью Maven, чтобы я использовал только один экземпляр любого исходного файла (XSD, Java и т. д.), и я мог удобно генерировать классы из XSD, создавать клиентский JAR и сервер ВОЙНА/УХО. Я согласен с двумя или более отдельными командами сборки - одна генерирует JAR, другая генерирует EAR из соответствующих источников проекта.
Да, кстати, о рефакторинге файлов XSD не может быть и речи — они нам даны и должны использоваться КАК ЕСТЬ.
Спасибо, Николай