java - generar - Administrar clases generadas por JAXB en un proyecto de Maven
jaxb java anotaciones (3)
Tengo un proyecto basado en Maven, en el que trato de agregar algunas clases JAXB generadas automáticamente por el plugin Maven "jaxb2-maven-plugin". Sin embargo, mi primer corte me tiene en un bucle de dependencia circular:
- Debido a que estas clases JAXB aún no se generan, mis otras fuentes que hacen referencia a ellas tienen errores de compilación.
- Debido a que esas otras fuentes tienen errores de compilación, estas clases JAXB no se generan.
Parece que hay dos posibilidades obvias para resolver esto:
- Comente las referencias rotas, para que el proyecto se genere y las clases JAXB se generen automáticamente. Luego, copie las fuentes generadas de
/target
en/src/main/java
, de modo que las referencias a ellas no provoquen errores de compilación. - Crea un proyecto completamente separado, que consiste en nada más que las cosas de JAXB. Incluirlo como una dependencia en mi proyecto principal.
¿Me estoy perdiendo de algo? La opción n. ° 1 parece completamente ridícula ... esa no es la forma en que las personas usan JAXB. La opción n. ° 2 parece más racional, pero todavía bastante ineficiente y engorrosa. Realmente tengo que asumir el costo de un proyecto completamente separado solo para usar JAXB?
¿Hay algún enfoque más elegante que los desarrolladores usen para hacer referencia a las clases generadas por JAXB en el mismo proyecto donde el plugin Maven las genera?
ACTUALIZACIÓN: Por solicitud, aquí está la parte relevante de mi 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>
Cuando mvn clean package
, SI veo que mis fuentes JAXB se generan debajo del subdirectorio /target
. Sin embargo, esas fuentes generadas no se agregan automáticamente a la ruta de clases para la fase de compilación.
ACTUALIZACIÓN POST RESOLUCIÓN: Resulta que mis problemas de compilación tenían más que ver con el hecho de que estaba ejecutando en Eclipse, y su integración con Maven tiene algunos problemas con "jaxb2-maven-plugin". Consulte esta pregunta de StackOverflow para obtener más detalles sobre ese problema y su resolución.
Le sugiero que divida las clases generadas por jaxb (api) y sus clases BL (implementación) en 2 proyectos maven con pom.xml por separado para cada uno, y la raíz principal pom.xml con el orden de compilación. De esta forma, podrá construir api.jar, luego maven lo instalará dentro del repositorio local y luego podrá usarlo como dependencia de su implementación. por lo que se verá así:
-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
Tal vez intente usar el maven-jaxb2-plugin
lugar:
<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>
La respuesta de dfuse es correcta, sin embargo. Cualquiera de los complementos debe generar fuentes antes de compilar, y el resultado de la generación de la fuente estará en la ruta de clases. Probé esto con ambos complementos. ¿Es posible que publique su esquema, o al menos el esquema del tipo que su código no puede recoger en el classpath?
¿Cómo configuró su plugin jaxb maven? Normalmente se ejecuta en el ciclo de vida de generación de fuentes, que viene antes del ciclo de vida de la compilación. Por lo tanto, las clases generadas por JAXB ya deberían estar allí cuando se compile su propio código, Maven las coloca en target / generated-source y coloca esa carpeta en classpath.
Editar : Este es mi código que usamos en el trabajo (y que funciona como se espera):
<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>
Aparentemente usamos otro plugin jaxb ... (vea también este hilo: Diferencia de plugins Maven JAXB ).