programa - distribuir aplicacion java
¿Cómo implementar archivos JAR en el subdirectorio webapp existente? (2)
Esto parece un caso de uso estándar para maven-war-plugin y recursos adicionales, a menos que me falta algo. Por ejemplo, aquí (ver la sección Configuración de recursos web) le dice que puede incluir recursos adicionales en su compilación de guerra (y esto es lo que sus dos jarras son para mí: recursos adicionales)
Si esto no funciona para usted, entonces maven-assembly-plugin le permite especificar un formato mucho más flexible.
Digamos que tengo una aplicación web muy común implementada a través de mywebapp.war
, generada por Maven
:
webapps
|
|--mywebapp.war
|--mywebapp
|
|--images
|--js
|--jsp
|--jardeploy
|--META-INF
|--styles
|--WEB-INF
Ahora me gustaría implementar myjarfile1.jar
y myjarfile2.jar
(o más) en webapps/mywebapp/jardeploy
. Son artefactos de otro proyecto Maven, no el que hace la guerra. Tampoco son jar que utiliza mywebapp, que estarían en WEB-INF/lib
, sino más bien tarros descargables construidos por separado y que no forman parte del código fuente mywebapp.
¿Hay alguna manera de empaquetar un archivo que agrupe los dos o más archivos jar en Maven que, cuando se webapps
en webapps
, se implemente no de forma predeterminada en webapps/jardeploy
sino en webapps/mywebapp/jardeploy
? Sería lo mismo que si tomara los frascos y los copiara en ese directorio, pero me gustaría seguir el protocolo estándar de implementación del servidor de aplicaciones descartando un artefacto generado en webapps en lugar del antiguo enfoque hacky. De hecho, quiero un artefacto formal (al igual que la guerra) en lugar de un add-on de publicación posterior. ¿Hay alguna manera de decir (quizás en el manifiesto) que necesita descomprimir el contenedor y ponerlo en ese directorio, si ese directorio existe?
El contenedor no debería importar, pero es Tomcat 7.
Puede crear una aplicación web con un WebListener que copie los archivos jar en el directorio mywebapp / jardeploy . Entonces, cuando esta aplicación se despliegue en su contenedor, copiará los frascos al lugar que desee.
¡Probé y funciona! Supongamos que ha creado esta nueva aplicación web y ha puesto los archivos jar en el directorio src / main / webapps / jars , al WebListener le gusta esto:
@WebListener
public class Deployer implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
String realPath = sce.getServletContext().getRealPath("/jars");
try {
Files.copy(new File(realPath + "/myjarfile1.jar").toPath(),
new File(System.getProperty("catalina.base")+"/webapps/mywebapp/jardeploy/myjarfile1.jar").toPath());
} catch (IOException e) {
e.printStackTrace();
}
}
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("On shutdown web app");
}
}
Este código es solo una prueba de concepto y se puede mejorar, pero sirve para su propósito. Solo copia un archivo jar (myjarfile1.jar) en / webapps / mywebapp / jardeploy . PD: Creé esta nueva aplicación web usando arquetipos maven.