jaxb2-annotate-plugin: добавление аннотаций в путь к классам XJC

Можно ли добавить пользовательские аннотации в путь к классам XJC, в то время как они определены в самом моем проекте? Это при использовании maven jaxb2-annotate-plugin.

Проблема касается этой части документации:

Классы аннотаций должны быть известны во время компиляции. т.е. классы аннотаций должны быть доступны в пути к классам XJC. Если вы хотите использовать свои собственные аннотации, вы должны их предварительно скомпилировать и добавить свои классы аннотаций в путь к классам XJC.

Когда я делаю отдельный проект и добавляю его в плагин, он отлично работает, как показано в примерах документации.

<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <version>0.12.3</version>
    <executions>
        <execution>
            <id>generate</id>
            <phase>process-resources</phase>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <args>
                    <arg>-Xannotate</arg>
                </args>
                <plugins>
                    <plugin>
                        <groupId>org.jvnet.jaxb2_commons</groupId>
                        <artifactId>jaxb2-basics-annotate</artifactId>
                        <version>1.0.2</version>
                    </plugin>
                    <plugin>
                        <groupId>com.acme</groupId>
                        <artifactId>external-project</artifactId>
                        <version>1.0.0</version>
                    </plugin>
                </plugins>
            </configuration>
        </execution>
    </executions>
</plugin>

Но я хотел бы использовать аннотацию, которая находится в том же проекте. Как мне позволить его забрать? Если я скомпилирую его на этапе до process-resources со следующим фрагментом:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.3.2</version>
    <executions>
        <execution>
            <id>compile</id>
            <phase>process-resources</phase>
            <goals>
                <goal>compile</goal>
            </goals>
        </execution>  
    </executions>
</plugin>

Класс компилируется перед генерацией из моего XSD, но я все равно получаю исключение AnnotationClassNotFoundException. Я бы не хотел создавать отдельные проекты и/или модули только для добавления аннотаций. Почему он не может найти мои классы, и единственным способом предоставления аннотаций являются внешние проекты/модули?


person Jaims    schedule 09.03.2016    source источник


Ответы (2)


Я нашел решение своей проблемы.

При настройке плагина maven-jaxb2-plugin можно указать зависимости для этого плагина. При предоставлении моего собственного проекта в качестве зависимости он может найти для него классы. Итак, получается следующее:

<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <version>0.12.1</version>
    <executions>
        <execution>
            <id>generate</id>
            <phase>process-resources</phase>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <args>
                    <arg>-Xannotate</arg>
                </args>
                <plugins>
                    <plugin>
                        <groupId>org.jvnet.jaxb2_commons</groupId>
                        <artifactId>jaxb2-basics-annotate</artifactId>
                        <version>1.0.2</version>
                    </plugin>
                </plugins>
            </configuration>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>current-project</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>
</plugin>

Однако необходимо, чтобы ваши аннотации были скомпилированы заранее. Поэтому, чтобы скомпилировать его заранее, следующий плагин должен быть добавлен перед maven-jaxb2-plugin

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.5.1</version>
    <executions>
        <execution>
            <phase>process-resources</phase>
            <id>compile</id>
            <goals>
                <goal>compile</goal>
            </goals>
        </execution>
    </executions>
</plugin>
person Jaims    schedule 09.03.2016

Проблема в том, что это первый раз mvn clean install. Что делать, если вы еще не скомпилировали его? Например, перейдите в свой .m2 или mavel-local-repo и отмените свой проект, а затем выполните mvn clean install и посмотрите, не сработает ли он.

person Albin. Com.    schedule 01.02.2018