将exec-maven-plugin绑定到Maven阶段后执行报错求助
问题根源分析
这个问题的核心是Maven执行上下文的classpath差异,以及生命周期阶段执行顺序带来的资源加载问题:
- 当你最初没有绑定
exec-maven-plugin到任何生命周期阶段时,执行mvn exec:java会让Maven自动触发必要的前置阶段(比如process-resources),这个阶段会把src/main/resources下的配置文件复制到target/classes目录,Spring Boot应用会从classpath的这个目录加载配置,所以能正常解析${cnp.application.acronym}。 - 当你添加了
<execution>绑定到generate-resources阶段后,直接执行mvn exec:java时,Maven不会再自动触发process-resources等前置阶段——它只会直接运行exec:java目标,此时src/main/resources的配置文件还没被复制到classpath中,Spring Boot启动时自然找不到对应的配置项,抛出占位符解析失败的错误。
解决方案
根据你的需求,有几种可行的解决方式:
1. 执行时先触发资源处理阶段
如果你还是想通过mvn exec:java命令手动执行代码生成,可以先让Maven完成资源复制:
mvn process-resources exec:java
process-resources阶段会把src/main/resources的文件复制到classpath目录,确保Spring能加载到配置。
2. 给exec插件添加额外classpath
在插件的<configuration>中显式添加src/main/resources到classpath,这样即使没执行process-resources,Spring也能直接从源码目录加载配置:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <executions> <execution> <id>codegeneration</id> <phase>generate-resources</phase> <goals><goal>java</goal></goals> </execution> </executions> <configuration> <mainClass>com.codegenerator.CodeGeneratorApplication</mainClass> <!-- 添加额外classpath元素 --> <additionalClasspathElements> <additionalClasspathElement>src/main/resources</additionalClasspathElement> </additionalClasspathElements> </configuration> </plugin>
3. 通过生命周期阶段执行代码生成
既然你已经把代码生成绑定到了generate-resources阶段,推荐直接执行Maven的生命周期命令来触发它:
mvn generate-resources
Maven会自动执行generate-resources之前的所有必要阶段(包括process-resources),确保配置文件已准备好,代码生成任务能正常运行。
内容的提问来源于stack exchange,提问作者Yashu
相关产品推荐
相关产品推荐

