被springboot项目maven打包、启动、访问折腾的头都大了,一步一个坑,在解决了所有的问题之后,那种欣喜若狂的心情只有自己能体会,决定要好好记录一下了,废话不多说了,直接进入正题。
问题和排查流程:
为了扩展和规范,搭建的springboot项目是一个多模块项目,于是,问题来了,下面一个个说:
1.项目搭建完成后,application.yml文件配置了mvc视图解析器,写了一个controller测试,发现能进controller方法,但是死活输出不了页面,浏览器报错如下:
上网查了很多资料,有些说springboot整合jsp要通过spring-boot:run方式启动,具体可以参考:https://segmentfault.com/a/1190000009785247
后来我又重新搭建了一个简单的springboot工程(注意:这一次不是多模块项目),通过main方法启动,却又能正常跳转jsp页面,我....
2.看来是多模块工程非得通过spring-boot:run启动,具体原因待有缘人补充,这时候我尝试通过spring-boot:run启动,但是打开maven结构图,发现Plugins下并没有spring-boot插件,原来是因为pom.xml中没有配置spring-boot插件导致的,兴致匆匆的配置了spring-boot plugins,很开心,maven结构图出现了亮眼的spring-boot插件
3.然而一切并没有那么顺利,当我执行mvn -package时,居然报错很多类找不到,我....,我就多添加了一个plugin而已啊,有必要这么折磨我么,后来参考网上的文章,添加了<classifier>exec</classifier>这么一个配置,如下:
赶紧试了一把,好了,这次package终于没报错了,然后我就匆忙点击spring-boot:run准备启动项目了,然鹅....
4.启动报错,提示我没有配置mainClass,原来是因为项目中含有main方法的class有点多,springboot有点蒙圈不知道找哪一个,于是在plugin中又加了一个配置<mainClass>com.mmz.WebApplication</mainClass>,指定了主类
5.然鹅,还是有问题,启动仍然报错,只不过这次报错不一样了,报classNotFundException,找不到我配置的WebApplication类。。。我很难受呀
6.查资料啊查资料,网上并没有相关文章,后来又怀疑是多模块项目惹的祸,重新用简单的项目试验了一把,结果简单的项目就好好地运行并没有报错,于是仔细检查了一下两个项目的配置,发现启动简单工程时,启动的本身就是web模块,而我启动多模块工程时,运行的是root模块下面的spring-boot插件,怀疑跟这个有关,于是尝试启动了web模块下面的spring-boot:run,妈呀,终于启动成功,并且能正常访问页面了,这一刻把我激动的。。。
7.你以为这样就可以了吗??下午试了一把把项目打包成jar的方式,运行java -jar xxx.jar方式启动,启动成功,但是仍然没法访问jsp页面,解压jar包发现根本没有把webapp目录以及其目录下的jsp页面打包进去,因为springboot插件打包默认不会打包自己添加的webapp目录,于是需要在pom.xml下的build标签里指定maven 打包目录如下:
这时候重新打包成jar解压,发现打包进了对应的目录下,赶紧访问页面试了一把,结果......嗯,还是不可以,报了同样的错误...
8.查阅资料,最后一步还需要指定spring-boot-maven-plugin的版本为1.4.2.RELEASE,其他版本都不行,据说是springboot的一个bug,于是添加了version后,再试了一把终于可以了。。至此,一个完成的spriongboot+maven,打包+启动终于完整了。最终配置如下:
<build>
<resources>
<!-- 打包时将jsp文件拷贝到META-INF目录下-->
<resource>
<!-- 指定resources插件处理哪个目录下的资源文件 -->
<directory>src/main/webapp</directory>
<!--注意此次必须要放在此目录下才能被访问到-->
<targetPath>META-INF/resources</targetPath>
<includes>
<include>**/**</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/**</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.4.2.RELEASE</version>
<configuration>
<mainClass>com.mmz.WebApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
nice,接下来就是把自己的项目打好jar包放到腾讯云服务器上运行了。。。