Распространение XSD-файлов по нескольким артефактам Maven - PullRequest
7 голосов
/ 31 января 2012

Вот небольшой пример того, чего я хотел бы достичь:

Maven Artifact A является одним из многих веб-сервисов и определяет схему XSD с определения для запросов и ответов. (SRC / главная / ресурсы / XSD)

Артефакт A зависит от Артефакта B, который является простым JAR-проектом и содержит множество мастер XSD с описаниями типов низкого уровня. (SRC / главная / ресурсы / XSD)

XSD в Артефакте А используют определения типов (включают), которые указаны однажды в Артефакте Б.

Если это вообще возможно, мне бы очень хотелось узнать, как включить файлы xsd, расположенные в банке, которая загружается как зависимость maven, и как разрешить xsd (и wsdl) веб-службы в IDE, таких как Netbeans и Eclipse.

Если этот подход кажется экзотическим - существуют ли лучшие практики для чистого дизайна?

обновление

Сначала приведу простой пример того, как я ожидаю, что схема включится в работу ....

Artifact A (WAR Module)
POM:
...
<artifactId>A</artifactId>
...
<dependency>
  <artifactId>B</artifactId>
  ...
</dependency>

Schema:
....
<xs:include schemaLocation="classpath://net/elfwyn/xsd/schema.xsd"/>
....

Artifact B (JAR Module)

Schema Location:
src/main/resources/net/elfwyn/xsd/schema.xsd

Кажется, есть несколько решений для такой проблемы, но я не знаю, как реализовать их в моей среде:

Мне известны каталоги-резолверы, встроенные в IDE (netbeans7.1) (для dev environemnt) и доступные как плагины Maven (для продуктивной среды), которые должны иметь возможность указывать псевдоним в расположении файла схемы. Затем этот псевдоним следует использовать в качестве расположения схемы.

Однако я не знаю, как указать файл Catalog.xml, который обращается к схемам внутри файла JAR. Мне кажется, это та же проблема, что и указание ее непосредственно в расположении схемы. Также есть издержки на поддержание каталога для каждого WAR-проекта, который я бы предпочел не принимать, если это вообще возможно.

Что касается плагина Maven, я еще не нашел ничего убедительного.

Другие источники реализуют пользовательский преобразователь каталога в контексте jax-b, но я пока не вижу возможного хука для реализации такого преобразователя в среде Java-WS, и как он должен работать в сочетании с упомянутым выше плагином maven или преобразователем каталога IDE ...

1 Ответ

6 голосов
/ 10 февраля 2012

Я думаю, что ваш вопрос обоснован. В прошлом я часто обнаруживал, что у меня есть модуль Maven, который должен выполнять специальную обработку файлов, которые можно найти в зависимых JAR-файлах.

То, что я делал в прошлом, - это сделал Артефакт В зависимостью от Артефакта А. Затем в pom.xml Артефакта А я использую специальную конфигурацию подключаемого модуля зависимостей Maven следующим образом:

<plugin>
    <!-- Used to pull XSD files from the JAR -->
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
          <execution>
              <id>unpack-xsd-files</id>
              <!-- Using the initialize phase because it is before the generate sources phase -->
              <phase>initialize</phase>
                   <goals>
                       <goal>unpack</goal>
                   </goals>
                   <configuration>
                        <artifactItems>
                            <artifactItem>
                                <!-- Artifact that Holds our custom templates -->
                                <groupId>com.mycorp</groupId>
                                <artifactId>artifact-b</artifactId>
                                <version>${artifact-b.version}</version>
                                <type>jar</type>
                            </artifactItem>
                         </artifactItems>
                         <includes>**/*.xsd</includes>
                         <outputDirectory>${project.basedir}/target/xsd-includes</outputDirectory>
                   </configuration>
            </execution>
    </executions>
</plugin>

Теперь интересующие вас XSD-файлы можно найти в целевом каталоге Артефакта А, и оттуда вы можете делать с ними все, что захотите. Вы можете включать их в качестве ресурсов, ссылаться на них из других файлов XSD, вставлять их в свои собственные JAR-файлы или что-то еще! Как видно из конфигурации, вам также не нужно помещать их в целевой каталог; Вы можете поместить их прямо в каталог /src/main/resources.

Вы можете добавить эту конфигурацию к любому модулю Maven, который вы хотите, чтобы все модули могли работать одинаково. Хорошая особенность этого подхода в том, что он также будет работать с Eclipse через M2Eclipse.

...