V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
djchurch007
V2EX  ›  问与答

Java 项目一般如何管理配置文件

  •  
  •   djchurch007 · 2015-07-09 16:59:18 +08:00 · 8340 次点击
    这是一个创建于 3448 天前的主题,其中的信息可能已经有所发展或是发生改变。
    提问的初衷:
    1. 本人非Java猿
    2. 隔壁Java项目组把线上数据库账号密码等系统配置直接写进代码,由svn版本控制,然后打成jar包上线
    3. 在我的世界里,不是很能理解这种做法

    我相信存在即合理,所以有以下疑问,顺便涨点道行:
    1. Java项目一般如何管理配置文件,包括系统配置、业务配置
    2. 大家告诉我下,将配置文件打成jar包有哪些优缺点,最好客观一点
    19 条回复    2015-07-10 10:26:40 +08:00
    incompatible
        1
    incompatible  
       2015-07-09 17:07:03 +08:00
    流行的做法是写在配置文件里,在代码中读取配置文件获得配置
    打包时使用maven把配置文件打到jar包或者war包中。

    你隔壁的硬编码然后打成jar包我觉得也没什么问题。需要改配置时,在版本控制里改好,然后打出新的jar包重新上线就行了。
    如果硬要说有什么缺点,那就是这种情况下没法在生产环境里改配置文件,因为包含配置的代码已经被编译成class了,你没法用文本编辑器直接改。
    crazyxin1988
        2
    crazyxin1988  
       2015-07-09 17:10:35 +08:00
    一般都是写到配置文件中吧
    而且 开发,测试,生产环境都有特定的配置文件
    这样 项目启动时直接加载环境中的配置就好了啊
    djchurch007
        3
    djchurch007  
    OP
       2015-07-09 17:17:55 +08:00
    @incompatible
    @crazyxin1988
    嗯,他们是有分多个配置文件,我只是不能理解生产环境的配置文件也交由svn控制
    1. 这样不是每个开发人员都知道线上服务器的账号密码了
    2. 如果以后改了账号密码,是不是要整个项目重新打包?
    crazyxin1988
        4
    crazyxin1988  
       2015-07-09 17:22:11 +08:00
    @djchurch007
    生产环境的那份配置 是在自动化部署平台控制的。。。。为啥交给svn
    incompatible
        5
    incompatible  
       2015-07-09 17:24:26 +08:00
    @djchurch007 开发人员知道线上数据库密码无所谓啊
    运维或dba通常会给给线上数据库加白名单,只对应用服务器开放。 开发人员知道了密码也连不上

    重新打包是对的。直接改线上配置是糟糕的主意。比如有多个应用服务器的情况,难道ssh到每一台上面改?
    djchurch007
        6
    djchurch007  
    OP
       2015-07-09 17:57:57 +08:00
    @crazyxin1988 所以说生产环境的配置一般做法是不会让所有开发人员都看到的喽
    yorkw
        7
    yorkw  
       2015-07-09 18:00:24 +08:00
    以Spring为例,标准写法是先加载运行环境里的配置文件,如/opt/myapp/config,如果失败再加载jar包里自带的。配置文件需要进SVN做版本控制,但一般配的都是开发环境的账号密码。随jar包发布只当作模版使用。

    关于重新打包的问题要视具体项目而论,对于较大的项目来说,一般有标准的发布流程,如 mvn release:prepare mvn release:perform,要走一遍unit test,svn tag,etc. 还是比较耗时的(视项目规模)。而且大公司里程序员一般也不直接参与部署流程的,从制度上保证生产环境的安全性。
    djchurch007
        8
    djchurch007  
    OP
       2015-07-09 18:08:01 +08:00
    @incompatible
    1. 那比如说生产环境的第三方api账号密码怎么处理?比如说短信通道、云存储之类。

    2. 重新打包是不是得让该服务器上的项目中断了?
    crazyxin1988
        9
    crazyxin1988  
       2015-07-09 18:11:53 +08:00
    @djchurch007
    查看 修改 当然都要权限
    不然岂不是很危险
    loading
        10
    loading  
       2015-07-09 18:17:14 +08:00 via Android
    从系统变量取

    或者文件读取。
    djchurch007
        11
    djchurch007  
    OP
       2015-07-09 18:20:36 +08:00
    @yorkw 那如果出现了紧急问题,比如说光纤被挖断了,台风来了,需要紧急换个新的配置文件,也要走这么长的流程么
    fwrq41251
        12
    fwrq41251  
       2015-07-09 18:33:27 +08:00
    一部分配置在项目的.propeties文件里。
    一部分在数据库的表里。
    数据库账号密码在应用服务器的配置里(一般开发没有机会接触生产环境的服务器)。
    ipeony
        13
    ipeony  
       2015-07-09 18:37:08 +08:00
    数据源用JNDI,然后控制应用服务器访问权限
    liuzhen
        14
    liuzhen  
       2015-07-09 23:18:41 +08:00
    @crazyxin1988 自动化部署平台控制 与 交给svn并没有什么冲突啊
    crazyxin1988
        15
    crazyxin1988  
       2015-07-09 23:21:57 +08:00
    @liuzhen
    交给自动化部署 生产环境 可以加权限控制
    交给svn 那配置文件和svn的权限一起,失去意义了
    liuzhen
        16
    liuzhen  
       2015-07-09 23:34:20 +08:00
    @crazyxin1988 自动化部署只管编译、打包、部署的事情,恕我愚昧~ 不明白跟配置文件的版本控制有什么冲突,难不成一个配置文件一百年不变化或者不增加或者删除配置项
    crazyxin1988
        17
    crazyxin1988  
       2015-07-10 09:09:56 +08:00
    @liuzhen
    编译打包 使用jenkins
    自动化部署 单独的部署系统呢
    liuzhen
        18
    liuzhen  
       2015-07-10 10:09:47 +08:00
    @crazyxin1988 哦 环境不一样
    djchurch007
        19
    djchurch007  
    OP
       2015-07-10 10:26:40 +08:00
    @incompatible
    @crazyxin1988
    @yorkw
    @loading
    @fwrq41251
    @ipeony
    @liuzhen
    谢谢各位耐心的解惑,涨姿势了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3174 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:45 · PVG 08:45 · LAX 16:45 · JFK 19:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.