美文网首页
springboot启动时指定jar包内部或者外部的配置文件以及

springboot启动时指定jar包内部或者外部的配置文件以及

作者: 猫尾草 | 来源:发表于2020-04-27 23:06 被阅读0次

    1. 直接启动jar包

    1.2 指定jar包内配置文件

      做这个的前提是你打jar包时里面就包含了不同环境配置的配置文件,主要的问题在于用-Dspring.profiles.active还是--spring.profiles.active=dev,这两个使用上有区别。
      命令:

    java -jar -Dspring.profiles.active=dev {your jar}.jar
    

    -Dspring.profiles.active=dev如果放到后面,无效,但是不会报错,此时加载的就是打包时预设置的配置文件。
      或者命令:

    java -jar {your jar}.jar --spring.profiles.active=dev
    

    --spring.profiles.active=dev如果放到前面,直接报错。
      目前发现一个特例,Dockerfile里面使用ENTRYPOINT时-Dspring.profiles.active=dev不讲究位置在哪,使用CMD时不行。

    1.2 直接指定配置文件,不使用jar包内置的配置文件

      这个其实和上面的类似。
      命令:
    java -jar {your jar}.jar --spring.config.location={file path}
      或者命令:
    java -jar -Dspring.config.location={file path} {your jar}.jar

    2. 用容器运行jar包打成的镜像

    2.1 套用1的方法

      无论是在docker的CMD、ENTRYPOINT还是k8s的command命令中,都可以按照1.1的做法直接写命令。
      这里还需要注意一点,ENTRYPOINT中可以直接执行java命令,CMD和command命令则需要写/bin/sh -c java,因为使用的基础镜像不同,有的可能需要使用/bin/bash。
      如果需要1.2的做法,那么可以有两种选择:

    1. 打包镜像时直接把配置文件放到镜像中,这样每个环境都要单独打镜像,麻烦;
    2. 如果是只使用docker,可以把配置文件写好放在宿主机或者nfs等,然后直接挂载到容器中,启动时指定使用哪那个配置文件,这样就不用每次修改镜像;如果使用的是k8s,因为宿主机和pod通常都不是绑定的,所以只能把配置文件放到nfs这些共享文件系统中。
    

      这里要注意一下springboot读取配置文件的位置有如下优先级,依次降低:

    1. 在jar包的同一目录下建一个config文件夹,然后把配置文件放到这个文件夹下。
    2. 直接把配置文件放到jar包的同级目录。
    3. 在classpath下建一个config文件夹,然后把配置文件放进去。
    4. 在classpath下直接放配置文件。
    

      优先级最高的时命令行中指定的配置文件。

    2.2 k8s使用包含配置文件的configmap

      2.1的做法的缺点是需要额外使用nfs之类的文件来保存配置文件,通过configmap可以把配置文件直接交给k8s来管理。


      如果不需要k8s或者对k8s的yaml脚本没有了解,下面的就不需要看了。
      写一个创建configmap的脚本:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: test-configmap
      namespace: test-namespace
    data:
      application.properties: |
        server.port=8080
        server.servlet.context-path=/test-srv
      application-dev.properties: |
        server.port=8081
        server.servlet.context-path=/test-srv
    

      这样就在test-namespace下的test-configmap里面创建了一个文件,文件名叫做application.properties,文件内容就是|后面的内容。这样的文件可以创建多个,例如在下面继续写的application-dev.properties。
      在k8s的Deployment脚本中,可以用上面的文件来创建一个volume,例如命名为config-volume:

    volumes:
      - name: config-volume
        configMap:
          name: notify-configmap
    

      在Deployment脚本中使用:

    volumeMounts:
      - name: config-volume
        mountPath: {容器挂载的目录1}
        subPath: application.properties
      - name: config-volume
        mountPath: {容器挂载的目录2}
        subPath: application-dev.properties
    

      上面的文件就挂载到了容器中,这样在启动jar包的时候就可以指定使用这些文件了。
      容器处理的顺序时先挂载目录,后执行启动命令。

    相关文章

      网友评论

          本文标题:springboot启动时指定jar包内部或者外部的配置文件以及

          本文链接:https://www.haomeiwen.com/subject/ojniwhtx.html