2012-01-31 24 views
7

Aquí es un pequeño ejemplo de lo que me gustaría lograr:distribuir archivos XSD a través de múltiples artefactos Maven

Maven Artefacto A es uno de los muchos servicios web y define un esquema XSD con definiciones para solicitudes y respuestas. (src/main/resources/xsd)

El artefacto A depende del Artefacto B que es un proyecto JAR simple y contiene una multitud de de Master XSD con descripciones de tipo de nivel bajo. (Src/main/resources/xsd)

Los XSDs en Artefacto Un usan las definiciones de tipos (incluyen) que se especifican una vez en Artefacto B.

Si es posible me gustaría saber cómo incluye archivos xsd que se encuentran en un jar que se carga como una dependencia maven y cómo resolver el servicio web xsd (y wsdl) en IDE como Netbeans y Eclipse.

Si este enfoque parece exótico, ¿existen mejores prácticas para un diseño limpio?

actualización

En primer lugar aquí es un ejemplo sencillo de cómo yo esperaría que el esquema incluye a trabajar ....

Artifact A (WAR Module) 
POM: 
... 
<artifactId>A</artifactId> 
... 
<dependency> 
    <artifactId>B</artifactId> 
    ... 
</dependency> 

Schema: 
.... 
<xs:include schemaLocation="classpath://net/elfwyn/xsd/schema.xsd"/> 
.... 

Artifact B (JAR Module) 

Schema Location: 
src/main/resources/net/elfwyn/xsd/schema.xsd 

Parece que hay varios sollutions para un problema como este, pero no sé cómo implementarlos en mi entorno:

Conozco los Resoltores de Catálogo integrados en el (IDE de netbeans7.1) (para entorno dev) y disponibles como Complementos Maven (para entorno productivo), th at debería poder especificar un alias en la ubicación del archivo de esquema. Este alias se debe usar como la ubicación del esquema.

Sin embargo, no sé cómo especificar un Catalog.xml que acceda a los esquemas dentro de un archivo JAR. Para mí, parece ser el mismo problema que especificarlo en la ubicación del esquema directamente. También existe la sobrecarga de mantener el catálogo para cada WAR - proyecto que prefiero no tomar si es posible.

En cuanto al complemento Maven, aún no he encontrado nada definitivo.

Otros sources están poniendo en práctica un dispositivo de resolución catálogo personalizado en el contexto de JAX-b, pero todavía no puede ver una posible gancho para la implementación de una resolución de este tipo en un entorno Java-WS, y cómo se debe trabajar en conjunto con el maven-plugin mencionado anteriormente o el IDE Catalog resolver ...

Respuesta

6

Creo que su pregunta es razonable. En el pasado, a menudo he encontrado que tengo un módulo Maven que necesita hacer un procesamiento especial en archivos que se pueden encontrar en JAR dependientes.

Lo que he hecho en el pasado es hacer Artefacto B una dependencia del Artefacto A. Luego, en el pom.xml de Artefacto AI utilizar una configuración especial del plugin Maven dependencia de la siguiente manera:

<plugin> 
    <!-- Used to pull XSD files from the JAR --> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <executions> 
      <execution> 
       <id>unpack-xsd-files</id> 
       <!-- Using the initialize phase because it is before the generate sources phase --> 
       <phase>initialize</phase> 
        <goals> 
         <goal>unpack</goal> 
        </goals> 
        <configuration> 
         <artifactItems> 
          <artifactItem> 
           <!-- Artifact that Holds our custom templates --> 
           <groupId>com.mycorp</groupId> 
           <artifactId>artifact-b</artifactId> 
           <version>${artifact-b.version}</version> 
           <type>jar</type> 
          </artifactItem> 
         </artifactItems> 
         <includes>**/*.xsd</includes> 
         <outputDirectory>${project.basedir}/target/xsd-includes</outputDirectory> 
        </configuration> 
      </execution> 
    </executions> 
</plugin> 

Ahora sus archivos XSD de interés se pueden encontrar en el directorio de destino de Artifact A y desde allí puede hacer lo que quiera con ellos. Puede incluirlos como recursos, hacer referencia a ellos desde otros archivos XSD, incrustarlos en sus propios JAR o lo que sea.Como puede ver en la configuración, tampoco tiene que ponerlos en su directorio de destino; puede ponerlos directamente en su directorio /src/main/resources.

Puede agregar esta configuración a cualquier módulo Maven que desee para que todos los módulos funcionen de la misma manera. Lo bueno de este enfoque es que también funcionará con Eclipse a través de M2Eclipse.

+0

Todavía no tenía tiempo para comprobar su solución, pero como suena muy razonable y la recompensa se agotará pronto, tomaré esto como la respuesta correcta. ¡Gracias! – elfwyn

+0

@Stefan - Gracias y deja un comentario aquí si tienes un problema y lo solucionaremos. – HDave

+0

Si vincula esto a 'initialize', a veces el directorio' target' aún no existirá. También he tenido grandes problemas (en Eclipse, pero también usando 'mvn: compile') con el temido' la fuente no debe ser un directorio' de 5 años de error en maven. +1 de todos modos, ya que es la solución más limpia. – artbristol

Cuestiones relacionadas