项目源码下载:点击打开链接
SpringMVC4.0以后,Spring开始使用Spring Boot来支持自动化开发和部署,虽然方便了程序员和运维,但是也让老的架构开发人员感到困惑。
所以,作者做了一下研究尝试将新的Spring Boot的web项目,转换成旧项目模式,导出war文件部署在Tomcat8下面:
首先,Spring Boot的MVC框架都是通过maven导入的,所以,编辑pom.xml是最重要,但是官方文档言之不详,只靠文档无法完成成功部署。
下面贴出作者的pom.xm配置:
<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>testGrp</groupId>
<artifactId>kkj</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>TestName</name>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.2.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
<properties>
<java.version>1.8</java.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- <plugin> -->
<!-- <groupId>org.apache.maven.plugins</groupId> -->
<!-- <artifactId>maven-war-plugin</artifactId> -->
<!-- <version>2.0.2</version> -->
<!-- <configuration> -->
<!-- <warSourceExcludes>WEB-INF/lib/log4j-${log4j.version}.jar</warSourceExcludes> -->
<!-- </configuration> -->
<!-- </plugin> -->
</plugins>
</build>
<repositories>
<repository>
<id>spring-releases</id>
<url>https://repo.spring.io/libs-release</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-releases</id>
<url>https://repo.spring.io/libs-release</url>
</pluginRepository>
</pluginRepositories>
<packaging>war</packaging>
</project>
===================================================================================
从pom.xml可以看出,spring boot的版本为1.4.2,Spring MVC的版本为4.3.4,将来Spring升级后模式是否有变化不得而知。
依照pom.xml下载文件后,编写例子程序,3个相当简单的java程序:
====================================================================================
package hello;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application3 {
public static void main(String[] args) {
SpringApplication.run(Application3.class, args);
}
}
====================================================================================
package hello;
public class Greeting {
private final long id;
private final String content;
public Greeting(long id, String content) {
this.id = id;
this.content = content;
}
public long getId() {
return id;
}
public String getContent() {
return content;
}
}
====================================================================================
package hello;
import java.util.concurrent.atomic.AtomicLong;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class GreetingController {
private static final String template = "Hello, %s!";
private final AtomicLong counter = new AtomicLong();
@RequestMapping("/greeting")
public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
return new Greeting(counter.incrementAndGet(),
String.format(template, name));
}
}
====================================================================================
值得注意的是虽然例子没有引用任何数据库操作,但是必须导入一个数据库程序才能完成war程序的正确部署,这估计是Boot的Bug。pom.xml已经导入一个hsqldb的jar来解决这个问题,其他数据库jar文件是否可行未验证。
另外war文件要在tomcat8下正确运行还缺少一些配置文件,例如:web.xml和spring-mvc.xml的配置文件。这些文件必须自己手工从旧项目里拷贝进来,目标位置也是必须固定在src\main\webapp,注意此目录也是手工建立的,如果放错位置,会导致插件不认识,无法部署正确的war。
配置文件内容较多,就不再一一贴上了。感兴趣的朋友可以直接下载项目源码研究。
====================================================================================
下面贴出一些可能遇到的问题和应对方法
org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException: Cannot determine embedded database driver class for database type NONE.
数据资源找不到的问题解决:
From the Spring manual (http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html#boot-features-embedded-database-support):
Spring Boot can auto-configure embedded H2, HSQL and Derby databases. You don’t need to provide any connection URLs, simply include a build dependency to the embedded database that you want to use.
For example, typical POM dependencies would be:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<scope>runtime</scope>
</dependency>
For me leaving out the spring-boot-starter-data-jpa dependency and just using the spring-boot-starter-jdbc dependency worked like a charm, as long as I had h2 (or hsqldb) included as dependencies.
======================================================
war文件无法执行,
可能缺少web.xml,和spring-mvc.xml的配置文件,发现是maven打包插件的BUG,手动修改一下两个配置文件,重新用maven install打包,打包前先clean一下,或者反复clean再install。
======================================================
maven插件下载jar慢的问题,
无法解决,也许用vpn或者建立maven私有库是解决方案,但是两者都有不可解决的其他问题。网上建议配置用镜像站点,实测还是没卵用,该慢还是慢。比较实际的方法是等业务低峰的时间去下载jar包吧,比如:午夜三点钟。
=======================================================================================
部署成功后,因为war文件是带项目路径的所以访问方式与Boot方式有所不同。
部署了kkj.war的Tomcat8方式:
http://localhost:8080/kkj/greeting.do
Spring Boot的访问方式:
http://localhost:8080/greeting
Boot方式如何部署为非root模式还没研究出来,什么配置都没有,tomcat都是嵌入式的怎么搞?