
Maven 默认不会用命令行 -D 参数覆盖 pom.xml 中硬编码的 <configuration> 值;要支持覆盖,必须将配置项绑定到可被外部重写的 Maven 属性(如 ${sourcePath}),而非直接写死值。
maven 默认不会用命令行 `-d` 参数覆盖 `pom.xml` 中硬编码的 `
在 Maven 构建生命周期中,插件配置(<configuration>)的解析发生在项目模型(POM)加载阶段,此时所有表达式(如 ${project.basedir})会被立即求值并固化为字符串常量。这意味着:
- 若 pom.xml 中直接写 <sourcePath>C:/src/main/java/</sourcePath> 或 <sourcePath>${project.basedir}/src/main/java/</sourcePath>,该值在插件执行前就已确定,命令行 -DsourcePath=... 将被完全忽略;
- 只有当配置项显式引用一个未在 POM 中定义的属性占位符(如 <sourcePath>${sourcePath}</sourcePath>)时,Maven 才会在运行时尝试从命令行、settings.xml 或 pom.xml 的 <properties> 中查找该属性值,并按 Maven 属性优先级规则 进行解析(命令行 -D 优先级最高)。
✅ 正确做法:在 pom.xml 中通过 <properties> 定义默认值,并在 <configuration> 中引用该属性:
<properties>
<!-- 可被命令行 -DsourcePath 覆盖 -->
<sourcePath>${project.basedir}/src/main/java/com/core/</sourcePath>
<!-- 可被命令行 -DoutputPath 覆盖 -->
<outputPath>C:/Projects</outputPath>
</properties>
<plugin>
<groupId>com.directory.maven.plugins</groupId>
<artifactId>javadoc-generator-maven-plugin</artifactId>
<version>1.2.0-SNAPSHOT</version>
<configuration>
<sourcePath>${sourcePath}</sourcePath>
<outputPath>${outputPath}</outputPath>
</configuration>
<executions>
<execution>
<goals>
<goal>javadoc</goal>
</goals>
</execution>
</executions>
</plugin>这样,执行以下命令即可成功覆盖配置:
mvn javadoc-generator:javadoc \ -DsourcePath="C:/Projects/my_project/src/main/java/com/core/" \ -DoutputPath="C:/Projects/tmp"
⚠️ 注意事项:
- 不要混用同名属性与插件 @Parameter(property = "xxx") 中的 property 名——这是推荐做法(如本例中 @Parameter(property = "sourcePath") 与 <sourcePath>${sourcePath}</sourcePath> 保持一致),能确保语义清晰且兼容性最佳;
- 若插件代码中 @Parameter 的 property 名与 POM 中属性名不一致(如 property = "mySource" 但 POM 写 ${sourcePath}),则覆盖失效;
- defaultValue(如 @Parameter(defaultValue = "."))仅在 POM 中完全未配置该参数且命令行也未提供 -D 时生效,它不参与属性覆盖逻辑。
总结:Maven 插件参数的“可覆盖性”取决于 POM 配置是否采用属性占位符形式。将默认值移至 <properties> 并在 <configuration> 中引用,是兼顾默认行为与灵活覆盖的标准实践。

















