web-dev-qa-db-fra.com

mvn spring-boot: exécuter vs Java -jar

Je sais que cela peut sembler une question stupide, mais je n'arrive pas à comprendre la différence entre mvn spring-boot:run et Java -jar (fichier .jar généré avec l'installation de mvn)

J'ai une application Spring Boot avec des pages jsp dans /src/main/resources/META-INF/resources/WEB-INF/. Si j'utilise mvn spring-boot:run ces pages sont diffusées. Mais si j'utilise Java -jar ces pages ne sont pas trouvées par application.

L'application sur laquelle je travaille est à https://github.com/ArslanAnjum/angularSpringApi

MISE À JOUR: Cela fonctionne avec Spring Boot 1.4.2.RELEASE alors que j'ai l'intention d'utiliser la dernière version, c'est-à-dire 1.5.8.RELEASE.

MISE À JOUR: Eh bien, j'ai résolu le problème en mettant jsps dans src/main/webapp/WEB-INF/views/et en changeant le type d'emballage en war, puis en exécutant cette guerre en utilisant Java -jar target/myapp .war et son bon fonctionnement maintenant.

16
ArslanAnjum

Réponse courte: spring-boot:run Est une commande Java -jarsur steroïd exécutée dans le cadre de votre build Maven, garantissant que tous les paramètres requis sont transmis à votre application (comme les ressources). spring-boot:run S'assurera également que votre projet est compilé en exécutant les objectifs de cycle de vie de test-compile Avant d'exécuter votre application.

Longue réponse:

Lorsque vous exécutez Java -jar, Vous lancez une nouvelle instance JVM avec tous les paramètres que vous avez transmis à cette JVM. Par exemple, en utilisant l'exemple Spring doc

Java -Xdebug -Xrunjdwp:server=y, \
    transport=dt_socket, address=8000, suspend=
    -jar target/myproject-0.0.1-SNAPSHOT.jar

Vous allez lancer une toute nouvelle JVM avec les paramètres donnés. Vous devez vous assurer d'inclure tout ce dont vous avez besoin, comme les éléments de chemin de classe, les paramètres d'application, les options JVM, etc. sur la ligne de commande.

Lorsque vous exécutez mvn spring-boot:run, Vous lancez une build Maven qui:

  • Exécutez les objectifs de cycle de vie test-compile, Par défaut, ce seront les objectifs resources:resources, compiler:compile, resources:testResources, compiler:testCompile Des ressources et du compilateur Maven brancher.
  • Lancez votre application avec un tas de paramètres qui dépendront de la configuration du plugin Spring Boot Maven que vous avez définie dans votre projet (votre pom.xml, parents et paramètres, ligne de commande, etc.). Cela comprend entre autres:
    • Beaucoup d'éléments classpath: votre dossier target/classes Qui peut contenir des ressources et des bibliothèques requises par votre application, vos dépendances Maven, etc.
    • Que ce soit pour bifurquer votre JVM ou non (que ce soit pour créer une toute nouvelle JVM pour exécuter votre application ou réutiliser la JVM de la build Maven), voir les paramètres fork et agent du plugin

Selon:

J'ai une application Spring Boot avec des pages jsp dans/src/main/resources/META-INF/resources/WEB-INF /. Si j'utilise mvn spring-boot: exécutez ces pages sont servies. Mais si j'utilise Java -jar ces pages ne sont pas trouvées par application.

C'est parce que la commande mvn spring:boot S'assurera que votre dossier target/classes Est présent dans le chemin de classe lorsque votre application est en cours d'exécution. Après la compilation, ce dossier contiendra entre autres target/classes/META-INF/resources/WEB-INF. Votre application pourra alors trouver META-INF/resources/WEB-INF Et les charger à la demande. Lorsque vous avez exécuté la commande Java -jar, Ce dossier n'était probablement pas sur le chemin de classe, votre application n'a alors pas pu trouver vos ressources. (ces ressources ont été copiées à partir du dossier src/main/resources pendant l'objectif resources:resources)

Pour obtenir un résultat similaire avec votre commande Java -jar, Vous devez inclure vos ressources sur le chemin de classe telles que javar -jar myapp.jar -cp $CLASSPATH;/path/to/my/project/target/classes/

11
Pierre B.

Avez-vous essayé de créer un fichier jar à l'aide de mvn package au lieu de mvn install lorsque vous exécutez un fichier jar à l'aide de Java -jar? package créera un fichier jar/war selon votre fichier POM tandis que install installera le fichier jar généré dans le référentiel local pour d'autres dépendances si elles sont présentes.

0
amdg