Управление классами, созданными JAXB, в проекте Maven

у меня есть проект на основе Maven, в котором я пытаюсь добавить некоторые классы JAXB, автоматически генерируемые плагином Maven "jaxb2-maven-plugin". Однако мой первый разрез имеет меня в циклическом цикле зависимостей:

  • поскольку эти классы JAXB еще не созданы, мои другие источники, которые ссылаются на них, имеют ошибки компиляции.
  • поскольку эти другие источники имеют ошибки компиляции, эти классы JAXB не генерируются.

кажется как будто есть две очевидные возможности для решения этого:

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