Проект Maven для Spring WS, JAXB / XSD для создания сервера WAR / EAR и клиентского JAR, а также автоматического создания классов из XSD - PullRequest
0 голосов
/ 16 декабря 2011

Может быть сложно объяснить, что именно я хочу, поэтому, пожалуйста, позвольте мне сделать шаг за шагом.

Наша компания имеет долгоживущий Java-проект, который использует Spring WS, XSD-файлы для генерации WSDL иэти бобы из WSDL.Проект компилируется / строится с использованием ANT с различными целями (одна цель для генерации классов из XSD, другая для генерации JAR клиента, другая для генерации WAR / EAR сервера).Этот проект использовался для запуска сервера SOAP, а также для создания JAR на стороне клиента.Но единого источника кода больше не существует, и количество предварительно сгенерированных клиентских JAR-файлов летит вокруг.Мне нужно убрать этот беспорядок с помощью Maven.

Я создал модульный проект Maven, но в основном единственный реальный дочерний проект - это тот, который содержит весь пользовательский код, все XSD и т. Д. (Другой дочерний проект просто упаковывает EAR изВойна, созданная первым проектом).Поскольку этот проект использует 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 и серверные WAR / EAR.Я в порядке с двумя или более отдельными командами сборки - одна генерирует JAR, другая генерирует EAR из надлежащих источников проекта.

Да, кстати - рефакторинг файлов XSD не подлежит сомнению - они даны нам и должныиспользовать как есть.

Спасибо, Николай

Ответы [ 2 ]

1 голос
/ 16 декабря 2011

Используйте отдельный проект для только XSD и создайте другой JAR только с классами, сгенерированными из XSD.В итоге у вас будет 3 проекта:

  • Проект XSD-схемы
  • клиентский JAR
  • серверный проект

, где клиентский JAR и серверпроекты зависят от проекта схемы XSD.

Вы можете построить все это за один раз, используя родительский проект со всеми этими проектами как дочерние модули .

Если вы обеспокоены тем, что ваш клиентский JAR сейчасфактически два JAR-файла (плюс, возможно, больше зависимостей), вы можете использовать плагин shade для связывания содержимого JAR-файла схемы XSD в вашем JAR-клиенте.

Создание большего количества проектов / модулей почти всегдалучше, чем дублирование кода.


Редактировать: для создания классов из WSDL и XML-схемы вы можете использовать плагин Maven JAX-WS (цель wsimport) и / или Maven JAXB плагин .

0 голосов
/ 16 декабря 2011

Мы генерируем довольно много кода из XSD.Поскольку мы не хотели дублировать код, мы используем каталоги XML и специальный преобразователь схем, который может разрешать схемы из пути к классам;Я вполне уверен, что у apache есть решатель схем, который тоже это сделает - я помню, что нашел его после того, как мы написали наш.Таким образом, один модуль может ссылаться на схему из артефакта другого модуля, объявив ее зависимостью.

...