mvn spring-boot:运行vs java -jar

Ars*_*jum 20 spring jsp maven spring-boot

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

我有一个带有jsp页面的spring boot应用程序/src/main/resources/META-INF/resources/WEB-INF/.如果我使用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并立即正常工作.

Pie*_* B. 11

简短回答:spring-boot:run是作为Maven构建的一部分运行的steroïdjava -jar命令,确保将所有必需参数传递给您的应用程序(例如资源).还将确保在运行应用程序之前通过执行生命周期目标来编译项目.spring-boot:runtest-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
Run Code Online (Sandbox Code Playgroud)

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

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

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

按照:

我在/ src/main/resources/META-INF/resources/WEB-INF /中有一个带有jsp页面的spring启动应用程序.如果我使用mvn spring-boot:运行这些页面就可以了.但如果我使用java -jar,应用程序找不到这些页面.

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

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

  • 我通过将包装类型更改为war并将所有jsps放在src/main/webapp/WEB-INF/views中来解决它.现在它可以通过命令java -jar target/myapp.war运行 (2认同)