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

2015-07-09 16:59:18 +08:00
 djchurch007
提问的初衷:
1. 本人非Java猿
2. 隔壁Java项目组把线上数据库账号密码等系统配置直接写进代码,由svn版本控制,然后打成jar包上线
3. 在我的世界里,不是很能理解这种做法

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

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

重新打包是对的。直接改线上配置是糟糕的主意。比如有多个应用服务器的情况,难道ssh到每一台上面改?
djchurch007
2015-07-09 17:57:57 +08:00
@crazyxin1988 所以说生产环境的配置一般做法是不会让所有开发人员都看到的喽
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
2015-07-09 18:08:01 +08:00
@incompatible
1. 那比如说生产环境的第三方api账号密码怎么处理?比如说短信通道、云存储之类。

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

或者文件读取。
djchurch007
2015-07-09 18:20:36 +08:00
@yorkw 那如果出现了紧急问题,比如说光纤被挖断了,台风来了,需要紧急换个新的配置文件,也要走这么长的流程么
fwrq41251
2015-07-09 18:33:27 +08:00
一部分配置在项目的.propeties文件里。
一部分在数据库的表里。
数据库账号密码在应用服务器的配置里(一般开发没有机会接触生产环境的服务器)。
ipeony
2015-07-09 18:37:08 +08:00
数据源用JNDI,然后控制应用服务器访问权限
liuzhen
2015-07-09 23:18:41 +08:00
@crazyxin1988 自动化部署平台控制 与 交给svn并没有什么冲突啊
crazyxin1988
2015-07-09 23:21:57 +08:00
@liuzhen
交给自动化部署 生产环境 可以加权限控制
交给svn 那配置文件和svn的权限一起,失去意义了
liuzhen
2015-07-09 23:34:20 +08:00
@crazyxin1988 自动化部署只管编译、打包、部署的事情,恕我愚昧~ 不明白跟配置文件的版本控制有什么冲突,难不成一个配置文件一百年不变化或者不增加或者删除配置项
crazyxin1988
2015-07-10 09:09:56 +08:00
@liuzhen
编译打包 使用jenkins
自动化部署 单独的部署系统呢
liuzhen
2015-07-10 10:09:47 +08:00
@crazyxin1988 哦 环境不一样
djchurch007
2015-07-10 10:26:40 +08:00
@incompatible
@crazyxin1988
@yorkw
@loading
@fwrq41251
@ipeony
@liuzhen
谢谢各位耐心的解惑,涨姿势了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/204513

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX