maven-2 - example - pom maven
Múltiples ámbitos de dependencia en POM (6)
Tengo una dependencia en mi POM que debe establecerse en "proporcionada" para que no se incluya en la compilación, pero aún se puede hacer referencia en mi proyecto. Me gustaría que la misma dependencia tenga un alcance de "prueba" cuando vaya a ejecutar pruebas para no tener que agregar manualmente el jar a mi classpath. ¿Hay alguna manera de hacer esto o lograr resultados similares?
El razonamiento detrás de esto es que tengo algunos archivos jar comunes que se proporcionan en mi directorio lib de JBOSS, por lo que quiero usarlos y mantener el alcance "provisto" de ellos para la guerra que se genera. Sin embargo, cuando ejecuto JUnits desde la línea de comandos, quiero usar el jar del repositorio sin agregarlo manualmente a mi classpath.
Gracias por adelantado
De la documentación de maven :
proporcionado Esto es muy similar a la compilación, pero indica que espera que el JDK o un contenedor proporcione la dependencia en tiempo de ejecución. Por ejemplo, al crear una aplicación web para Java Enterprise Edition, debe establecer la dependencia de la API de Servlet y las API de Java EE relacionadas en el alcance proporcionado porque el contenedor web proporciona esas clases. Este alcance solo está disponible en el classpath de compilación y prueba , y no es transitivo.
Comprobé que esto funciona para mí en maven 3.0.3. Tenía el mismo problema que necesitaba tener una dependencia de servlet durante la compilación y la prueba, pero no compilada porque se envía con la distribución del servidor de aplicaciones.
Encuentre el significado exacto de los ámbitos en Maven
Me referí a Maven http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html
El ámbito de dependencia se usa para limitar la transitividad de una dependencia y también para afectar la classpath usada para varias tareas de compilación.
Hay 6 ámbitos disponibles:
compilar:-
Este es el alcance predeterminado, utilizado si no se especifica ninguno. Las dependencias de compilación están disponibles en todos los classpaths de un proyecto. Además, esas dependencias se propagan a proyectos dependientes.
previsto:-
Esto es muy similar a la compilación, pero indica que espera que el JDK o un contenedor proporcione la dependencia en tiempo de ejecución. Por ejemplo, al crear una aplicación web para Java Enterprise Edition, debe establecer la dependencia de la API de Servlet y las API de Java EE relacionadas en el alcance proporcionado porque el contenedor web proporciona esas clases. Este alcance solo está disponible en el classpath de compilación y prueba, y no es transitivo.
tiempo de ejecución: -
Este ámbito indica que la dependencia no es necesaria para la compilación, pero es para la ejecución. Está en los classpaths de tiempo de ejecución y de prueba, pero no en el classpath de compilación.
prueba:-
Este ámbito indica que la dependencia no es necesaria para el uso normal de la aplicación, y solo está disponible para las fases de compilación y ejecución de pruebas.
sistema:-
Este alcance es similar al proporcionado, excepto que debe proporcionar el JAR que lo contiene explícitamente. El artefacto siempre está disponible y no se busca en un repositorio. importar (solo disponible en Maven 2.0.9 o posterior): - Este alcance solo se usa en una dependencia de tipo pom en la sección. Indica que el POM especificado debe reemplazarse con las dependencias en la sección de ese POM. Dado que son reemplazados, las dependencias con un alcance de importación en realidad no participan en la limitación de la transitividad de una dependencia.
Intente declarar la dependencia dos veces, una vez con cada alcance. Funciona en Maven 2.2.1.
Las cosas confusas suceden con la resolución de dependencia, cuando el mismo artefacto está en el árbol de dependencias dos veces con diferentes ámbitos, pero no creo que deba ser un problema en su caso.
Puede usar un perfil que declare esas dependencias como prueba o según lo previsto, según lo que le resulte más conveniente:
<profiles>
<profile>
<id>whatever</id>
<activation>
<property>
<name>env</name>
<value>whatever</value>
</property>
</activation>
<dependencies>
<dependency>
<groupId>yours</groupId>
<artifactId>yours</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</profile>
<profile>
<id>test</id>
<activation>
<property>
<name>env</name>
<value>test</value>
</property>
</activation>
<dependencies>
<dependency>
<groupId>yours</groupId>
<artifactId>yours</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</profile>
</profiles>
Esos perfiles se activan configurando el env de la propiedad, pero hay otras formas, por defecto de activación, échale un vistazo here .
Tengo el mismo problema, por lo que necesito dos ámbitos para la misma dependencia en la prueba de integración de fase. Uso jetty-plugin para ejecutar el servicio de descanso, y hago algunas pruebas JUnit mientras embarcadero se está ejecutando, pero compilo mi paquete para jboss como, donde Ya tengo "resteasy-cdi", que ausente para el contenedor de servlets de embarcadero ... No he encontrado ninguna solución todavía.
Use el maven-surefire-plugin para ejecutar sus pruebas junit. El alcance de lo provisto también lo hará disponible en el classpath de prueba.