mvn spring引导:运行vs java-jar

mvn spring引导:运行vs java-jar,spring,maven,jsp,spring-boot,Spring,Maven,Jsp,Spring Boot,我知道这个问题听起来很傻,但我无法理解mvn spring boot:run和java-jar(.jar文件由mvn安装生成)之间的区别 我在/src/main/resources/META-INF/resources/WEB-INF/中有一个带有jsp页面的spring启动应用程序。如果我使用mvn-spring-boot:run这些页面将被提供。但如果我使用java-jar,应用程序将找不到这些页面 我正在处理的应用程序位于 更新: 它适用于spring boot 1.4.2.RELEASE

我知道这个问题听起来很傻,但我无法理解
mvn spring boot:run
java-jar
(.jar文件由mvn安装生成)之间的区别

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

我正在处理的应用程序位于

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

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

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

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

长答覆:

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

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构建,该构建将:

  • 运行
    测试编译
    生命周期目标,默认情况下,它将是Maven资源和编译器插件的
    资源:资源
    编译器:编译
    资源:测试资源
    编译器:测试编译
    目标
  • 使用一组参数启动应用程序,这些参数将取决于 您在项目中定义的SpringBootMaven插件配置(pom.xml、父项和设置、命令行等)。这其中包括:
    • 很多类路径元素:你的
      target/classes
      文件夹,其中可能包含应用程序所需的资源和库、Maven依赖项等
    • 是否分叉JVM(是创建全新JVM来运行应用程序还是重新使用Maven构建的JVM),请参阅插件的
      fork
      agent
      参数
根据:

我有一个spring启动应用程序,其中包含jsp页面 /src/main/resources/META-INF/resources/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
命令时,该文件夹可能不在类路径上,您的应用程序随后无法找到您的资源。(这些资源是在
resources:resources
goal期间从
src/main/resources
文件夹复制的)


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

您可以发布您的spring应用程序配置文件吗?我共享了github链接。您可以克隆repo。您是否从某个示例中获取了配置?我不认为JAR中的JSP(如此嵌入式容器)能与Tomcate一起工作freemarker的问题与JSP相同,而您的解决方案(打包为war)也能为我们工作,谢谢这不是答案。这取决于JAR的创建方式。页面提供了关于如何使用SpringBoot创建可执行jar或war归档文件的完整信息。我理解。但我无法使它发挥作用。可以指定$CLASSPATH之后要包含的内容吗?我尝试过/classes/resources/META-INF和META-INF/resources。如果从项目的根目录运行命令以包含目标文件夹,通常是
/target/classes
。但这只是一个例子:重要的是确保所有必需的依赖项和资源都在类路径上。如果所有东西都打包在您的JAR中,那么您就没事了。JAR中存在jsp。我尝试了SpringBoot 1.4.2,它正在工作。可能是当前版本的spring boot存在缺陷。(1.5.8)我通过将打包类型更改为war并将所有JSP放在src/main/webapp/WEB-INF/views中解决了这个问题。现在,它可以通过命令java-jar target/myapp.warThanks@ArslanAnjum运行——将包装从jar更改为war也适用于我们。否则,我们只能在开发机器上本地运行