1. 程式人生 > >spring boot專案搭建 釋出 打包彎路全紀錄

spring boot專案搭建 釋出 打包彎路全紀錄

這幾天在學習spring boot,因為當前手頭沒有需求,就嘗試將之前一個小工程轉換為spring boot專案。同時由於目前手頭的IDE實在太老(Eclipse indigo),很多步驟都是手動完成的,走了不少彎路。記錄如下,也方便以後查閱:

一、Eclipse Indigo安裝sts外掛

sts全稱是springsource-tool-suite,是Spring官方提供給各IDE的工具包。由於eclipse版本眾多,因此不同版本對應的sts版本也是不一樣的。indigo版本對應的是這個版本,但是經我安裝測試,由於版本久遠,其對spring boot的支援也相當有限,用於建立普通的spring maven專案尚可,其預設的spring版本為3.2.3,的確是遠古的產物了。


如果使用新版本的eclipse,功能會很強大:


二、新增spring-boot-starter依賴

由於我的eclipse版本不支援一鍵建立spring-boot-starter專案,所以只能自己先建立maven專案,然後手工在pom檔案中新增依賴如下:

<parent>
	<artifactId>spring-boot-starter-parent</artifactId>
	<groupId>org.springframework.boot</groupId>
	<version>1.5.7.RELEASE</version>
</parent>
<dependencies>
<dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-web</artifactId>
    	<version>1.5.7.RELEASE</version>
    	<type>pom</type>
    	<scope>compile</scope>
</dependency>
</dependencies>
<build>
    <finalName>test_springboot</finalName>
    <plugins>
    	<plugin>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-maven-plugin</artifactId> 
    	</plugin>
    </plugins>
</build>

注意:上面的<parent>節點十分重要,會影響到後面的打包。

三、spring boot除錯找不到類

@SpringBootApplication
public class Application{
	
	 public static void main(String[] args) {
	      SpringApplication.run(Application.class, args);
	 }

}

注意:1.要新增@springBootApplication的註解,否則springboot無法找到啟動的配置類;

          2.這個Application類要放在包的根目錄下,因為其只對自己路徑下的子包進行掃描和注入bean;


四、spring boot和mybatis整合

當我測試的時候發現一個問題,在如上面程式碼配置的前提下,當我的web層單獨注入一個service是沒有問題的,在單獨注入一個dao(mybatis mapper)也是沒有問題的,但是當注入一個已注入mapper的service的時候就會丟擲如下異常org.springframework.beans.factory.NoUniqueBeanDefinitionException:No qualifying bean of type ... available: expected single matching bean but found 2。

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.wasu.service.interfaces.ITaskSV' available: expected single matching bean but found 2: taskSVImpl,ITaskSV
	at org.springframework.beans.factory.config.DependencyDescriptor.resolveNotUnique(DependencyDescriptor.java:173) ~[spring-beans-4.3.11.RELEASE.jar:4.3.11.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1116) ~[spring-beans-4.3.11.RELEASE.jar:4.3.11.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066) ~[spring-beans-4.3.11.RELEASE.jar:4.3.11.RELEASE]
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:518) ~[spring-context-4.3.11.RELEASE.jar:4.3.11.RELEASE]
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:496) ~[spring-context-4.3.11.RELEASE.jar:4.3.11.RELEASE]
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:627) ~[spring-context-4.3.11.RELEASE.jar:4.3.11.RELEASE]
	at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:169) ~[spring-beans-4.3.11.RELEASE.jar:4.3.11.RELEASE]
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.3.11.RELEASE.jar:4.3.11.RELEASE]
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:318) ~[spring-context-4.3.11.RELEASE.jar:4.3.11.RELEASE]
	... 25 common frames omitted

觀其異常資訊是由於我的service被注入了2遍,分別為介面和其實現類。這個問題詭異之處在於,一般丟擲這個異常都是發生在有2個實現類同時實現了同一介面時,而我們的情況並不是如此。其原因是這樣,由於我們在整合mybatis時還添加了如下的依賴:
<dependency>
	    <groupId>org.mybatis.spring.boot</groupId>
	    <artifactId>mybatis-spring-boot-starter</artifactId>
	    <version>1.0.0</version>
	</dependency>
因此當我們啟動專案的時候,會有2個掃描器進行bean的掃描注入,一個是spring的,另一個是mybatis mapper的。由於我們沒有配置mybatis mapper的掃描路徑,所以其也會基於Application的子包進行掃描,結果就導致了service被掃描注入了2遍。解決這個問題很簡單,只要我們在啟動類上加上註解即可:
@SpringBootApplication
@EnableAutoConfiguration
@MapperScan("com.wasu.dao")
public class Application{
	
	 public static void main(String[] args) {
	      SpringApplication.run(Application.class, args);
	 }

}

五、spring boot整合mybati分頁外掛PageHelper

這裡也走了一個彎路,最初我以為spring boot專案也和其他普通maven專案一樣新增PageHelper的依賴就好了,其實不是的,因為我們用的mybatis依賴就已經是spring boot官方注入的了,因此其對應的分頁外掛也要使用其官方提供的版本:

<dependency>  
		<groupId>com.github.pagehelper</groupId>  
		<artifactId>pagehelper-spring-boot-starter</artifactId>  
		<version>1.0.0</version>  
	</dependency>

順便貼一下spring boot推薦使用的yml配置檔案的參考版本:
# Server settings  
server:  
    port: 9000
    address: localhost
  
# SPRING PROFILES  
spring:
    datasource:
        name: test
        url: jdbc:mysql://localhost:3306/xxxx
        username: root
        password: xxxx
        # 使用druid資料來源
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        filters: stat
        maxActive: 20
        initialSize: 1
        maxWait: 60000
        minIdle: 1
        timeBetweenEvictionRunsMillis: 60000
        minEvictableIdleTimeMillis: 300000
        validationQuery: select 'x'
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        poolPreparedStatements: true
        maxOpenPreparedStatements: 20       
    # HTTP ENCODING  
    http:  
        encoding.charset: UTF-8  
        encoding.enable: true  
        encoding.force: true  
  
# MyBatis  
mybatis:  
    mapperLocations: classpath:mapper/*.xml  
    typeAliasesPackage: com.wasu.common.bean
  

# pagehelper分頁外掛配置
pagehelper:
    helperDialect: mysql
    reasonable: true
    supportMethodsArguments: true
    params: count=countSql
    
# LOGGING  
logging:  
    level:  
       com.ibatis:DEBUG  

yml檔案有一點要特別注意:key後面的冒號":"後面一定要加一個空格,否則該行配置將無法服務。這裡推薦使用org.dadacoalition.yedit_1.0.20.201509041456-RELEASE.jar外掛。

六、spring boot專案打包時html頁面檔案找不到

因為spring boot專案和普通的maven專案的靜態檔案路徑不同,spring boot專案的為main/resources/static,而maven專案的為main/webapps,當從普通maven專案向spring boot專案轉換的時候注意複製一下就好了。

七、spring boot專案釋出

使用java -jar xxx.jar即可釋出專案


終於見到了久違的專案頁面: