springboot随笔9.0:多环境部署

一、jar包(官方推荐)

image.png

jar包方式启动,也就是使用SpringBoot内置的tomcat运行。服务器上面只要你配置了jdk1.8及以上就ok,不需要外置tomcat。

  • 首先在pom.xml文件中导入Springboot的maven依赖

    
        
            org.springframework.boot
            spring-boot-maven-plugin
        

  • 执行package


    image.png
  • package完成以后,target中会生成一个.jar包;


    image.png
  • 可以将jar包上传到Linux服务器上,以jar运行(此处本地验证打包成功(cmd))
java -jar spring-boot-mytest-0.0.1-SNAPSHOT.jar
image.png

二、war包

传统的部署方式:将项目打成war包,放入tomcat 的webapps目录下面,启动tomcat,即可访问。

  • pom.xml配置修改
jar
//修改为
war
  • pom文件添加如些依赖


      javax.servlet
      javax.servlet-api
      provided

  • 排除springboot内置的tomcat干扰


      org.springframework.boot
      spring-boot-starter-web
      
            
            org.springframework.boot
            spring-boot-starter-tomcat
            
      

  • 改造启动类
@SpringBootApplication
public class SpringBootMytestApplication extends SpringBootServletInitializer {
      public static void main(String[] args) {
      SpringApplication.run(SpringBootMytestApplication.class, args);
      }
      @Override
      protected SpringApplicationBuilder configure(SpringApplicationBuilderbuilder) {
      // 注意这里要指向原先用main方法执行的Application启动类
      return builder.sources(SpringBootMytestApplication.class);
}
  • pom文件中不要忘了maven编译插件

      
            
                  org.springframework.boot
                  spring-boot-maven-plugin
            
      

  • 在IDEA中使用mvn clean命令清除旧的包,并使用mvn-package生成新的war包


    image.png
  • 使用外部Tomcat运行该 war 文件(把 war 文件直接丢到 tomcat的webapps目录,启动
    tomcat)

注意事项:

将项目打成war包,部署到外部的tomcat中,这个时候,不能直接访问spring boot 项目中配置文件配置的端口。
application.yml中配置的server.port配置的是spring boot内置的tomcat的端口号, 打成war包部署在独立的tomcat上之后, 配置的server.port是不起作用的。一定要注意这一点!!

三、jar包和war包方式对比

  • 打jar包时不会把src/main/webapp 下的内容打到jar包里 (你认为的打到jar包里面,路径是不行的会报404)
  • 打war包时会把src/main/webapp 下的内容打到war包里
  • 有大量css、js、html,且需要经常改动的项目,打成 war 包去运行比较方便,因为改动静态资源可以直接覆盖,很快看到改动后的效果,这是 jar 包不能比的

四、多环境部署

如线上环境prod(product)、开发环境dev(development)、测试环境test、提测环境qa、单元测试unitest等等。不同的环境需要进行不同的配置,从而在不同的场景中跑我们的程序。例如prod环境和dev环境通常需要连接不同的数据库、需要配置不同的日志输出配置。还有一些类和方法,在不同的环境下有不同的实现方式。
Spring Boot 对此提供了支持,一方面是注解@Profile,另一方面还有多资源配置文件。

4.1 @Profile

@profile 注解的作用是指定类或方法在特定的 Profile 环境生效,任何@Component 或
@Configuration 注解的类都可以使用@Profile 注解。在使用DI来依赖注入的时候,能够根据@profile 标明的环境,将注入符合当前运行环境的相应的bean。

使用要求:

@Component 或@Configuration 注解的类可以使用@profile
@Profile 中需要指定一个字符串,约定生效的环境

@Profile 的使用位置

a. @Profile修饰类

@Configuration
@Profile("prod")
public class JndiDataConfig {
      @Bean(destroyMethod="")
      public DataSource dataSource() throws Exception {
          Context ctx = new InitialContext();
          return (DataSource) ctx.lookup("java:comp/env/jdbc/datasource");
      }
}

b. @Profile 修饰方法

@Configuration
public class AppConfig {
      @Bean("dataSource")
      @Profile("dev")
      public DataSource standaloneDataSource() {
          return new EmbeddedDatabaseBuilder()
          .setType(EmbeddedDatabaseType.HSQL)
          .addScript("classpath:com/bank/config/sql/schema.sql")
          .addScript("classpath:com/bank/config/sql/test-data.sql")
          .build();
      }
      @Bean("dataSource")
      @Profile("prod")
      public DataSource jndiDataSource() throws Exception {
          Context ctx = new InitialContext();
          return (DataSource)ctx.lookup("java:comp/env/jdbc/datasource");
      }
}

c. @Profile 修饰注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Profile("prod")
public @interface Production {
}

profile激活

使用哪个profile由spring.profiles.active控制

1. 配置文件方式激活profile

spring.profiles.active=dev

2. 命令行方式激活profile

java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;

4.2 多Profile的资源文件

Springboot的资源配置文件除了application.properties之外,还可以有对应的资源文件application-{profile}.properties.
假设,一个应用的工作环境有:dev、test、prod
那么,我们可以添加 4 个配置文件:

  • applcation.properties - 公共配置
  • application-dev.properties - 开发环境配置
  • application-test.properties - 测试环境配置
  • application-prod.properties - 生产环境配置
    不同的properties配置文件也可以是在 applcation.properties 文件中来激活 profile:
spring.profiles.active = test

你可能感兴趣的:(springboot随笔9.0:多环境部署)