如何在Maven中让依赖Jar与主项目Jar正确读取各自的config.properties
解决方案与配置建议
问题根源
两个项目的config.properties文件名相同且都放在resources根目录,当A-secondary依赖A-primary时,classpath中同名资源会被后加载的模块(A-secondary)覆盖,导致始终读取自身的配置。
一、A-primary的配置调整(二选一即可)
1. 给配置文件指定专属包路径
将A-primary的config.properties移动到专属包路径下,比如:
A-primary/src/main/resources/com/yourcompany/aprimary/config.properties
这样资源的完整classpath路径唯一,不会与A-secondary的根目录配置冲突。
2. 重命名配置文件
直接修改A-primary的配置文件名,比如改为aprimary-config.properties,确保文件名在classpath中唯一。
二、A-secondary的读取方式
根据你使用的读取方式,对应调整:
- Java原生ClassLoader读取:指定完整资源路径,比如:
// 对应包路径方案 InputStream is = getClass().getClassLoader().getResourceAsStream("com/yourcompany/aprimary/config.properties"); // 对应重命名方案 InputStream is = getClass().getClassLoader().getResourceAsStream("aprimary-config.properties"); - Spring/Spring Boot环境:使用
@PropertySource指定具体资源位置:// 包路径方案 @PropertySource("classpath:com/yourcompany/aprimary/config.properties") // 重命名方案 @PropertySource("classpath:aprimary-config.properties")
三、符合Maven设计原则的配置架构参考
- 遵循约定大于配置:避免在
resources根目录放置通用名称的配置文件,不同模块的配置应放在各自的包路径下,这是Maven资源管理的核心约定之一。 - 模块职责单一:A-primary作为依赖模块,应明确暴露自身的配置资源路径,不依赖根目录的默认资源;A-secondary仅负责读取自身私有配置和依赖模块的指定公共配置。
- 资源分类管理:将跨模块共享的配置抽离到父模块或专门的配置模块,私有配置留在各自模块,从根源避免资源冲突。
- 使用Maven资源插件管控打包:在A-primary的
pom.xml中配置maven-resources-plugin,确保资源被打包到指定路径,避免意外覆盖:<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.3.1</version> <configuration> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>com/yourcompany/aprimary/**/*</include> </includes> </resource> </resources> </configuration> </plugin> </plugins> </build>
内容的提问来源于stack exchange,提问作者Kuengaer
相关产品推荐
相关产品推荐

