SpringBoot项目转传统SpringMVC war项目的部署问题

项目源码下载:点击打开链接


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都是嵌入式的怎么搞?




猜你喜欢

转载自blog.csdn.net/rishengcsdn/article/details/53787518