2012-10-10 22 views
6

Creé un arquetipo donde puede establecer el moduleName (o esperar) usando una propiedad requerida moduleName, aquí está el arquetipo de metadatos xml (reducido, que también probé con resultados similares)arquetipo Maven no usando propiedades para crear nombres de módulo

<?xml version="1.0" encoding="UTF-8"?> 
<archetype-descriptor name="modules-archetype"> 

    <requiredProperties> 
    <requiredProperty key="moduleName"> 
    </requiredProperty> 
    </requiredProperties> 

    <modules> 
    <module id="modules-${moduleName}-api" 
      dir="modules-__moduleName__-api" 
      name="modules-${moduleName}-api"> 
     <fileSets> 
     <fileSet encoding="UTF-8"> 
      <directory>src/main/java</directory> 
     </fileSet> 
     </fileSets> 
    </module> 
    </modules> 

</archetype-descriptor> 

Después de instalar y de generación, el valor moduleName no se utiliza en el nombre directorio o el artifactId, los valores resuting son

For the directory:  project/module-__moduleName__-api 
For the pom/artifactId: module-${moduleName}-api 

el valor se sustituye correcta en algunos otros archivos del proyecto, así que no hay problemas de ortografía, supongo.

He visto muchas cosas similares, pero todas ellas usan rootArtifactId, y de hecho si uso rootArtifactId (como la parte inicial del nombre) funciona como se esperaba.

No se puede encontrar un problema similar, ¿por qué no funciona o cómo hacerlo funcionar?

Respuesta

2

Mirando el interior de las fuentes experto-arquetipo (versión 2.2), parece el único valor posible utilizar se extrae rootArtifactId de DefaultFilesetArchetypeGenerator

while (subprojects.hasNext()) { 

     ModuleDescriptor project = subprojects.next(); 

     File moduleOutputDirectoryFile = new File(outputDirectoryFile 
      , StringUtils.replace(project.getDir() 
        , "__rootArtifactId__" 
        , rootArtifactId 
        )); 
     ........... 
+0

consulte el error http://jira.codehaus.org/browse/ARCHETYPE-191 la que hace No aclaro mucho las cosas, pero al menos el problema ya está alrededor de – tonio

3

me encontré con una razonable solución temporal.

parece ser el único lugar en el que sólo se puede utilizar el rootArtifactId es el elemento <module> en el descriptor arquetipo, pero en todos los demás lugar se puede utilizar la propiedadModuleName sin ningún problema.

Lo que hice:

Uso $ {ModuleName} en

  • artifactId en pom del módulo
  • algunas dependencias predeterminadas
  • La definición de módulo en el pom principal (<module>module-${moduleName}</module>)
  • etc.

Use __ __ ModuleName en

  • nombre del paquete en src/main/java & recursos

En el descriptor artefacto

  • Utilice un nombre de módulo fijo como module-sample1 & module-sample2 (y, por supuesto, nombre los directorios dentro de los recursos de artefactos de la misma manera).

cosas que arreglar después de crear el proyecto

  1. nombre del directorio de los módulos
  2. Sacar los elementos del módulo en el pom principal que contiene módulo de la muestra [12]

Todo esto en un script ant incrustado en postcreate-pom.xml que se ejecutará después de la creación del proyecto.

Y funcionó sin problemas.

Espero que sea útil para alguien.

gracias a todos los que simplemente se toman el tiempo para leer mi pregunta , tonio.

+1

. Tengo el mismo problema. ¿Qué quieres decir con 'postcreate-pom.xml'? ¿Existe una forma estándar de realizar alguna acción de post-creación al final de la creación de un proyecto? –

+0

Bueno, no encontré la manera de hacerlo, simplemente creo postcreate-pom.xml como parte del proyecto y lo ejecuto luego para completar la configuración del proyecto. – tonio

1

Después de generar el arquetipo de un proyecto, edite el archivo target\generated-sources\archetype\src\main\resources\META-INF\maven\archetype-metadata.xml.

Añadir

<fileSet filtered="true" packaged="true" encoding="UTF-8"> 
     <directory></directory> 
     <includes> 
     <include>pom.xml</include> 
     </includes> 
    </fileSet> 

Esto hará que sea filtrar su archivo pom! Luego ejecute mvn install nuevamente.

+0

El problema que tuve fue que traté de usar $ {artifactId} en uno de los archivos config .yml y no funcionó. Entrando en archetype-metadata.xml e incluye */**. Yml funciona. Gracias – vutbao

0

arquetipo-metadata.xml y el pom.xml de la sub-módulo:

<?xml version="1.0" encoding="UTF-8"?> 
<archetype-descriptor name="multi-module"> 

    <modules> 
    <module name="${rootArtifactId}-ria" id="${rootArtifactId}-ria" dir="__rootArtifactId__-ria"> 
     <fileSets> 
     <fileSet filtered="true" packaged="true"> 
      <directory>src/main/java</directory> 
      <includes> 
      <include>**/*.java</include> 
      </includes> 
     </fileSet> 
     <fileSet filtered="true" packaged="true"> 
      <include>pom.xml</include> 
     </fileSet> 
     </fileSets> 
    </module> 
    </modules> 


</archetype-descriptor> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <parent> 
    <groupId>${groupId}</groupId> 
    <artifactId>${rootArtifactId}</artifactId> 
    <version>${version}</version> 
    </parent> 

    <artifactId>${artifactId}</artifactId> 
    <packaging>war</packaging> 

</project> 
Cuestiones relacionadas