java - proexport - marcado de cajas para exportacion
spring-boot: excluir dependencias en el empaquetado (2)
Estoy trabajando en un proyecto de arranque de primavera (Proyecto A) que se incluiría en otros proyectos (Proyecto B, Proyecto C ...). Tengo varias dependencias en el Proyecto A, pero en el proyecto que importa el Proyecto A, algunas o solo una pueden ser necesarias. Estoy tratando de encontrar una forma de excluir las dependencias de jar al empaquetar el Proyecto A para que el Proyecto B proporcione las necesarias durante el tiempo de ejecución. Me gustaría tener las dependencias disponibles cuando el Proyecto A se ejecute de forma independiente con fines de prueba.
Ya probé lo siguiente
He intentado usar:
<scope>provided</scope>
<optional>true</optional>
Aún así, los frascos terminan en el artefacto final.
También intenté agregar lo siguiente al plugin spring-boot-maven-plugin
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<excludeArtifactIds>spring-boot-starter-redis</excludeArtifactIds>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
Esto simplemente eliminaría la dependencia de la bota de resorte, pero los frascos para los hijos de esta dependencia terminarían en el artefacto final.
En nuestro proyecto actual, tenemos el requisito de crear un archivo war para la aplicación, que debe implementarse en un servidor JEE. El archivo de guerra debe incluir solo los archivos jar necesarios, sin incluir ninguna API o implementación ya provista por el servidor JEE.
Sin embargo, queremos conservar la posibilidad de generar un archivo war o jar ejecutable proporcionado por Boot de forma predeterminada para fines de prueba.
Para lograrlo, hemos establecido todas las dependencias opcionales tal como se proporcionan . Por ejemplo, tenemos algunas dependencias directas utilizadas en el desarrollo, como el controlador JDBC, que no queremos incluir en el archivo war implementado. También hay algunos arrancadores principales de arranque que proporcionan dependencias con otros arrancadores y bibliotecas que no necesitamos en un servidor JEE. Este es el caso de los arrancadores spring-boot-starter-tomcat y spring-boot-starter-jdbc . En nuestro proyecto, tenemos las dependencias followind en nuestro archivo pom.xml :
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc7</artifactId>
<scope>provided</scope>
</dependency>
De esta forma, esas dependencias no se incluirán en el archivo jar / war original, pero el complemento maven de Spring Spring lo incluirá en la carpeta lib-provided del jar / war reempaquetado.
Esas dependencias no serán vistas por el servidor JEE, pero harán que la aplicación empaquetada sea más grande de lo necesario. La solución es indicarle al complemento maven de Spring Spring que cree el archivo reempaquetado con otro nombre, además de excluir las herramientas de desarrollo:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>${start-class}</mainClass>
<classifier>exec</classifier>
</configuration>
</plugin>
De esta forma, maven generará dos paquetes para su aplicación:
- El paquete jar / war predeterminado, sin todas las dependencias proporcionadas.
- Un archivo reempaquetado cuyo nombre finaliza con _exec.jar / .war, con todas las dependencias proporcionadas en la carpeta lib-provided y el soporte para ejecutar la aplicación con el archivo java -jar
En su caso, podría utilizar la misma técnica para poder generar el paquete para que el Proyecto A se incluya en el Proyecto B, y el paquete para que el Proyecto A se ejecute como independiente.
Si no necesita crear el paquete para que el Proyecto A se ejecute solo, y solo lo pruebe en su IDE, incluso puede eliminar el complemento Spring Maven de su pom.xml .
dentro del proyecto B pom.xml puedes hacer lo siguiente:
<dependencies>
....
<dependency>
<groupId>com.example</groupId>
<artifactId>projectA</artifactId>
<exclusions>
<exclusion>
<groupId>com.foo.bar</groupId>
<artifactId>baz</artifactId>
</exclusion>
....
</exclusions>
</dependency>
.....
</dependencies>