报错信息:Could not resolve placeholder 'project.build.testOutputDirectory'

本文分享了一位开发者在学习《Maven实战》过程中遇到的关于资源文件路径配置错误的问题及解决方案。通过调整pom.xml文件中testResource的directory属性指向src/main/resources目录,并开启资源过滤,成功解决了Maven无法解析${project.build.testOutputDirectory}

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习《Maven实战》这门课程时,出现如题所示的错误,在网上找了好久解决方案都没找到什么原因,最后被自己无意间的一个想法给处理掉了这个问题。

错误位置:persist.file=${project.build.testOutputDirectory}/persist.xml

程序报错提示不能解析${project.build.testOutputDirectory}

之后再网上找到说要在pom.xml中配置资源过滤,不然无法解析。

看到这句时,一直没理解,之后对比pom.xml中的所有代码,就发现有一处不对劲,更改后错误就不在提示了。

pom.xml:

<build>
  	<testResources>
  		<testResource>
  			<directory>src/test/resources</directory>
  			<filtering>true</filtering>
  		</testResource>
  	</testResources>
</build>

项目工程:


于是将pom.xml更改为:

<build>
  	<testResources>
  		<testResource>
  			<directory>src/main/resources</directory>
  			<filtering>true</filtering>
  		</testResource>
  	</testResources>
</build>

### Nacos 中 `server.port` 占位符无法解析的原因分析 在 Spring Boot 应用程序中集成 Nacos 配置管理时,如果遇到 `java.lang.IllegalArgumentException: Could not resolve placeholder 'server.port'` 的错误,通常是因为应用程序尝试加载外部配置文件中的占位符变量(如 `${server.port}`),但在运行时未能成功解析该占位符。 以下是可能的原因以及解决方案: #### 1. **Nacos 配置优先级问题** Spring Boot 加载配置的顺序决定了最终生效的配置项。默认情况下,Spring Boot 按照以下顺序加载配置: - 默认属性 (`@EnableAutoConfiguration`) - `application.properties` 或 `application.yml` - 外部化配置源(如 Nacos) 如果 `server.port` 在 Nacos 配置中心被定义,但其加载时间晚于 Spring Boot 初始化阶段,则可能导致占位符未被及时替换而抛出异常[^1]。 #### 2. **占位符未正确定义** 检查 Nacos 配置中心是否正确设置了 `server.port` 属性。例如,在 Nacos 控制台中创建了一个 Data ID 对应的应用配置文件,需确认其中是否存在如下内容: ```properties server.port=8080 ``` 如果没有显式设置此值,或者键名拼写有误,都会导致解析失败。 #### 3. **Bootstrap 阶段加载延迟** 为了确保 Nacos 配置能够早于其他组件初始化完成加载,建议将相关依赖加入到 `bootstrap.yml` 文件而非普通的 `application.yml` 文件中。这是因为 `bootstrap.yml` 是专门用于引导上下文加载远程配置的地方,它的执行优先级高于常规配置文件。 示例 `bootstrap.yml` 配置: ```yaml spring: application: name: your-service-name cloud: nacos: discovery: server-addr: localhost:8848 config: server-addr: localhost:8848 file-extension: properties ``` #### 4. **环境变量覆盖冲突** 某些场景下,操作系统级别的环境变量可能会干扰应用内部设定的端口号。例如,Linux 系统可能存在名为 `SERVER_PORT` 的全局变量,默认会覆盖掉 Spring Boot 自动分配给 `server.port` 的值。这种行为也可能引发类似的解析问题。 可以通过命令行参数指定明确的端口来规避此类风险: ```bash java -Dserver.port=8080 -jar your-application.jar ``` #### 5. **代码层面强制赋值** 作为最后一种补救措施,可以在项目启动类中手动为 `server.port` 设置一个默认值以防止潜在的风险: ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class YourApplication { public static void main(String[] args) { System.setProperty("server.port", "8080"); SpringApplication.run(YourApplication.class, args); } } ``` --- ### 总结 当面对 `Could not resolve placeholder 'server.port'` 类型的错误时,可以从以下几个方面逐一排查并解决问题: - 确认 Nacos 数据库中已存在对应的 `server.port` 参数; - 调整配置加载时机至更早期阶段(推荐使用 `bootstrap.yml`); - 排查是否有外部因素影响到了预期的行为逻辑;必要时采用硬编码方式兜底处理。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值