¿Cómo desplegar una aplicación Java utilizando el terminal?
Desplegar una aplicación Java en un entorno de producción puede parecer una tarea intimidante al principio. Sin embargo, con las instrucciones correctas, puede ser un proceso sencillo y directo. Aquí te mostraré cómo hacerlo utilizando una aplicación autocontenida y el terminal de tu computadora.
¿Qué comandos debo utilizar para desplegar mi aplicación?
Para desplegar tu aplicación desde el terminal, seguimos los siguientes pasos:
Generar el artefacto final:
Usamos el comando BootJard para empaquetar la aplicación.
Accedemos al IDE, vamos al apartado de Gradle y buscamos la tarea BootJard dentro del folder build.
Cambiar la versión de nuestra aplicación:
Editamos el archivo build.gradle para modificar la versión a 1.0 en vez de 0.0.1.
Decidir los parámetros de despliegue:
Ajustar la memoria asignada usando -Xmx2048m.
Cambiar el puerto utilizando -Dserver.port.
Ejecutar el comando desde la terminal:
Nos ubicamos dentro de la carpeta del proyecto.
Ejecutamos el siguiente comando reemplazando nombre y ubicación por los valores correctos:
java -jar ubicacion/nombre.jar
¿Cómo resolver conflictos comunes durante el despliegue?
Durante el proceso de despliegue, podrían surgir inconvenientes. A continuación, te muestro cómo abordar algunos problemas comunes:
Puerto en uso: Si el puerto está ocupado, debemos detener cualquier servicio que lo esté utilizando (en Intellij IDEA, debemos parar el servicio en ejecución).
Seleccione el perfil activo adecuado:
Si necesitas cambiar el perfil activo a producción, cancela el proceso actual y vuelve a ejecutar el comando java -jar, pero adicionando:
-Dspring.profiles.active=prod
¿Cuál es la importancia de seleccionar el perfil correcto?
Los perfiles de aplicación son vitales para modificar la configuración dependiendo del entorno (desarrollo, prueba o producción). Al utilizar -Dspring.profiles.active=prod, instruimos a nuestra aplicación para que utilice las configuraciones definidas para producción en application-prod.properties.
¿Qué requerimientos técnicos se deben cumplir?
Versión de Java Compatible:
Asegúrate de desplegar tu archivo JAR en un entorno que use la misma versión de Java que empleaste durante su desarrollo.
Estos pasos detallados desmitifican el proceso de despliegue en Java, permitiendo que lleves tu aplicación al siguiente nivel. Recuerda siempre probar en ambientes locales antes de escalar a producción, y sigue explorando para dominar más técnicas avanzadas. ¡Continúa aprendiendo y llevando tus habilidades al siguiente paso!
Si alguien utiliza el power Shell de windows y recibe el error:
Error: Unable to access jarfile .profiles.active=pdn
debe colocar -Dspring.profiles.active=pdn entre comillas, así
"-Dspring.profiles.active=pdn".
Me hiciste el día, muchísimas gracias.
Héroe
Para los que realizaron su proyecto con maven estos comandos les puede servir
**Modo desarrollo **
Ubicarse en la caperta raiz del proyecto y ejecutar el sigunete comando mvn clean package -DskipTests (Crear el artefacto)
Después ubicarse a nivel de la carpeta target en donde se encuenta el .jar y ejecutar java -jar platzi-market-1.0.jar
Modo producción
deben volver a la carpeta raiz del proyecto y ejecutar el comando mvn clean package -DskipTests
ubicarse nuevamente en la carpeta taget y ejecutar el comando java -jar -Dspring.profiles.active=pdn plazi-market-1.0.jar
no olviden cambiar el puerto de produción 80 o el puerto que hayan puesto (Postman)
Nota: si no tienen instalado Maven en su ordenador pueden utilizar el maven embebido que viene con el proyecto y remplazar mvn por mvnw en los comandos antes mencionados
Gracias!!
hola bro, no se si sigas en platzi, pero no puedo desplegar mi API si ves este mensaje para que me ayudes
Profesor muchas gracias en serio que es uno de los mejores cursos que he realizado
Me parece que falta el como hacerlo para generar un war y no un jar
Es muy sencillo. Lo primero es agregar el plugin de war en el archivo build.gradle así:
plugins {... id 'war'}
Después, en la sección dependencies de este mismo archivo debes deshabilitar el servidor embebido que funciona para la aplicación autocontenida con:
Por último, debes modificar la clase PlatziMarketApplication para extienda de SpringBootServletInitializer y debes sobrescribir el método configure. Al final quedaría así:
Listo! Ya lo único que debes hacer es buscar el task war en el área build de Gradle de IntelliJ (Cómo el bootRun) o mediante el comando gradle war.
Después de configurar el war, dónde encuentro o cómo genero las carpetas META.INF y WEB.INF ???
Por si alguien tiene el mismo problema:
Cuando quería usar el perfil spring.profiles.active=pdn no me funcionaba.
En mi caso lo solucioné cambiando el puerto en application-pdn.properties. Antes usaba el puerto 80. Cambiandolo a valores parecidos a 8090 (8070 por ejemplo) se arregló.
Despues de modificar el puerto, hay que volver a ejecutar bootJar.
Antes de desplegar la app en como pdn me corria bien, ahora me sale el siguiente error:
APPLICATION FAILED TO START
Description:
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
Reason: Failed to determine a suitable driver class
Action:
Consider the following:
If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
If you have database settings to be loaded from a particular profile you may need to activate it (the profiles pdn are currently active).
aiuuuda
Creo que esto pasa porque la conexion a la BD no es correcta
revisa tus credenciales en application-dev.properties o application-prod.properties
eso pasa cuando no le especificas un perfil, toma el properties general y hay no hay configuración de base de datos. Revisa que estés enviando el perfil correcto
Si tienen problemas prueben ejecutar de nuevo el bootJar, yo al ingresar el comando para cambiar a pdn me daba muchos errores, fue porque le hice unos cambios en el código y no se reflejaban en el jar
vamos a usar el java - jar de java, con el parametro .jar ... javamos a javanarlo xD
Desde el 18/01/2024 a las 16h45 escribo como lo pude solucionar en mi proyecto usando un proyecto spring boot con la version 3.2.1 gradle y openJDK Jar 17.
Despues de aplicar la configuracion del video, verifiquen muy bien el nombre del archivo bootJar generado en su carpeta build/libs pues podria tener un nombre diferente, por ejemplo, mi proyecto de platzi se llama online-shop, pero cuando genero la Task build bootJar, no se llama online-shop-1.0.jar sino platzi-1.0.jar, asi que al intentar acceder a el, obtenia el error: "Unable to access to JarFile...etc"; asi que parte de la solucion esta en conocer el nombre preciso del archivo Jar que genera su proyecto.
Lo segundo es que, luego de lo anterior, pueden ejecutar el comando ./gradlew clean, asi limpian el proyecto del archivo .jar que este generando conflictos en su configuracion, y entonces pueden volver a ejecutar la Task build bootJar, les generara una nueva carpeta build con su archivo .jar y la respectiva configuracion, y ya pueden ejecutar en terminal el comando java -jar build/libs/nombre-del-archivo.jar para el perfil dev, y el comando java -jar "-Dspring.profiles.active=pdn" build/libs/nombre-del-archivo.jar para el perfil produccion.
Recuerden verificar sus puertos tanto en dev como en pdn, para que no les truene la ejecucion
Si en la terminal recibes el error: Error: Unable to access jarfile .profiles.active=pdn
debes colocar -Dspring.profiles.active=pdn entre comillas, así:
"-Dspring.profiles.active=pdn".
cuando intento ejecutar el comando de java me sale el siguiente error
D:\platzi-market>java -jar /build/libs/platzi-market-1.0.jar
Error: Unable to access jarfile /build/libs/platzi-market-1.0.jar
Puede ser por que faltan permisos de admin, verifica que el cmd/terminal donde lo ejecutes los tenga.
En Windows, antes de abrir el cmd, click derecho "Ejecutar como administrador" y ya tienes los permisos.
mismo problema diría que no es por los permisos
Por favor revisen los resúmenes autogenerados!!!
BootJard -> BootJar
Hola Buenas Tardes! cuando estoy generando el jar me indica lo siguiente la terminal: Unable to access jarfile . como hago para acceder al jar, ya le di permisos pero nada no se da soluicon
Al compilar el pdn no me permitió correrlo en el puerto 80, me salió lo siguiente:
Caused by: org.springframework.boot.web.server.WebServerException:Unable to start embedded Tomcat server
Lo cambié de puerto y normal si se pudo compilar, pero queria saber porque ocurre esto?
Estoy programando en un entorno Linux, Kubuntu para ser exactos, le agradeceria su ayuda.
¿Será que ya tienes el puerto 80 ocupado con otro proceso?
La línea que muestras solo es la causa, compártenos toda la traza del error para ver que puede estar pasando.
Busqué si el puerto estaba ocupado, pero no era el caso, ahí muestro la traza del error:
01:23:50: Executing task 'PlatziMarketApplication.main()'...
2020-10-23 01:23:54.390 INFO 28508 --- [ main] c.platzi.market.PlatziMarketApplication : Starting PlatziMarketApplication on asus with PID 28508 (/media/yanpieer/Programas/Cursos/Java/Spring/platzi-market/build/classes/java/main started by yanpieer in /media/yanpieer/Programas/Cursos/Java/Spring/platzi-market)
2020-10-23 01:23:54.395 INFO 28508 --- [ main] c.platzi.market.PlatziMarketApplication : The following profiles are active: pdn
2020-10-23 01:23:56.026 INFO 28508 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFERRED mode.
2020-10-23 01:23:56.202 INFO 28508 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 163ms. Found 2 JPA repository interfaces.
2020-10-23 01:23:57.267 INFO 28508 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 80 (http)
2020-10-23 01:23:57.287 INFO 28508 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2020-10-23 01:23:57.287 INFO 28508 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.38]
2020-10-23 01:23:57.432 INFO 28508 --- [ main] o.a.c.c.C.[.[.[/platzi-market/api] : Initializing Spring embedded WebApplicationContext
2020-10-23 01:23:57.432 INFO 28508 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2944 ms
2020-10-23 01:23:57.752 INFO 28508 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2020-10-23 01:23:57.772 INFO 28508 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2020-10-23 01:23:58.103 INFO 28508 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2020-10-23 01:23:58.314 INFO 28508 --- [ task-1] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default]
2020-10-23 01:23:58.561 INFO 28508 --- [ task-1] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.21.Final
2020-10-23 01:23:58.574 WARN 28508 --- [ main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2020-10-23 01:23:58.932 INFO 28508 --- [ task-1] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.0.Final}
2020-10-23 01:23:59.308 INFO 28508 --- [ main] pertySourcedRequestMappingHandlerMapping : Mapped URL path [/v2/api-docs] onto method [springfox.documentation.swagger2.web.Swagger2Controller#getDocumentation(String, HttpServletRequest)]
2020-10-23 01:23:59.309 INFO 28508 --- [ task-1] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.PostgreSQL10Dialect
2020-10-23 01:23:59.779 INFO 28508 --- [ main] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@68f776ee, org.springframework.security.web.context.SecurityContextPersistenceFilter@3348c987, org.springframework.security.web.header.HeaderWriterFilter@5a8dcfbb, org.springframework.security.web.authentication.logout.LogoutFilter@1d7f2f0a, com.platzi.market.web.security.filter.JwtFilterRequest@3c952a33, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@31ab4859, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@722b2728, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@5a6195b8, org.springframework.security.web.session.SessionManagementFilter@7540160e, org.springframework.security.web.access.ExceptionTranslationFilter@1201e064, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@347123dc]
2020-10-23 01:24:00.061 WARN 28508 --- [ task-1] org.hibernate.mapping.RootClass : HHH000038: Composite-id class does not override equals(): com.platzi.market.persistence.entity.ComprasProductoPK
2020-10-23 01:24:00.062 WARN 28508 --- [ task-1] org.hibernate.mapping.RootClass : HHH000039: Composite-id class does not override hashCode(): com.platzi.market.persistence.entity.ComprasProductoPK
2020-10-23 01:24:00.282 WARN 28508 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Failed to start bean 'webServerStartStop'; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat server
2020-10-23 01:24:00.294 INFO 28508 --- [ main] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2020-10-23 01:24:01.201 INFO 28508 --- [ task-1] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2020-10-23 01:24:01.219 INFO 28508 --- [ task-1] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2020-10-23 01:24:01.223 INFO 28508 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'
2020-10-23 01:24:01.224 INFO 28508 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
2020-10-23 01:24:01.250 INFO 28508 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
2020-10-23 01:24:01.252 INFO 28508 --- [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat]
2020-10-23 01:24:01.269 INFO 28508 --- [ main] ConditionEvaluationReportLoggingListener :
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2020-10-23 01:24:01.281 ERROR 28508 --- [ main] o.s.boot.SpringApplication : Application run failed
org.springframework.context.ApplicationContextException: Failed to start bean 'webServerStartStop'; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat server
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:185) ~[spring-context-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:53) ~[spring-context-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:360) ~[spring-context-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:158) ~[spring-context-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:122) ~[spring-context-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:895) ~[spring-context-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:554) ~[spring-context-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143) ~[spring-boot-2.3.4.RELEASE.jar:2.3.4.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758) ~[spring-boot-2.3.4.RELEASE.jar:2.3.4.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750) ~[spring-boot-2.3.4.RELEASE.jar:2.3.4.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.3.4.RELEASE.jar:2.3.4.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.3.4.RELEASE.jar:2.3.4.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237) ~[spring-boot-2.3.4.RELEASE.jar:2.3.4.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[spring-boot-2.3.4.RELEASE.jar:2.3.4.RELEASE]
at com.platzi.market.PlatziMarketApplication.main(PlatziMarketApplication.java:11) ~[main/:na]
Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat server
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:229) ~[spring-boot-2.3.4.RELEASE.jar:2.3.4.RELEASE]
at org.springframework.boot.web.servlet.context.WebServerStartStopLifecycle.start(WebServerStartStopLifecycle.java:43) ~[spring-boot-2.3.4.RELEASE.jar:2.3.4.RELEASE]
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:182) ~[spring-context-5.2.9.RELEASE.jar:5.2.9.RELEASE]
... 14 common frames omitted
Caused by: java.lang.IllegalArgumentException: standardService.connector.startFailed
at org.apache.catalina.core.StandardService.addConnector(StandardService.java:231) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.addPreviouslyRemovedConnectors(TomcatWebServer.java:282) ~[spring-boot-2.3.4.RELEASE.jar:2.3.4.RELEASE]
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:213) ~[spring-boot-2.3.4.RELEASE.jar:2.3.4.RELEASE]
... 16 common frames omitted
Caused by: org.apache.catalina.LifecycleException: Protocol handler start failed
at org.apache.catalina.connector.Connector.startInternal(Connector.java:1067) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
at org.apache.catalina.core.StandardService.addConnector(StandardService.java:227) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
... 18 common frames omitted
Caused by: java.net.SocketException: Permiso denegado
at java.base/sun.nio.ch.Net.bind0(Native Method) ~[na:na]
at java.base/sun.nio.ch.Net.bind(Net.java:455) ~[na:na]
at java.base/sun.nio.ch.Net.bind(Net.java:447) ~[na:na]
at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:227) ~[na:na]
at java.base/sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:80) ~[na:na]
at org.apache.tomcat.util.net.NioEndpoint.initServerSocket(NioEndpoint.java:228) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:211) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1141) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:1227) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:592) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
at org.apache.catalina.connector.Connector.startInternal(Connector.java:1064) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
... 20 common frames omitted
What went wrong:
Execution failed for task ':PlatziMarketApplication.main()'.
Process 'command '/usr/lib/jvm/java-1.11.0-openjdk-amd64/bin/java'' finished with non-zero exit value 1
Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
luego correr este comando: mvn package spring-boot:repackage
Si modifican algo en el editor de Codigo , deben correr de bueno el bootJar para que se apliquen los cambios.
No me dejo desplegar mi aplicación :c creo que mi JRE esta desactualizado, me sale la siguiente excepcion:
Exceptionin thread "main" java.lang.UnsupportedClassVersionError: com/platzi/market/MarketApplication has been compiled by a more recent version of the JavaRuntime(classfile version 55.0),this version of the JavaRuntime only recognizes classfile versions up to 52.0
Sin embargo tengo el JDK 11.0.3, alguien sabe como podría actualizar el JRE ? :c
Si ejecutas java -version desde la consola que se ve? El error te indica que compilaste el código con una versión más nueva que con la que estás tratando de correrlo.
Esto puede ser porque en IntelliJ estés trabajando con la version 11 del JDK y en el JAVA_HOME tengas una versión anterior.
También presento el mismo inconveniente, he cambiado el JAVA_HOME = C:\Program Files\AdoptOpenJDK\jdk-11.0.7.10-hotspot.
Aun así no despliega, alguien tiene idea como o que debo hacer.
Recuerden terminar el proceso en el IDE si van a usar el mismo puerto.
alguno le a pasado que no entra en el login
Me pueden ayudar para terminar y desplegarla por favor
Prueba cambiando la version que tienes de java o agregando en caso que no tengas el jre, no encuentra el path de java