2010-11-10 10 views
21

Tengo un proyecto de varios módulos.¿Cómo hacer que un módulo dependa de otro artefacto de módulo?

A: parent. 
    B: child1. 
    C: child2. 

B será empaquetado para obtener el archivo jar y luego c utilizará este archivo jar para compilar el código.

En B, si me quedo mvn package, se creará b.jar (estancias en B/target/jars no en B/target -por otro propósito).

En C, necesito usar ese b.jar para compilar el código.

Ahora, desde A, cuando ejecuto: mvn package. En primer lugar, tengo éxito para crear b.jar archivo para B.

Pero cuando se trata de la fase de compilación de C, parece que C no reconoce b.jar en la ruta de clase (la compilación obtiene errores porque el código de C no puede importar la clase archivo de B).

Mi pregunta es: ¿Cómo puedo resolver este problema?

---------- Below son los archivos pom

A: pom.xml 
    <groupId>AAA</groupId> 
    <artifactId>A</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>pom</packaging> 

    <modules> 
    <module>C</module> 
    <module>B</module> 
    </modules> 

B: pom.xml 
     <groupId>AAA</groupId> 
<artifactId>B</artifactId> 
<packaging>jar</packaging> 
<version>0.0.1-SNAPSHOT</version> 
<parent> 
    <artifactId>A</artifactId> 
    <groupId>AAA</groupId> 
    <version>0.0.1-SNAPSHOT</version> 
</parent> 

C: pom.xml 
     <parent> 
    <artifactId>A</artifactId> 
    <groupId>AAA</groupId> 
    <version>0.0.1-SNAPSHOT</version> 
</parent> 

<groupId>AAA</groupId> 
<artifactId>C</artifactId> 
<packaging>war</packaging> 
<version>0.0.1-SNAPSHOT</version> 

<dependencies> 

    <dependency> 
    <groupId>AAA</groupId> 
    <artifactId>B</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    </dependency> 
.... 
+6

Así como una mejor práctica (no relacionada con esta cuestión), los módulos B y C no debe declarar su propia groupId y la versión; deberían heredar estos del padre (módulo A) POM. Sin embargo, todavía necesitan declarar su propio empaque y artefacto. –

Respuesta

14

parece que debería funcionar para mí. Pero puede probar mvn install en lugar de mvn package.

+0

Gracias. Es una buena idea. Pero si voy con la instalación, entonces también se instalará el archivo c war. Ese no es aceptado en mi proyecto actual. Solo el archivo jar puede instalar – David

+0

Tiene razón Matt. Iré con la instalación. – David

3

tengo una solución: el uso de la dependencia con el alcance = sistema

en C pom.xml

  <dependency> 
      <groupId>AAA</groupId> 
      <artifactId>B</artifactId> 
      <version>0.0.1-SNAPSHOT</version> 
      <scope>system</scope> 
      <systemPath>${basedir}\..\B\target\jars\b.jar</systemPath> 
     </dependency> 

y en una pom.xml, poner el módulo B en la parte superior como este

<modules> 
     <module>B</module>  
     <module>C</module> 
</modules> 
+2

David, no tengo ni idea de lo que está haciendo y por qué "la guerra no es aceptada en su proyecto actual", pero, no infracción, esto definitivamente no es el camino correcto. –

5

Mi pregunta es cómo puedo resolver este problema?

resolución de dependencias se realiza a través del repositorio local por lo que la forma canónica de "resolver" el problema es ejecutar install de la A fin de que los módulos se consiguen instalado en el repositorio local.

Ahora, en relación con el siguiente comentario

Pero si voy con instalar entonces c archivo de la guerra también se instalará. Eso no es aceptado en mi proyecto actual "

Claro, no estoy en su proyecto, no conozco todas las restricciones y reglas, pero si decide usar Maven, esto es totalmente ridículo política (en serio, WTF?) y el uso de una dependencia de ámbito system ciertamente no es una buena solución (más problemas más adelante garantizados). Si esta política es real, es mejor no utilizar Maven en ese caso.

+0

Oh, tienes razón. Si la instalación solo copia el artefacto en el repositorio local, eso está bien para mí. Pensé que la instalación copiaría el artefacto en el repositorio remoto (confundí entre instalar e implementar). Gracias. – David

1

Haciendo mvn instalar sólo coloca el artefacto en el repositorio .m2 local de la máquina en la que está ejecutando el comando. ¿Cómo puede no ser aceptable? Estoy de acuerdo con Pascal. Si construye A, no debería haber ninguna razón para que la guerra se coloque allí.

Por otro lado, si usted está utilizando Maven 2.2.x, echar un vistazo a la maven reactor plugin? Esto debería ayudar a la locura inaceptable no puede instalar C.war en su política de repositorio .m2 local para el proyecto actual.

+0

Oh, tienes razón. Si la instalación solo copia el artefacto en el repositorio local, eso está bien para mí. Pensé que la instalación copiaría el artefacto en el repositorio remoto (confundí entre instalar e implementar). Gracias. – David

Cuestiones relacionadas