记一次难产的spring boot之hello world!
2017-03-01 00:00
344 查看
开始一次spring boot之旅,结果发现2分钟的demo硬是花半天时间才出来hello world!记录下中间的过程。
学习文档:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/
本地环境jdkjdk1.8.0_65,新建一个maven项目,参看文中的pom文件,
新建一个类
mvn spring-boot:run启动
结果报错
没有javax.servlet.ServletContext.getVirtualServerName()这个方法,然后再看了下默认使用的tomcat/8.5.11,然后找到这个版本的tocmat,查看里面的servlet-api.jar,果然没有这个方法,那么指定一个tomcat版本,网上搜下最新版本为9.0.0.M17,果断在pom中添加指向这个版本
现来mvn spring-boot:run
结果还是报错
查看mvn引入的jar,tomcat-embed-core-9.0.0.M17.jar 中确实没有这个方法,难道9太新了,要换8?!
换了tomcat/8.0.23试了下
又出了新的错误
好吧,都到这里了,再引入tomcat-juli
终于能启动了,但是不完美,中间过程报错
这个问题有点不对啊,又回头去查看tomcat-embed-core-8.0.23.jar,确认有没有这个方法,结果是有的。
再仔细看下报错日志,错误似乎是从jdk1.8.0_65中出来的,而不是项目中,jdk1.8.0_65\jre\lib\ext\servlet-api.jar中也有这个类,难道是这个类出了问题?
好吧,试着从apache-tomcat-9.0.0.M17中拷一个jar文件去覆盖,结果完善启动了,顺利的出现hello world!
似乎可以得出以下结论:
spring boot 1.5.1.RELEASE不兼容tomcat9,但是官方文档上并没有写,只写着tomcat7+
但是事情还没完,从最后的问题上来看和网上搜索的情况来下(并没有搜到多少同类的问题),难道问题一开始就出现在jdk上?我再把pom文件恢复到最初的样子,不再指定tomcat,项目再启动,成功了!
所以难道spring boot1.5.1也不支持jdk8?,官方说明是支持jdk7+,凌乱了~~~~
所以这里肯定还有其它问题存在,不知道有没有人也碰到我的问题,交流一下
学习文档:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/
本地环境jdkjdk1.8.0_65,新建一个maven项目,参看文中的pom文件,
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.qnvip</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- Inherit defaults from Spring Boot --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.1.RELEASE</version> </parent> <!-- Add typical dependencies for a web application --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <!-- Package as an executable jar --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
新建一个类
/** * Hello world! * */ @RestController @EnableAutoConfiguration public class App { @RequestMapping("/") String home() { return "Hello World!"; } public static void main(String[] args) throws Exception { SpringApplication.run(App.class, args); } }
mvn spring-boot:run启动
结果报错
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext[]] at java.util.concurrent.FutureTask.report(FutureTask.java:122) [na:1.8.0_65] at java.util.concurrent.FutureTask.get(FutureTask.java:192) [na:1.8.0_65] at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:939) ~[tomcat-embed-core-8.5.11.jar:8.5.11] at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:872) [tomcat-embed-core-8.5.11.jar:8.5.11] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.11.jar:8.5.11] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419) [tomcat-embed-core-8.5.11.jar:8.5.11] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409) [tomcat-embed-core-8.5.11.jar:8.5.11] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_65] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_65] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_65] at java.lang.Thread.run(Thread.java:745) [na:1.8.0_65] Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext[]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167) [tomcat-embed-core-8.5.11.jar:8.5.11] ... 6 common frames omitted Caused by: org.apache.catalina.LifecycleException: Failed to start component [Pipeline[StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext[]]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167) [tomcat-embed-core-8.5.11.jar:8.5.11] at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5099) ~[tomcat-embed-core-8.5.11.jar:8.5.11] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.11.jar:8.5.11] ... 6 common frames omitted Caused by: org.apache.catalina.LifecycleException: Failed to start component [org.apache.catalina.authenticator.NonLoginAuthenticator[]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167) [tomcat-embed-core-8.5.11.jar:8.5.11] at org.apache.catalina.core.StandardPipeline.startInternal(StandardPipeline.java:170) ~[tomcat-embed-core-8.5.11.jar:8.5.11] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.11.jar:8.5.11] ... 8 common frames omitted Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String; at org.apache.catalina.authenticator.AuthenticatorBase.startInternal(AuthenticatorBase.java:1137) ~[tomcat-embed-core-8.5.11.jar:8.5.11]
没有javax.servlet.ServletContext.getVirtualServerName()这个方法,然后再看了下默认使用的tomcat/8.5.11,然后找到这个版本的tocmat,查看里面的servlet-api.jar,果然没有这个方法,那么指定一个tomcat版本,网上搜下最新版本为9.0.0.M17,果断在pom中添加指向这个版本
<properties> <tomcat.version>9.0.0.M17</tomcat.version> </properties>
现来mvn spring-boot:run
结果还是报错
[WARNING] java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run(AbstractRunMojo.java:527) at java.lang.Thread.run(Thread.java:745) Caused by: org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is java.lang.NoSuchMethodError: org.apache.catalina.Context.addServletMapping(Ljava/lang/String;Ljava/lang/String;)V at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:137) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:536) at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370) at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151) at com.qnvip.demo.App.main(App.java:22) ... 6 more
查看mvn引入的jar,tomcat-embed-core-9.0.0.M17.jar 中确实没有这个方法,难道9太新了,要换8?!
换了tomcat/8.0.23试了下
又出了新的错误
java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run(AbstractRunMojo.java:527) at java.lang.Thread.run(Thread.java:745) Caused by: org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:137) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:536) at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370) at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151) at com.qnvip.demo.App.main(App.java:22) ... 6 more
好吧,都到这里了,再引入tomcat-juli
<dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-juli</artifactId> <version>9.0.0.M17</version> </dependency>
终于能启动了,但是不完美,中间过程报错
java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String; at org.apache.tomcat.websocket.server.WsServerContainer.<init>(WsServerContainer.java:147) ~[tomcat-embed-websocket-8.0.23.jar:8.0.23] at org.apache.tomcat.websocket.server.WsSci.init(WsSci.java:131) ~[tomcat-embed-websocket-8.0.23.jar:8.0.23] at org.apache.tomcat.websocket.server.WsContextListener.contextInitialized(WsContextListener.java:39) ~[tomcat-embed-websocket-8.0.23.jar:8.0.23] at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4729) [tomcat-embed-core-8.0.23.jar:8.0.23] at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5167) [tomcat-embed-core-8.0.23.jar:8.0.23] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.0.23.jar:8.0.23] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409) [tomcat-embed-core-8.0.23.jar:8.0.23] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1399) [tomcat-embed-core-8.0.23.jar:8.0.23] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_65] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_65] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_65] at java.lang.Thread.run(Thread.java:745) [na:1.8.0_65] 2017-03-01 16:16:37.544 ERROR 14032 --- [ost-startStop-1] o.apache.catalina.core.StandardContext : One or more listeners failed to start. Full details will be found in the appropriate container log file 2017-03-01 16:16:37.546 ERROR 14032 --- [ost-startStop-1] o.apache.catalina.core.StandardContext : Context [] startup failed due to previous errors 2017-03-01 16:16:37.923 INFO 14032 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@4ecad335: startup date [Wed Mar 01 16:16:35 CST 2017]; root of context hierarchy 2017-03-01 16:16:38.031 INFO 14032 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/]}" onto java.lang.String com.qnvip.demo.App.home() 2017-03-01 16:16:38.038 INFO 14032 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest) 2017-03-01 16:16:38.041 INFO 14032 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) 2017-03-01 16:16:38.096 INFO 14032 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2017-03-01 16:16:38.097 INFO 14032 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2017-03-01 16:16:38.178 INFO 14032 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2017-03-01 16:16:38.369 INFO 14032 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup 2017-03-01 16:16:38.472 INFO 14032 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http) 2017-03-01 16:16:38.479 INFO 14032 --- [ main] com.qnvip.demo.App : Started App in 4.005 seconds (JVM running for 8.011)
这个问题有点不对啊,又回头去查看tomcat-embed-core-8.0.23.jar,确认有没有这个方法,结果是有的。
再仔细看下报错日志,错误似乎是从jdk1.8.0_65中出来的,而不是项目中,jdk1.8.0_65\jre\lib\ext\servlet-api.jar中也有这个类,难道是这个类出了问题?
好吧,试着从apache-tomcat-9.0.0.M17中拷一个jar文件去覆盖,结果完善启动了,顺利的出现hello world!
似乎可以得出以下结论:
spring boot 1.5.1.RELEASE不兼容tomcat9,但是官方文档上并没有写,只写着tomcat7+
但是事情还没完,从最后的问题上来看和网上搜索的情况来下(并没有搜到多少同类的问题),难道问题一开始就出现在jdk上?我再把pom文件恢复到最初的样子,不再指定tomcat,项目再启动,成功了!
所以难道spring boot1.5.1也不支持jdk8?,官方说明是支持jdk7+,凌乱了~~~~
所以这里肯定还有其它问题存在,不知道有没有人也碰到我的问题,交流一下
相关文章推荐
- 快速构建可运行的Spring-boot项目(Hello World)
- 记一次大坑:SpringBoot+Mybatis项目中,配置文件中的修改了SQL语句后不生效
- Spring Boot快速入门之Hello World
- SpringBoot入门系列:第一篇 Hello World
- Spring Boot学习(简介-Hello World)
- Spring boot 学习笔记(1)——hello world创建,属性application.properties、 yml配置
- 跟我学Spring Boot(二)Hello World
- 一头扎进springboot之Hello World
- spring boot(1)-简单搭建 Hello World
- 快速构建可运行的Spring-boot项目(Hello World)
- Spring Boot系列教程二:创建第一个web工程 hello world
- (1)spring boot起步之Hello World【从零开始学Spring Boot】
- 第一个Spring Boot应用(Hello World)
- Spring Boot快速入门(Hello World)
- Intellij和SpringBoot,gradle构建Hello world!工程
- SpringBoot入门:Hello World(一)
- 1. spring boot起步之Hello World【从零开始学Spring Boot】
- 快速构建可运行的Spring-boot项目(Hello World)