Управление классами, генерируемыми JAXB, в проекте Maven
У меня есть проект на основе Maven, в котором я пытаюсь добавить некоторые классы JAXB, автоматически создаваемые плагином Maven для jaxb2-maven-plugin. Тем не менее, мой первый разрез меня в цикле циклических зависимостей:
- Поскольку эти классы JAXB еще не созданы, мои другие источники, которые ссылаются на них, имеют ошибки компиляции.
- Поскольку эти другие источники имеют ошибки компиляции, эти классы JAXB не генерируются.
Кажется, есть две очевидные возможности для решения этого вопроса:
- Комментируйте неработающие ссылки, чтобы проект строился, и классы JAXB автоматически генерируются. Затем скопируйте те сгенерированные источники из
/target
в /src/main/java
, чтобы ссылки на них не вызывали ошибок компиляции.
- Создайте полностью отдельный проект, состоящий из ничего, кроме материала JAXB. Включите его в качестве зависимости в моем основном проекте.
Я что-то упустил? Вариант №1 кажется нелепым, что просто не может быть тем, как люди используют JAXB. Вариант № 2 кажется более рациональным, но все же довольно неэффективным и громоздким. Мне действительно нужно взять верх над полностью отдельным проектом, чтобы использовать JAXB?
Есть ли еще более элегантные подходы, которые разработчики используют для ссылки на классы, созданные JAXB, в том же проекте, в котором их генерирует плагин Maven?
ОБНОВЛЕНИЕ: По запросу здесь находится соответствующая часть моего POM:
<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". См. qaru.site/info/479711/... для более подробной информации об этой проблеме и ее разрешении.
Ответы
Ответ 1
Я предлагаю вам разделить классы jaxb-сгенерированные классы (api) и ваши классы BL (реализация) на 2 проекта maven с отдельным pom.xml для каждого и основной root 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
Ответ 2
Как вы настроили плагин jaxb maven? Обычно он выполняется в жизненном цикле генерации источников, который предшествует жизненному циклу компиляции. Таким образом, ваши сгенерированные классы JAXB уже должны быть там, когда ваш собственный код скомпилирован, Maven помещает их в целевой/сгенерированный источник и помещает эту папку в путь к классам.
Edit:
Это мой код, который мы используем на работе (и который работает как ожидалось):
<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).
Ответ 3
Возможно, попробуйте вместо 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 правильный. Любой плагин должен генерировать источники перед компиляцией, а результат генерации источника будет в пути к классам. Я тестировал это с помощью обоих плагинов. Возможно ли опубликовать вашу схему или, по крайней мере, схему для типа, который ваш код не может найти в пути к классам?