2009-11-24 12 views
15

Tengo un módulo maven que tiene algunas dependencias. En un cierto perfil, quiero excluir algunas de esas dependencias (para ser exactos, todas las dependencias con un cierto ID de grupo). Sin embargo, deben estar presentes en todos los demás perfiles. ¿Hay alguna manera de especificar exclusiones de las dependencias para un perfil?Excluir dependencia en un perfil

+0

¿Puede decirnos algo más sobre su caso de uso? Si su módulo tiene dependencias, ¿por qué necesita excluirlas? –

+0

El módulo es parte de una aplicación eclipse RCP. Depende de otros módulos de la aplicación, así como de muchos paquetes de RCP. Quiero usar este perfil para crear la plataforma de destino de eclipse. Esto debe incluir todas las dependencias, excepto aquellas que son parte de la aplicación. Actualmente esto se hace editando el POM, eliminando todas las dependencias que son parte de la aplicación, ejecutando mvn eclipse: installbundles y luego editando el POM nuevamente. Esto es obviamente muy propenso a errores. –

Respuesta

11

Que yo sepa, ningún , no se puede desactivar dependencias (se puede excluir dependencias transitivas pero esto no es lo que está pidiendo) y sí, lo que está haciendo actualmente con el POM (edición manual está mal.

Así, en lugar de eliminar las dependencias, debe ponerlos en un perfil y, o bien:

  • Opción # 1: utilizar el perfil cuando sea requerido o
  • Opción # 2: marcar el perfil como activado por predeterminado o ponerlo en la lista de perfiles activos y desactivarlo cuando sea necesario.

Una tercera opción sería (no perfil basado):

  • Opción # 3: cosas separadas en dos módulos separados (como se han separado las preocupaciones) y el uso de herencia.
+0

El problema con este enfoque es que necesito que las dependencias estén allí todo el tiempo. Necesito crear la plataforma de destino tal vez una vez cada 3 meses. Por lo tanto, tener que especificar un perfil en cada compilación es mucho más complicado que editar el POM manualmente. Los perfiles marcados como activos de forma predeterminada desafortunadamente se desactivan cuando se activa otro perfil, por lo que tampoco me ayudará, ya que a menudo hay otro perfil activo. –

+0

No discutiré sobre los perfiles y cómo los está usando, solo les estoy dando posibles soluciones. Pero no, no puede desactivar dependencias (solo puede excluir dependencias transitivas). Si no los quiere, cree otro módulo. –

+0

Creo que esta es una gran respuesta y no puedo ver por qué no puedes usar el método de la Opción n. ° 2. Simplemente ponga dicha dependencia en el perfil predeterminado y cree otro perfil que no tenga dependencias y actívelo (desactivando el predeterminado) cuando desee construir en el caso que describe. –

3

No creo que sea posible excluir las dependencias directas tampoco (al menos, nada se menciona here).

Lo mejor que puede hacer es encerrar las dependencias deseadas para cada caso en diferentes perfiles (como ya se sugirió), pero deberá crear dos perfiles "mutuamente excluyentes" con uno de ellos "activo por defecto". La manera más confiable de lograr esto es mediante el uso de un parámetro para la activación de su perfil, p.

<profiles> 
    <profile> 
    <id>default-profile</id> 
    <activation> 
     <property><name>!exclude</name></property> 
    </activation> 
    <dependencies> 
     dependency-A 
     dependency-B 
     ... 
    </dependencies> 
    </profile> 

    <profile> 
    <id>exclude-profile</id> 
    <activation> 
     <property><name>exclude</name></property> 
    </activation> 
    <!-- exclude/replace dependencies here --> 
    </profile> 
</profiles> 

A continuación, utilizando "mvn [objetivo]" va a utilizar el perfil "default-perfil", pero "mvn [meta] -Dexclude" va a utilizar el perfil "excluir perfil".

Tenga en cuenta que el uso de 'activeByDefault' en lugar de un parámetro para su perfil "predeterminado" puede funcionar en algunos casos, pero también puede conducir a un comportamiento inesperado. El problema es que 'activeByDefault' hace que un perfil esté activo siempre que no haya otro perfil activo en ningún otro módulo de una compilación de varios módulos.

5

Una forma en que se me ocurre es tener las dependencias en un pom separado. Luego puede agregar una sección <exclusions> a través del perfil.

<dependencies> 
    <dependency> 
     <groupId>my.company.dependencies</groupId> 
     <artifactId>my-dependencies</artifactId> 
     <version>1.0.0-SNAPSHOT</version> 
     <type>pom</type> 
    </dependency> 
</dependencies> 

<profile> 
    <activation> 
     <activeByDefault>false</activeByDefault> 
     <property> 
      <name>exclude-deps</name> 
     </property> 
    </activation> 

    <dependencies> 
     <dependency> 
      <groupId>my.company.dependencies</groupId> 
      <artifactId>my-dependencies</artifactId> 
      <version>1.0.0-SNAPSHOT</version> 
      <type>pom</type> 
      <exclusions> 
       <exclusion> 
        <groupId>my.company</groupId> 
        <artifactId>bad-dep-1</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>my.company</groupId> 
        <artifactId>bad-dep-2</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
</dependencies> 
</profile> 
4

En lugar de excluir las dependencias en un perfil, se puede establecer como provided en ella. Esto no requiere ninguna configuración demasiado compleja y excluirá las dependencias que no desea de la compilación final.

En el perfil deseado, agregue una sección dependencies, copie la declaración de las que desea excluir y márquelas como provided.

Por ejemplo, vamos a decir que desea excluir slf4j-log4j12:

<profiles> 

    <!-- Other profiles --> 

    <profile> 
     <id>no-slf4j-log4j12</id> 
     <dependencies> 
      <dependency> 
       <groupId>org.slf4j</groupId> 
       <artifactId>slf4j-log4j12</artifactId> 
       <version>1.7.2</version> 
       <scope>provided</scope> 
      </dependency> 
     </dependencies> 
    </profile> 

    <!-- Other profiles --> 

</profiles> 
0

Bit solución sucia pero ligero es utilizar <scope>import</scope>.

A diferencia de los otros ámbitos podría utilizar este:

  • inhabilitará dependecies en tiempo de compilación y tiempo de ejecución; a diferencia de provided o runtime que desactiva sólo uno a la vez
  • no ensuciará su alcance test
  • que no es necesario especificar la ruta a algún frasco de maniquí lo sería system alcance requerir

Nada consigue importado siempre que use este truco fuera de dependencyManagement.

Cuestiones relacionadas