2012-08-15 17 views
10

que tienen un proyecto basado en Maven, en el que se trata de añadir algunas clases JAXB generados automáticamente por el "jaxb2-maven-plugin de" Maven plugin. Sin embargo, mi primer corte me tiene en un bucle de dependencia circular:clases generadas JAXB-gerente en un proyecto Maven

  • Como estas clases JAXB aún no se generan, mis otras fuentes que hacen referencia a ellas tienen errores de compilación.
  • Debido a esas otras fuentes tienen errores de compilación, estas clases JAXB No se deje generado.

Parece que hay dos posibilidades obvias para la solución de este

:
  1. Comentario de salida las referencias rotas, por lo que el proyecto se basa y las clases JAXB se generan automáticamente. Luego copie esas fuentes generadas de /target en /src/main/java, de modo que las referencias a ellas no causen errores de compilación.
  2. 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 algo aquí? Opción # 1 parece ridícula casa por la ventana ... que simplemente no puede ser la manera en que la gente utiliza 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 enfoques más elegantes que los desarrolladores utilizan para hacer referencia a las clases generadas por JAXB en el mismo proyecto en el que el plugin de Maven los genera?

ACTUALIZACIÓN: Por petición, aquí es 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 corro mvn clean package, veo mis fuentes JAXB que se generan por debajo de la /target subdirectorio. Sin embargo, esas fuentes generadas no se agregan automáticamente a la ruta de clases para la fase de compilación.

POSTERIOR A LA RESOLUCIÓN DE ACTUALIZACIÓN: Resulta que mis problemas de compilación tenían más que ver con el hecho de que yo estaba corriendo en Eclipse, y su integración Maven tiene algunos problemas con "jaxb2-experto-plugin". Consulte this StackOverflow question para obtener más detalles sobre ese problema y su resolución.

+0

Por favor, publique las secciones correspondientes del POM. – jiggy

Respuesta

7

sugiero que divida clases generadas por jaxb (api) y sus clases BL (implementación) a 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 
+0

Gracias. Resulta que mis problemas tenían más que ver con Eclipse que con cualquier otra cosa (ver mi actualización al final de la pregunta). En cuanto al problema de la "dependencia circular", decidí comenzar escribiendo primero las clases de Java ... en lugar de comenzar con el esquema XML e ir por el otro camino. Luego coloco estas clases de modelo en el JAR del cliente (que también está en el classpath de la aplicación del servidor), y todos están contentos. –

9

¿Cómo se configura su jaxb Maven plugin? 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 utilizamos 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> 

Al parecer, utilizamos otro plug-in jaxb ... (véase también en este tema: Difference of Maven JAXB plugins) .

+0

He actualizado la pregunta original para incluir la parte del complemento de mi POM. –

3

Tal vez intente utilizar 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 correcto, 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?

+0

Uso y recomendaría el complemento org.jvnet también. Si su problema no se resuelve antes del viernes, puedo compararlo con los poms en el trabajo, ver lo que podría faltar. –

+0

Corrección, no uso ese complemento (aunque lo he intentado). Publiqué mi código en mi respuesta. –

Cuestiones relacionadas