2009-10-28 16 views
40

Tenemos proyectos de java y flex en el trabajo. Actualmente tenemos 1 base pom que contiene las configuraciones que queremos usar para ambos proyectos. El problema con esto es: los proyectos flexibles heredan la configuración para javadoc y pmd, por ejemplo, que no desean.¿Los proyectos de Maven pueden tener padres múltiples?

Quiero hacer esto un poco más limpio y tener una verdadera base-pom y luego una java-base-pom y una flex-base-pom. Pero, ¿cómo funciona esto en un multímetro que tiene tanto una parte flexible como una parte Java?

Tenemos plugins a nuestra propia aplicación en la que se utiliza la siguiente estructura:

  • mi-plugin
    • mi-plugin-cliente (flex)
    • mi-plugin-servidor (Java)

El mi-plugin sólo contiene un pom.xml con la sección. Usaría my-plugin pom.xml como parent para ambos, pero tampoco puedo usar java base-pom o flex base-pom como parent. ¿Cuál sería la mejor aproximación para esto?

Respuesta

27

Un proyecto puede tener un solo progenitor (a diferencia de la herencia múltiple en C++), pero este padre puede ser parte de una jerarquía de elementos primarios más grande. Como se ha comentado en otras, podría por lo tanto tener algo como esto:

 
base-pom/ 
|-- flex-base-pom 
| |-- my-plugin-client 
| | `-- pom.xml 
| `-- pom.xml 
|-- java-base-pom 
| |-- my-plugin-server 
| | `-- pom.xml 
| `-- pom.xml 
`-- pom.xml 

Dicho esto, me di cuenta de que escribió que el problema real es que:

proyectos de Flex heredan la configuración de javadoc y PMD para ejemplo, que no quieren.

Usted debe usar el elemento pluginManagement para evitar esta situación:

pluginManagement es un elemento que se ve a lo largo plugins secundarios. La administración de complementos contiene elementos de complementos de la misma manera, excepto que en lugar de configurar la creación de complementos para esta compilación de proyecto en particular, se pretende configurar compilaciones de proyectos heredadas de esta. Sin embargo, esto solo configura los complementos a los que se hace referencia en el elemento de complementos en los elementos secundarios. Los niños tienen todo el derecho de anular las definiciones de PluginManagement.

Así, en el pom padres, configurar los plugins en pluginManagement (javadoc y PMD por ejemplo), y hacer referencia a ellos en el elemento plugins en los hijos deseados (sólo en mi-plugin-servidor aquí). Esto resolvería tu problema actual.

+0

Gracias por la respuesta, pero como dije en un comentario a la otra respuesta, esta no es una estructura que pueda usar. Si no aparece nada más, entonces pluginManagement podría ser la única forma de hacerlo. El inconveniente es que no puedo aplicar PMD en todos los proyectos Java, ya que solo está en pluginManagement y el proyecto en sí tiene que agregarlo a su propia sección de complementos. –

+0

Aceptando esto como la respuesta. Con el estado actual de Maven, usar pluginManagement será la mejor solución. –

2

Simplemente imagen que pom.xml son de hecho clases Java: puede tener solo un padre (o extiende una clase), pero este padre también puede tener otro padre, y así sucesivamente.

Como expliqué here, debe distinguir los principios primarios y de agregación en Maven, lo que significa que my-plugin se consideraría como un proyecto de agregación, no necesariamente un proyecto principal para my-plugin-client y my-plugin -padre.

Entonces, para resumir:

my-plugin definirá el pom de base para todos sus proyectos. A continuación, crea dos nuevos proyectos pom: java-base-pom y flex-base-pom. Ambos tienen my-plugin como padre. Ahora, my-plugin-client tendrá java-base-pom como padre, mientras que my-plugin-server usará flex-base-pom para su padre.

De esta forma, my-plugin-client heredará todas las propiedades definidas en el pom.xml my-plugin, y también en el proyecto java-base-pom.

+0

Tal vez no fui lo suficientemente claro. Los poms base deben estar en la raíz de la jerarquía porque la aplicación en sí misma también depende de él, o de cualquier otro módulo Java que construyamos. Es que al lado de eso también tengo esta estructura de complemento que necesitaría un tipo de 2 padres, pero parece que no es posible. –

6

La única manera es tener base-pom como padre de java-base-pom y flex-base-pom.

que tienen una estructura similar para mis proyectos de primavera:

base-pom (basic configuration - eclipse, reports, repositories, etc) 
| 
+ spring-base-pom (spring definitions) 
    | 
    + spring-jar-base-pom (jar specific definitions) 
    | 
    + spring-war-base-pom (spring web and servlet dependencies) 
    | 
    + spring-webapp-base_pom (spring web mvc dependencies) 
+0

De acuerdo. ¿Cómo funcionarían los padres múltiples de todos modos? ¿Qué pasaría si ambos padres tuvieran propiedades contradictorias? –

+0

El hijo anula al padre, por lo que los ajustes en java-base-pom anularán los de base-pom, child1 los de java-base-pom, etc. De esta forma, java-base-pom y flex-base-pom no están relacionados. –

+0

Tengo dificultades para realizar varios niveles de jerarquía: en mi tercer nivel (análogo a spring-webapp-base_pom), la parte de pluginManagement de parent se omite por completo. ¿Alguna idea de por qué sucede esto? – Neikius

3

he cruzar este proble exacta también, y la mejor solución que encontré fue utilizar la herencia y agregación como sugieren en esta pregunta: does maven support multiple parents (multiple inheritance) ?

Puede tener un pom agregador que no es el padre de los proyectos es agregados.

y explicar la herencia Maven Documentation

y agregación de crear un buen dinámico para el control construye a través de una sola, POM alto nivel (...) Por el contrario, un proyecto POM puede agregar proyectos que hacen no heredar de eso.

De esto tuve mi POM herencia (POM-master contiene configuraciones comunas, y cada uno de los niños Los detalles unos):

 
pom-master 
    |-- pom-java 
    |-- pom-flex 

y por eso mi proyecto puede obtener los detalles de cada uno configuraciones de módulos como se quiera :

 
project (aggregate project-flex & project-java) 
    |-- project-java 
    |  `-- pom.xml => parent = pom-java 
    |-- project-flex 
    |  `-- pom.xml ==> parent = pom-flex 
    `-- pom.xml => parent = pom-master 

