logo头像

生而无畏,战至终章

SpringBoot问题集(一)

最近项目中用到SpringBoot的地方挺多的,在开发过程中遇到了很多问题,希望通过该篇文章把遇到的问题做一个整理,以便后续查看方便,若能帮到其他人少走弯路那是最好的了。
废话不多说了,开始进入正题:

一、springboot+maven出现的问题

问题描述:
SpringBoot在执行maven deploy的时候出现一下问题:

1
2
3
4
5
6
7
[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.4.2.RELEASE:repackage (default) on project springcloud-common: Execution default of goal org.springframework.boot:spring-boot-maven-plugin:1.4.2.RELEASE:repackage failed: Unable to find a single main class from the following candidates [com.xx.xx.xx.Application, com.xx.xx.xx.utils.SmsUtils] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginExecutionException

解决办法:

  1. 在pom.xml文件中加入主类,用于指定加载的主类(在properties中,加入一个start-class的属性,用于告诉Springboot maven plugin那个类是入口类即可)
1
2
3
4
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<start-class>com.xx.controller.TfWebflowApplication</start-class>
</properties>
  1. 在build中添加如下配置
1
2
3
4
5
6
7
8
9
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>${start-class}</mainClass>
<outputDirectory>../target/</outputDirectory>
<skip>true</skip>
</configuration>
</plugin>
  1. 最后执行maven deploy即,不出意外BUILD SUCCESS

二、Springboot子模块打包去掉Boot_INF文件夹

在平时开发中,有时候不需要将项目中的某个模块打包成sdk提供出去,一般我们在Springboot项目中打包会在pom.xml中添加如下信息:

1
2
3
4
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

这样打的jar包中会多一个boot-inf目录,导致程序包不存在,无法调用相关的接口

解决办法如下:
如果A模块依赖B模块,在B模块的pom文件中,加入如下信息接口:

1
2
3
4
5
6
7
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>

三、Springboot之Filter指定过滤URL

在使用Filter对一些自己指定的URL进行过滤拦截时,经常会出现如下错误:

  1. 明明在@WebFilter(urlPatterns={“/app/xx”})中过滤的是/app/xx 路径,但是运行之后发现,这个WebFilter过滤器对所有的url都进行了过滤

  2. 运行之后发现过滤器没有初始化,没有被加载

解决办法:

  1. 指定路径;
    在类上添加注解@WebFilter(urlPatterns={“/app/xx”}),然后还需要在Springboot的启动类上加上注解@ServletComponentScan,如下:

  2. 过滤所有路径
    在类上添加@Component或@Configuration 即可

1
2
3
4
5
6
//过滤所有路径
@Component
public class WebFilter implements Filter(){
//override三个方法
...
}

如果添加@Component或@Configuration ,又添加了@WebFilter(),那么会初始化两次Filter,要避免此种情况的出现