Spring Boot i18n配置:如何加载Jar包中的messages.properties文件?
搞定Spring Boot加载Jar包中国际化配置文件的问题
嘿,我明白你现在的困扰——自己的Spring Boot应用用了i18n,依赖的Jar包里也有messages.properties这类国际化文件,但就是加载不到对吧?其实问题出在路径前缀的小细节上,咱们改一下配置就能解决!
关键修改:用classpath*:替代classpath:
你当前用的classpath:messages只会加载主应用classpath里第一个匹配的资源,Jar包里的同名文件直接被忽略了。换成classpath*:前缀,就能让Spring扫描**所有classpath路径(包括依赖Jar的classpath)**下的对应文件。
修改后的MessageSource Bean配置是这样的:
@Bean public MessageSource messageSource() { ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); messageSource.setBasenames( "classpath*:messages" // 这行是核心!扫描所有classpath下的messages系列文件 ); messageSource.setUseCodeAsDefaultMessage(true); messageSource.setDefaultEncoding("UTF-8"); // 要是Jar包里的国际化文件叫别的名字,比如library_messages.properties,就加这行: // messageSource.addBasenames("classpath*:library_messages"); return messageSource; }
为啥这样能行?给你唠唠原理
classpath::就像只在自己家找东西,找到第一个就停了,不管邻居(Jar包)家有没有同款。classpath*::相当于挨家挨户搜,把所有classpath路径(包括主应用和所有依赖Jar)里匹配的messages.properties、messages_en.properties全找出来加载。
额外要注意的小细节
- key冲突的优先级:如果主应用和Jar包里有一模一样的国际化key,主应用的配置会覆盖Jar包的(因为主应用的资源通常会后被扫描到)。要是想让Jar包的key优先级更高,就调整一下basename的顺序:
messageSource.setBasenames( "classpath:messages", // 先加载主应用的 "classpath*:messages" // 再加载Jar包的,同名key会覆盖主应用的 ); - 不同basename的情况:要是Jar包里的国际化文件不是叫
messages开头,而是比如library_messages.properties,直接在setBasenames里加一行classpath*:library_messages就行。
这样改完,你就能正常用上Jar包里的翻译内容啦!
内容的提问来源于stack exchange,提问作者qbabor4
相关产品推荐
相关产品推荐

