答案是通过@parameter expression和@component注解注入上下文对象与服务组件。需用@parameter expression="${project}"等注入MavenProject、MavenSession等运行时对象,用@component注入ArtifactFactory、RepositorySystem等服务组件,并在execute()中安全访问,禁止使用已废弃的getPluginContext()方法。

在Maven插件开发中,Mojo需要访问当前构建的项目信息、生命周期阶段、仓库配置等运行时环境,否则无法动态适配不同项目的构建行为。
通过@parameter expression注入核心上下文对象
在Mojo类中声明字段,使用@parameter expression注解绑定Maven内置表达式:
第一步:添加@parameter expression="${project}"注解,注入MavenProject实例——它封装了pom.xml解析结果、模块结构、依赖列表、构建目录等全部项目元数据。
第二步:添加@parameter expression="${session}"注解,获取MavenSession——这是整个构建会话的中枢,包含当前生命周期阶段、执行目标(goal)、插件管理器、仓库策略等关键状态。
第三步:添加@parameter expression="${mojoExecution}"注解,拿到MojoExecution对象——可读取该插件执行时的配置参数、绑定的生命周期阶段、以及原始XML配置片段。这一步必须做,否则无法区分同一插件在不同<execution>块中的差异化行为。
【expression必须用双引号包裹,且${}内不能有空格,否则注入失败】
通过@component注入Maven服务组件
方法一:注入ArtifactFactory——用于创建Artifact对象,解析坐标(groupId/artifactId/version)并生成本地路径。此组件不可手动new,必须由Maven容器提供。
方法二:注入RepositorySystem——操作远程仓库,比如查询依赖是否存在、解析SNAPSHOT版本的真实时间戳。没有它,插件无法实现离线判定或仓库同步逻辑。
方法三:注入MavenProjectBuilder——按需加载其他模块的MavenProject,适用于多模块项目中跨模块分析场景。注意:该对象已标记为@Deprecated,新项目应改用MavenSession.getProjects()替代。
在execute()中安全访问上下文
直接调用getPluginContext()返回null——这个方法已被废弃,且不保证返回有效值,强行使用会导致NPE。
正确做法是:所有注入字段必须声明为private,且不能加final修饰符;Maven会在执行前自动完成赋值。若字段仍为null,请检查类是否被@Mojo正确标注,且未被Spring等外部容器接管。
验证注入是否成功:在execute()开头打印project.getArtifactId()和session.getCurrentPhase()。如果输出为空或抛出NullPointerException,说明注入失败,需回溯注解写法或pom.xml中插件配置的<configuration>层级是否破坏了默认注入链。


















