mvn spring-boot:运行vs java -jar

时间:2017-11-13 07:01:34

标签: spring maven jsp spring-boot

我知道这可能听起来很愚蠢,但我无法理解mvn spring-boot:runjava -jar之间的区别(使用mvn install生成的.jar文件)

我在/src/main/resources/META-INF/resources/WEB-INF/中有一个带有jsp页面的spring boot应用程序。如果我使用mvn spring-boot:run,则会提供这些页面。但如果我使用java -jar应用程序找不到这些页面。

我正在处理的应用程序位于https://github.com/ArslanAnjum/angularSpringApi

更新: 它适用于spring boot 1.4.2.RELEASE,而我打算使用最新版本,即1.5.8.RELEASE。

更新: 好吧,我通过将jsps放在src / main / webapp / WEB-INF / views /并将包装类型更改为war然后使用java -jar target / myapp.war运行此war并解决了这个问题,现在它正常工作。

2 个答案:

答案 0 :(得分:9)

简短回答:spring-boot:run是作为Maven构建的一部分运行的java -jar命令 onsteroïd,确保将所有必需参数传递给您的应用(例如资源) 。 spring-boot:run还将确保在运行应用之前通过执行test-compile生命周期目标来编译项目。

答案很长:

运行java -jar时,将启动一个新的JVM实例,其中包含您传递给此JVM的所有参数。例如,使用Spring doc示例

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

您将使用给定参数启动全新的JVM。您需要确保在命令行中包含所需的所有内容,例如类路径元素,应用程序参数,JVM选项等。

当您运行mvn spring-boot:run时,您将启动Maven构建:

  • 运行test-compile生命周期目标,默认情况下,它将是Maven资源和编译器插件的resources:resourcescompiler:compileresources:testResourcescompiler:testCompile目标。
  • 使用一系列依赖于的参数启动您的应用程序 您在项目中定义的Spring Boot Maven插件配置(您的pom.xml,父项和设置,命令行等)。其中包括:
    • 许多类路径元素:您的target/classes文件夹,其中可能包含您的应用所需的资源和库,您的Maven依赖项等。
    • 是否要分叉您的JVM(无论是创建全新的JVM来运行您的应用程序还是重新使用Maven构建的JVM),请参阅插件的forkagent参数

按照:

  

我有一个带有jsp页面的spring boot应用程序   / SRC /主/资源/ META-INF /资源/ WEB-INF /。如果我使用mvn   spring-boot:运行这些页面。但是如果我使用java -jar这些   应用程序找不到页面。

这是因为mvn spring:boot命令会确保您的应用程序运行时,类路径中存在target/classes文件夹。编译后,此文件夹将包含target/classes/META-INF/resources/WEB-INF等内容。然后,您的应用可以找到META-INF/resources/WEB-INF并在被问到时加载它们。当您运行java -jar命令时,此文件夹可能不在类路径中,您的应用程序无法找到您的资源。 (这些资源是在src/main/resources目标期间从resources:resources文件夹中复制的)

要使用java -jar命令获得类似的结果,您必须在类路径中包含资源,例如javar -jar myapp.jar -cp $CLASSPATH;/path/to/my/project/target/classes/

答案 1 :(得分:0)

使用mvn package运行jar文件时,是否尝试使用mvn install而不是java -jar创建jar文件? package将根据您的POM文件创建jar / war,而install会将生成的jar文件安装到本地存储库以获取其他依赖项(如果存在)。