在IDEA整合Springboot与IBM liberty

在IDEA整合Springboot与IBM liberty

简介

Liberty 是一款全新的轻量级应用服务器,它将用户的良好开发体验作为最主要的出发点。其主要特点和内容包括:

  • 高模块化——该功能允许用户根据自己应用程序的需求启用或者禁用相关的 feature(所谓 feature,在这里指的是运行应用程序所需要的各种资源的支持。比如,应用程序用到了 JSP,我们就需要启动 JSP 这个 feature,如果不在需要此 feature,就可以将其禁用。通过这种模块化的控制,我们可以按需启动不同的 feature,包括 JSP, Servlet, JPA 等等,这种控制是实现轻量级应用服务器的基础)。
  • 轻量级—— Liberty 采用了多种技术进行瘦身和优化(主要是 OSGi 的应用),与传统的 WAS 相比,极大的减少了运行时的内存消耗。
  • 高动态性——由于采用了 OSGi 的架构,程序员在开发的时候,可以动态修改配置文件,应用程序以及服务器的运行时信息,这些修改都是实时生效的,不需要重启服务器。
  • 快速——由于采用了高模块化的设计,Liberty 应用服务器会“按需启动”,自身消耗的系统资源很少,对执行任务的反应时间也非常短,例如,一般来说 Liberty 的启动时间小于 5 秒。
  • 配置简单——在整个开发过程中,用户只需要和一个配置文件(server.xml)打交道,而且配置的使用也非常灵活。

尽管 Liberty 与传统 WAS 相比只是一个“小块头”,但是在 Web 和 OSGi 应用程序的开发上,Liberty 与传统 WAS 完全保持一致,在 Liberty 上开发的程序,可以直接移植到传统 WAS 上,不需要做任何的改变。相比传统 WAS 的庞大,Liberty 在为用户提供良好的开发体验上遥遥领先。

在本文中,我将描述如何使用Spring Boot和IDEA开发工具创建一个简单的“Hello World”应用程序。

IBM Liberty Vs Tomcat

简单来说,IBM Liberty就是 IBM WebSphere Application Server 的简化版,Liberty是从WebSphere 8.5.5引入的,与传统的WAS不同,Liberty侧重于云应用与微服务的支持,用户可以配置细粒度级别的应用程序所需的组件,所以服务器启动速度非常快,占用空间也很小,跟tomcat一样轻量级,一般都是用于企业级应用比较多,尤其是金融类、或者大型商业应用等,提供很多商业级的扩展组件。

两者区别可以通过以下两篇文章了解: https://webspherecompetition.files.wordpress.com/2012/11/liberty-vs-tomcat.pdf Legacy Communities - IBM Community

开始之前

你需要先到以下网址下载最新版的 WebSphere Liberty runtime : WebSphere Liberty for developers

创建Springboot Rest应用

利用 Spring Initializr 创建一个Sprignboot项目 选择 File->Project->Spring Initizlizr 创建项目命名为 liberty-demo ,依赖包选择 Web ,然后一直点击Next完成即可,项目结构如下: 20181020174716648 配置 Pom.xml 文件,添加servlet容器依赖:

     <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

如果使用旧版本的应用服务器,还需要添加如下依赖:

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>7.0</version>
    <scope>provided</scope>
</dependency>

跟配置外置tomcat一样,我们需要过滤到Springboot里的tomcat模块

    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

我项目完整的Pom.xml文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<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>com.eshare.liberty</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

我们要使用传统的WAR发布Sringboot项目方式,需要调整程序入口代码,继承 SpringBootServletInitializer 类,重写 configure 方法去告诉容器我们的程序启动入口

@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {

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

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(DemoApplication.class);
    }
}

接下来我们实现一个简单的Rest程序,用于测试容器是否启动正常

/**
 * Created by liangyh on 2018/10/20.
 * Email:10856214@163.com
 */
@RestController
public class IndexController{

        @RequestMapping("/sayHello/{name}")
        public String sayHello(@PathVariable String name) {
            return "hello," + name;
        }

}

记住,Springboot的启动类必须置于其他类的同级或者外层,否则会出现扫描不到类的情况,完成项目结构如下:

配置Liberty应用服务器

设置我们的模块包的打包方式 点击 Peroject Structure->Artifacts ,如下图所示选择打包方式:


选择完成后,点击 Apply 完成

选择启动应用服务器 如下图所示,选择liberty作为我们的项目服务器,然后填入相应配置, 必须配置请求上下文(如/demo/) :


设置Liberty服务器配置 在wlp\usr\servers\defaultServer路径下,找到Liberty启动服务器配置 server.xml ,添加 host="*" ,指定拦截任何请求,否则应用服务器不会拦截你的请求:

启动服务器验证

在IDEA启动服务器,浏览器输入 http://localhost:9080/demo/sayHello/haha ,可以看到如下结果:
20181020174923766


原文:404 Not Found