我在src / main / resources / template下构建了一个带有单个home.html文件的spring-boot webapp,当我从spring控制器返回“home”时,它运行得很好。我把它打包成一场战争,它使用spring-boot的嵌入式tomcat服务器运行得非常好。如果我使用mvn spring-boot:run
运行它,那就是。
但是后来如果我用java -jar myjar.war
启动我的应用程序,它声称服务器已经启动并且一切正常,但是当我尝试在localhost:8080上访问它时,它失败了:
Error resolving template "home", template might not exist or might not be accessible by any of the configured Template Resolvers
那么我接下来要做什么呢?
顺便说一句,这是我的pom.xml:
<groupId>com.ciber</groupId>
<artifactId>energyworx-conversion-tool</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.3.RELEASE</version>
</parent>
<properties>
<java.version>1.7</java.version>
<start-class>com.ciber.ewct.WebApp</start-class>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<!-- <jvmArguments>-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000</jvmArguments> -->
</configuration>
</plugin>
</plugins>
</build>
启用调试日志记录级别后,我会看到有关百万美元配置的信息,这与我使用mvn spring-boot:run
和java -jar
运行时相同:
[THYMELEAF] * Cache Factory implementation: org.thymeleaf.cache.StandardCacheManager
[THYMELEAF] * Template modes:
[THYMELEAF] * LEGACYHTML5
[THYMELEAF] * XHTML
[THYMELEAF] * HTML5
[THYMELEAF] * VALIDXML
[THYMELEAF] * VALIDXHTML
[THYMELEAF] * XML
[THYMELEAF] * Template resolvers (in order):
[THYMELEAF] * org.thymeleaf.templateresolver.TemplateResolver
[THYMELEAF] * Message resolvers (in order):
[THYMELEAF] * org.thymeleaf.spring4.messageresolver.SpringMessageResolver
[THYMELEAF] * Dialect [1 of 2]: org.thymeleaf.spring4.dialect.SpringStandardDialect
[THYMELEAF] * Prefix: "th"
[THYMELEAF] * Dialect [2 of 2]: nz.net.ultraq.thymeleaf.LayoutDialect
[THYMELEAF] * Prefix: "layout"
[THYMELEAF] TEMPLATE ENGINE CONFIGURED OK
答案 0 :(得分:1)
我很伤心地说,你实际上是做错了。
您已将构建配置为从包中排除Web应用服务器。
<packaking>war</packaging>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
通过此设置,您可以在现有Servlet容器中部署战争。您将无法使用java -jar
命令启动应用程序。
如果您想使用java命令行运行webapp。将您的包装更换为jar
,然后从您的pom中删除provided
说明。
<packaking>jar</packaging>
...
<!--
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
-->
然后你的jar里面会有一个嵌入式tomcat,命令java -jar myjar.jar
将正确。
编辑:最后,我会提高Spring Web包的日志级别,以查看模板解析器如何尝试查找模板。
此致 丹尼尔
答案 1 :(得分:0)
我似乎已经通过@ DanielLavoie的帮助修复了它,恢复了我为使应用程序成为可部署的战争所做的所有更改。
那些是:
<packaking>war</packaging>
,以便生成jar; <scope>provided</scope>
; extends SpringBootServletInitializer
课程中移除Application
; 我不喜欢这个解决方案,因为根据我所遵循的the documentation,你可以使战争可以部署,也可以独立启用。但它现在必须做。