Управление классами, созданными JAXB, в проекте Maven
у меня есть проект на основе Maven, в котором я пытаюсь добавить некоторые классы JAXB, автоматически генерируемые плагином Maven "jaxb2-maven-plugin". Однако мой первый разрез имеет меня в циклическом цикле зависимостей:
- поскольку эти классы JAXB еще не созданы, мои другие источники, которые ссылаются на них, имеют ошибки компиляции.
- поскольку эти другие источники имеют ошибки компиляции, эти классы JAXB не генерируются.
кажется как будто есть две очевидные возможности для решения этого:
- прокомментируйте неработающие ссылки, чтобы автоматически создавались сборки проекта и классы JAXB. Затем скопируйте созданные источники из
/target
на/src/main/java
, чтобы ссылки на них не вызывали ошибок компиляции. - создайте совершенно отдельный проект, состоящий только из материала JAXB. Включите его в качестве зависимости в мой основной проект.
Я чего-то не хватает? Вариант № 1 кажется утончаются смешно... вот только не могу быть способом, которым люди используют JAXB. Вариант №2 кажется более рациональным, но все же довольно неэффективным и громоздким. Я действительно должен взять на себя накладные расходы совершенно отдельного проекта, чтобы использовать JAXB?
есть ли более элегантные подходы, которые разработчики используют для ссылки на классы, созданные JAXB в том же проекте, где плагин Maven генерирует их?
обновление: по запросу, вот соответствующая часть моего пом:
<build>
<plugins>
<plugin>
<!-- configure the compiler to compile to Java 1.6 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- The name of your generated source package -->
<packageName>com.mypackage</packageName>
</configuration>
</plugin>
</plugins>
</build>
когда я запускаю mvn clean package
, Я вижу, что мои источники JAXB генерируются под /target
поддиректории. Однако эти созданные источники не добавляются автоматически в путь к классам на этапе компиляции.
ОБНОВЛЕНИЕ ПОСЛЕ РАЗРЕШЕНИЯ: оказывается, мои проблемы с компиляцией были больше связаны с тем, что я работал в Eclipse, и его интеграция Maven имеет некоторые проблемы с"jaxb2-maven-plugin". См.этот вопрос StackOverflow более подробно по этому вопросу и его решению.
3 ответов
Я бы предложил вам разделить JAXB-генерируемые классы (api) и ваши классы BL (реализация) на 2 проекта maven с отдельным pom.xml для каждого и основной корневой pom.xml с порядком компиляции. таким образом, Вы сможете создать api.jar, затем maven установит его внутри локального РЕПО, и после этого вы можете использовать его как зависимость вашей реализации. так это будет выглядеть:
-API\
--pom.xml - for api, jaxb generation
-IMPL\
--pom.xml - for impl, api dependency is here
pom.xml - main pom.xml with references to the projects above
Как вы настроили плагин jaxb maven? Обычно он выполняется в жизненном цикле generate-sources, который предшествует жизненному циклу компиляции. Таким образом, ваши сгенерированные классы JAXB уже должны быть там, когда ваш собственный код компилируется, Maven помещает их в target/generated-source и помещает эту папку в путь к классам.
редактировать: Это мой код, который мы используем на работе (и который работает так, как ожидалось):
<plugin>
<groupId>com.sun.tools.xjc.maven2</groupId>
<artifactId>maven-jaxb-plugin</artifactId>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<schemaDirectory>src/main/resources/<companyname>/xsd</schemaDirectory>
<includeSchemas>
<includeSchema>retrieval.xsd</includeSchema>
<includeSchema>storage.xsd</includeSchema>
</includeSchemas>
</configuration>
</plugin>
по-видимому, мы используем еще один плагин jaxb... (видеть также эта нить:разница плагинов Maven JAXB).
возможно, попробуйте использовать maven-jaxb2-plugin
вместо:
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.8.2</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
</plugin>
ответ от dfuse является правильным, хотя. Любой плагин должен генерировать источники перед компиляцией, и результат генерации источника будет находиться на пути к классам. Я протестировал это с обоими плагинами. Возможно ли опубликовать вашу схему или, по крайней мере, схему для типа, который ваш код не может получить на пути к классам?