Управление классами, генерируемыми 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 правильный. Любой плагин должен генерировать источники перед компиляцией, а результат генерации источника будет в пути к классам. Я тестировал это с помощью обоих плагинов. Возможно ли опубликовать вашу схему или, по крайней мере, схему для типа, который ваш код не может найти в пути к классам?