maven-2 - org - maven-jar-plugin
Conjunto Maven 2 con dependencias: jar bajo el alcance "sistema" no incluido (7)
Editado: Perdón por no haberme dado cuenta que ALX también mencionó la solución limpia del ciclo de vida.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<executions>
<execution>
<id>hack-binary</id>
<phase>clean</phase>
<configuration>
<file>${basedir}/lib/your-lib.jar</file>
<repositoryLayout>default</repositoryLayout>
<groupId>your-group</groupId>
<artifactId>your-artifact</artifactId>
<version>0.1</version>
<packaging>jar</packaging>
<generatePom>true</generatePom>
</configuration>
<goals>
<goal>install-file</goal>
</goals>
</execution>
</executions>
</plugin>
Con base en la solución provista por alx, puede ejecutar el paso del archivo de instalación en la fase limpia. pero dado que la fase de limpieza no está en el ciclo de vida predeterminado, debe ejecutar mvn clean
la primera vez para asegurarse de que el jar esté listo en el repositorio local.
ex: mvn clean; paquete mvn
Estoy usando el complemento maven-assembly para crear un archivo jar de mi aplicación, incluidas sus dependencias de la siguiente manera:
<assembly>
<id>macosx</id>
<formats>
<format>tar.gz</format>
<format>dir</format>
</formats>
<dependencySets>
<dependencySet>
<includes>
<include>*:jar</include>
</includes>
<outputDirectory>lib</outputDirectory>
</dependencySet>
</dependencySets>
</assembly>
(He omitido algunas otras cosas que no están relacionadas con la pregunta)
Hasta ahora, esto ha funcionado bien porque crea un directorio lib
con todas las dependencias. Sin embargo, recientemente agregué una nueva dependencia cuyo ámbito es system
, y no lo copia al directorio de salida lib
. Debo estar perdiendo algo básico aquí, así que pido ayuda.
La dependencia que acabo de agregar es:
<dependency>
<groupId>sourceforge.jchart2d</groupId>
<artifactId>jchart2d</artifactId>
<version>3.1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/external/jchart2d-3.1.0.jar</systemPath>
</dependency>
La única forma en que pude incluir esta dependencia fue agregando lo siguiente al elemento de ensamblaje:
<files>
<file>
<source>external/jchart2d-3.1.0.jar</source>
<outputDirectory>lib</outputDirectory>
</file>
</files>
Sin embargo, esto me obliga a cambiar el pom y el archivo de ensamblaje cada vez que se cambia el nombre de este jar, si es que lo hace alguna vez. Además, parece simplemente incorrecto.
He intentado con <scope>runtime</scope>
en los conjuntos de dependencySets
y <include>sourceforge.jchart2d:jchart2d</include>
sin suerte.
Entonces, ¿cómo incluir un jar de ámbito de system
en su archivo de ensamblaje en maven 2?
Muchas gracias
Encuentro una solución fácil en caso de que cree el tarro
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<webResources>
<resource>
<directory>dependencies/mydep</directory>
<targetPath>WEB-INF/lib</targetPath>
<filtering>true</filtering>
<includes>
<include>**/*.jar</include>
</includes>
</resource>
</webResources>
</configuration>
</plugin>
Ha funcionado de una manera más fácil en mi solución:
eliminar de su dependencia:
<dependency>
<groupId>tiago.medici</groupId>
<artifactId>eureka</artifactId>
<version>0.0.1</version>
</dependency>
A continuación, agregue el maven-install-plugin en el pom.xml también.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<executions>
<execution>
<id>install-external</id>
<phase>clean</phase>
<configuration>
<file>${basedir}/external/tiago.medici-0.0.1.jar</file>
<repositoryLayout>default</repositoryLayout>
<groupId>tiago.medici</groupId>
<artifactId>eureka</artifactId>
<version>0.0.1</version>
<packaging>jar</packaging>
<generatePom>true</generatePom>
</configuration>
<goals>
<goal>install-file</goal>
</goals>
</execution>
</executions>
</plugin>
No me sorprende que las dependencias del alcance del sistema no se agreguen (después de todo, las dependencias con un alcance del sistema deben proporcionarse explícitamente por definición). En realidad, si realmente no desea poner esa dependencia en su repositorio local (por ejemplo, porque desea distribuirlo como parte de su proyecto), esto es lo que haría:
- Colocaría la dependencia en un "repositorio de sistema de archivos" local al proyecto.
Declararía ese repositorio en mi
pom.xml
así:<repositories> <repository> <id>my</id> <url>file://${basedir}/my-repo</url> </repository> </repositories>
Simplemente declararía el artefacto sin el alcance del
system
, esta es solo una fuente de problemas:<dependency> <groupId>sourceforge.jchart2d</groupId> <artifactId>jchart2d</artifactId> <version>3.1.0</version> </dependency>
No estoy 100% seguro de que esto se adapte a sus necesidades, pero creo que es una mejor solución que usar el alcance del sistema.
Actualización: debería haber mencionado eso en mi respuesta original y lo estoy arreglando ahora. Para instalar una biblioteca de terceros en el repositorio basado en archivos, use install:install-file
con el parámetro localRepositoryPath
:
mvn install:install-file -Dfile=<path-to-file> /
-DgroupId=<myGroup> /
-DartifactId=<myArtifactId> /
-Dversion=<myVersion> /
-Dpackaging=<myPackaging> /
-DlocalRepositoryPath=<path-to-my-repo>
Puede pegar esto como está en un shell * nix. En Windows, quite la " /
" y coloque todo en una sola línea.
Por cierto, puedes automatizarlo y hacerlo parte de tu construcción de maven. Lo siguiente instalará su jar en su repositorio local antes de la compilación:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<executions>
<execution>
<id>hack-binary</id>
<phase>validate</phase>
<configuration>
<file>${basedir}/lib/your-lib.jar</file>
<repositoryLayout>default</repositoryLayout>
<groupId>your-group</groupId>
<artifactId>your-artifact</artifactId>
<version>0.1</version>
<packaging>jar</packaging>
<generatePom>true</generatePom>
</configuration>
<goals>
<goal>install-file</goal>
</goals>
</execution>
</executions>
</plugin>
También puede manejar esto agregando un conjunto de dependencias suplementarias en sus conjuntos de dependencias.
<dependencySet>
<scope>system</scope>
<includes>
<include>*:jar</include>
</includes>
<outputDirectory>lib</outputDirectory>
</dependencySet>
Lo mejor sería usar un administrador de repositorio (como Nexus, Artifactory, Archiva) e instalar este tipo de dependencia en un repositorio particular. Después de eso puedes usar cosas como una dependencia simple. Esto simplificará tu vida.
Documentos: https://maven.apache.org/plugins/maven-assembly-plugin/assembly.html
Una solución simple para esto es agregarlo al repositorio maven local
Una forma de hacerlo es a través de mvn install commands como se sugiere en la publicación anterior.
Otra manera fácil es: 1) En su eclipse, haga clic con el botón derecho del mouse en la opción de proyecto seleccionar Maven. 2) Seleccione Instalar o desplegar un artefacto en una opción de repositorio maven y haga clic en siguiente. 3) Haga clic en Examinar al lado de la casilla de verificación del archivo Artefacto y seleccione su archivo jar 4) Ingrese el Id. De grupo y ArtifactId y la versión asegúrese de que generar pom y crear suma de comprobación esté marcado y el empaque esté
Haga clic en finalizar, Wallah !!! su trabajo está hecho, el archivo jar se agrega en su repositorio local, que puede definir en el directorio setting.xml o m2
Ahora solo agregue la dependencia de maven simple según la versión GroupId, ArtifactId & jar que ha ingresado según la importación y que será empaquetado por maven.