Maven依赖能否读取主项目下的properties配置文件?
问题根源
空指针报错的核心原因是注解处理器在编译阶段执行,此时项目A的src/main/resources目录内容还没有被加入到注解处理器的执行类路径中,getClass().getClassLoader().getResourceAsStream()自然找不到对应的配置文件。
解决方案
方案1:通过注解处理器编译参数传递配置(最稳妥)
注解处理器支持通过Maven编译插件传入自定义参数,直接把配置路径传给项目B的处理器,不需要依赖类路径读取:
- 修改项目B的
PropertyReader,支持接收外部传入的流:
public class PropertyReader { private final Properties properties; // 新增构造方法,接收外部传入的配置流 public PropertyReader(InputStream is) throws IOException { this.properties = new Properties(); this.properties.load(is); } public String getProperty(String propertyName) { return this.properties.getProperty(propertyName); } }
- 在项目B的注解处理器主类中接收编译参数,读取配置:
@Override public synchronized void init(ProcessingEnvironment processingEnv) { super.init(processingEnv); // 获取Maven传入的配置文件路径参数 String configPath = processingEnv.getOptions().get("projectB.configPath"); try (InputStream is = new FileInputStream(configPath)) { PropertyReader reader = new PropertyReader(is); } catch (IOException e) { throw new RuntimeException("读取projectB配置失败", e); } }
- 调整项目A的
pom.xml,给编译插件增加参数配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <annotationProcessorPaths> <!-- 原有项目B的注解处理器依赖配置 --> <path> <groupId>com.example</groupId> <artifactId>project-b</artifactId> <version>1.0.0</version> </path> </annotationProcessorPaths> <compilerArgs> <!-- 传入项目A中配置文件的绝对路径 --> <arg>-AprojectB.configPath=${project.basedir}/src/main/resources/projectB.properties</arg> </compilerArgs> </configuration> </plugin>
方案2:将项目A的resources目录加入编译期类路径
如果不想修改项目B的代码,可以直接在项目A的编译配置中把resources目录加到注解处理器的类路径:
<annotationProcessorPaths> <!-- 原有项目B的注解处理器依赖配置 --> <path> <groupId>com.example</groupId> <artifactId>project-b</artifactId> <version>1.0.0</version> </path> <!-- 追加项目A的resources目录到类路径 --> <path> <groupId>org.apache.maven</groupId> <artifactId>maven-model</artifactId> <version>${maven.version}</version> <explicitArtifactItems> <explicitArtifactItem> <path>${project.basedir}/src/main/resources</path> </explicitArtifactItem> </explicitArtifactItems> </path> </annotationProcessorPaths>
注意:该方案兼容性较差,不同Maven版本、IDE的表现可能不一致,优先推荐方案1。
方案3:配置文件内置到项目B(仅适用固定配置场景)
如果projectB.properties是通用固定配置,不需要每个接入项目自定义,直接把配置文件放到项目B的src/main/resources目录下打包即可,项目B可以直接读取到自身jar包内的配置,不需要项目A提供。
内容的提问来源于stack exchange,提问作者Nils Walker
相关产品推荐
相关产品推荐

