Maven: agrega una dependencia a un jar por ruta relativa

Tengo un contenedor propietario que quiero agregar a mi pom como una dependencia.

Pero no quiero agregarlo a un repository. La razón es que quiero que mis comandos maven usuales, como mvn compile , etc., funcionen de la caja. (Sin exigir a los desarrolladores agregarlo a un repository por sí mismos).

Quiero que el contenedor esté en una biblioteca de terceros en el control de código fuente y que se vincule mediante una ruta relativa desde el archivo pom.xml.

Se puede hacer esto? ¿Cómo?

Quiero que el contenedor esté en una biblioteca de terceros en el control de código fuente y que se vincule mediante una ruta relativa desde el archivo pom.xml.

Si realmente quiere esto (entiendo, si no puede usar un repository corporativo), mi consejo sería usar un “repository de archivos” local para el proyecto y no usar una dependencia de ámbito del system . Debe evitarse el scope del system , estas dependencias no funcionan bien en muchas situaciones (por ejemplo, en el assembly), causan más problemas que beneficios.

Entonces, en su lugar, declare un repository local para el proyecto:

   my-local-repo file://${basedir}/my-repo   

Instale su lib de terceros allí usando install:install-file con el parámetro localRepositoryPath :

 mvn install:install-file -Dfile= -DgroupId= \ -DartifactId= -Dversion= \ -Dpackaging= -DlocalRepositoryPath= 

Actualización: parece que install:install-file ignora localRepositoryPath cuando usa la versión 2.2 del complemento. Sin embargo, funciona con la versión 2.3 y posterior del complemento. Por lo tanto, utilice el nombre completo del complemento para especificar la versión:

 mvn org.apache.maven.plugins:maven-install-plugin:2.3.1:install-file \ -Dfile= -DgroupId= \ -DartifactId= -Dversion= \ -Dpackaging= -DlocalRepositoryPath= 

documentación de maven-install-plugin

Finalmente, declararlo como cualquier otra dependencia (pero sin el scope del system ):

  your.group.id 3rdparty XYZ  

Esto es en mi humilde opinión una mejor solución que usar un scope de system ya que su dependencia será tratada como un buen ciudadano (por ejemplo, se incluirá en un ensamblado, etc.).

Ahora, debo mencionar que la “forma correcta” de tratar con esta situación en un entorno corporativo (tal vez no sea el caso aquí) sería usar un repository corporativo.

Usando el scope del system . ${basedir} es el directorio de tu pom.

  .. .. system ${basedir}/lib/dependency.jar  

Sin embargo, es aconsejable que instale su jar en el repository y no lo comprometa con el SCM, después de todo eso es lo que maven trata de eliminar.

Este es otro método además de mi respuesta anterior en ¿Puedo agregar archivos jar a maven 2 classpath de comstackción sin instalarlos?

Esto superará el límite cuando se utilicen comstackciones de varios módulos, especialmente si se hace referencia al JAR descargado en proyectos secundarios fuera del padre. Esto también reduce el trabajo de configuración al crear los archivos POM y SHA1 como parte de la comstackción. También permite que el archivo resida en cualquier parte del proyecto sin corregir los nombres o siguiendo la estructura del repository maven.

Esto usa maven-install-plugin. Para que esto funcione, debe configurar un proyecto de varios módulos y tener un nuevo proyecto que represente la comstackción para instalar archivos en el repository local y asegurarse de que sea el primero.

Su proyecto multimodal pom.xml se vería así:

 pom   repository ... other modules ...  

El archivo repository / pom.xml contendrá las definiciones para cargar los JAR que son parte de su proyecto. Los siguientes son algunos fragmentos del archivo pom.xml.

 repository pom 

El paquete pom evita que esto haga pruebas o comstack o genera cualquier archivo jar. La carne de pom.xml está en la sección de construcción donde se usa maven-install-plugin.

    org.apache.maven.plugins maven-install-plugin   com.ibm.db2:db2jcc verify  install-file   com.ibm.db2 db2jcc 9.0.0 jar ${basedir}/src/jars/db2jcc.jar true true   ...     

Para instalar más de un archivo, simplemente agregue más ejecuciones.

Anteriormente escribí sobre un patrón para hacer esto.

Es muy similar a la solución propuesta por Pascal, aunque mueve todas esas dependencias a un módulo de repository dedicado para que no tenga que repetirlo en todas partes donde se usa la dependencia si se trata de una comstackción de varios módulos.

Esto está funcionando para mí: digamos que tengo esta dependencia

  com.company.app my-library 1.0 system ${project.basedir}/lib/my-library.jar  

A continuación, agregue la ruta de clase para la dependencia del sistema de forma manual como esta

 libs/my-library-1.0.jar 

Configuración completa:

  org.apache.maven.plugins maven-jar-plugin 2.4    ${jdk.version} ${project.name} ${project.version} ${project.name} Library ${project.version} libs/my-library-1.0.jar   true com.company.app.MainClass libs/      org.apache.maven.plugins maven-dependency-plugin 2.5.1   copy-dependencies package  copy-dependencies   ${project.build.directory}/libs/     

cambiamos a gradle y esto funciona mucho mejor en gradle;). simplemente especificamos una carpeta en la que podemos depositar los archivos jar para situaciones temporales como esa. Todavía tenemos la mayoría de nuestros archivos definidos en la sección de administración de dependencias típicas (es decir, lo mismo que maven). Esta es solo una dependencia más que definimos.

así que, básicamente, ahora podemos simplemente colocar cualquier jar que queramos en nuestro directorio lib para pruebas temporales si no es un repository maven en alguna parte.

Básicamente, agregue esto al pom.xml:

 ...   lib_id file://${project.basedir}/lib   ...  ...  com.mylibrary mylibraryname 1.0.0  ...  

Una pequeña adición a la solución publicada por Pascal

Cuando seguí esta ruta, recibí un error en maven al instalar ojdbc jar.

 [INFO] --- maven-install-plugin:2.5.1:install-file (default-cli) @ validator --- [INFO] pom.xml not found in ojdbc14.jar 

Después de agregar -DpomFile, el problema se resolvió.

 $ mvn install:install-file -Dfile=./lib/ojdbc14.jar -DgroupId=ojdbc \ -DartifactId=ojdbc -Dversion=14 -Dpackaging=jar -DlocalRepositoryPath=./repo \ -DpomFile=~/.m2/repository/ojdbc/ojdbc/14/ojdbc-14.pom 

Puede usar eclipse para generar un archivo ejecutable Jar: Export / Runable Jar