Problemas de enfoques populares
La mayoría de las respuestas que encontrará en Internet le sugerirán que instale la dependencia en su repositorio local o que especifique un alcance de "sistema" en pom
y distribuya la dependencia con la fuente de su proyecto. Pero ambas soluciones son realmente defectuosas.
¿Por qué no debería aplicar el enfoque "Instalar en repositorio local"?
Cuando instala una dependencia en su repositorio local, permanece allí. Su artefacto de distribución funcionará bien siempre que tenga acceso a este repositorio. El problema es que, en la mayoría de los casos, este repositorio residirá en su máquina local, por lo que no habrá forma de resolver esta dependencia en ninguna otra máquina. Claramente, hacer que su artefacto dependa de una máquina específica no es una forma de manejar las cosas. De lo contrario, esta dependencia deberá instalarse localmente en cada máquina que trabaje con ese proyecto, lo que no es mejor.
¿Por qué no debería aplicar el enfoque "Alcance del sistema"?
Los frascos de los que depende con el enfoque de "Alcance del sistema" no se instalan en ningún repositorio ni se adjuntan a sus paquetes de destino. Es por eso que su paquete de distribución no tendrá una forma de resolver esa dependencia cuando se use. Creo que esa fue la razón por la cual el uso del alcance del sistema incluso quedó en desuso. De todos modos, no desea confiar en una función obsoleta.
La solución de repositorio estático en el proyecto
Después de poner esto en tu pom
:
<repository>
<id>repo</id>
<releases>
<enabled>true</enabled>
<checksumPolicy>ignore</checksumPolicy>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<url>file://${project.basedir}/repo</url>
</repository>
para cada artefacto con una identificación de grupo de forma x.y.z
Maven incluirá la siguiente ubicación dentro del directorio de su proyecto en su búsqueda de artefactos:
repo/
| - x/
| | - y/
| | | - z/
| | | | - ${artifactId}/
| | | | | - ${version}/
| | | | | | - ${artifactId}-${version}.jar
Para obtener más información sobre esto, puede leer esta publicación de blog .
Use Maven para instalar en el repositorio del proyecto
En lugar de crear esta estructura a mano, recomiendo usar un complemento Maven para instalar sus jarras como artefactos. Entonces, para instalar un artefacto en un repositorio dentro del proyecto en la repo
carpeta, ejecute:
mvn install:install-file -DlocalRepositoryPath=repo -DcreateChecksum=true -Dpackaging=jar -Dfile=[your-jar] -DgroupId=[...] -DartifactId=[...] -Dversion=[...]
Si elige este enfoque, podrá simplificar la declaración del repositorio pom
para:
<repository>
<id>repo</id>
<url>file://${project.basedir}/repo</url>
</repository>
Un guión de ayuda
Dado que ejecutar el comando de instalación para cada lib es un poco molesto y definitivamente propenso a errores, he creado un script de utilidad que instala automáticamente todos los lib
archivos jar de una carpeta a un repositorio de proyectos, mientras resuelve automáticamente todos los metadatos (groupId, artifactId y etc.) de nombres de archivos. El script también imprime las dependencias xml para que las copie y pegue en su pom
.
Incluya las dependencias en su paquete de destino
Cuando haya creado su repositorio en el proyecto, habrá resuelto el problema de distribuir las dependencias del proyecto con su fuente, pero desde entonces el artefacto objetivo de su proyecto dependerá de los frascos no publicados, así que cuando instale en un repositorio tendrá dependencias irresolubles.
Para superar este problema, sugiero incluir estas dependencias en su paquete de destino. Esto puede hacerlo con el complemento de ensamblaje o mejor con el complemento de OneJar . La documentación oficial sobre OneJar es fácil de entender.