esperan que ayude a los demás, así :)

+0

Hola, ¿cómo configurarías maven-site-plugin y maven-release-plugin con esta estructura? – Cristiano

1

puede lograr múltiples inhe ritance con perfiles:

Crea (múltiples) perfiles en el pom raíz y activa automáticamente cualquier variación de estos perfiles logra herencia múltiple de la configuración de maven.

+0

Esto no es ideal porque los proyectos secundarios no pueden controlar la activación de los perfiles definidos en el POM principal. – GuyPaddock

7

A pesar de que los proyectos de Maven tienen un solo padre, pueden importar cualquier número de otros pom de la siguiente manera:

<dependencyManagement> 
    <dependency> 
     <groupId>org.example</groupId> 
     <artifactId>my-shared-dependencies</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
     <type>pom</type> 
     <scope>import</scope> 
    </dependency> 
<dependencyManagement> 

Esto tiene dos diferencias importantes en comparación con uno de los padres:

  1. plugins definidas en el pom importado no se importará
  2. Las dependencias definidas en el pom importado no se agregarán al pom actual, , solo importará dependencias en la sección de administración de dependencias

Sin embargo, si su pom padre tiene un> sección < dependencias y desea incluir los que en sus dependencias a continuación, se puede añadir a los padres a la sección de dependencias al igual que una dependencia regular:

<dependency> 
    <groupId>org.example</groupId> 
    <artifactId>my-shared-dependencies</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
</dependency> 

Aunque la misma dependencia ya se ha importado, la etiqueta de la versión debe especificarse nuevamente. Para reducir la duplicación, se puede almacenar en una propiedad

Cuestiones relacionadas