You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Maven依赖能否读取主项目下的properties配置文件?

问题根源

空指针报错的核心原因是注解处理器在编译阶段执行,此时项目A的src/main/resources目录内容还没有被加入到注解处理器的执行类路径中,getClass().getClassLoader().getResourceAsStream()自然找不到对应的配置文件。

解决方案

方案1:通过注解处理器编译参数传递配置(最稳妥)

注解处理器支持通过Maven编译插件传入自定义参数,直接把配置路径传给项目B的处理器,不需要依赖类路径读取:

  1. 修改项目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);
    }
}
  1. 在项目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);
    }
}
  1. 调整项目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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 22:36:03