如何解决JEE应用部署到Wildfly 25时出现的java.io.FileNotFoundException错误
问题原因
报错核心是文件写入权限不足,和Wildfly的Domain/Standalone运行模式无关,由两种启动方式的运行身份、工作目录差异导致:
- 你配置的JPA schema生成规则指定了输出
productDrop.ddl、productCreate.ddl两个脚本,使用相对路径时,文件默认写入Wildfly进程的当前工作目录。 - 手动执行
standalone.sh启动时,进程使用你当前登录的操作系统用户运行,工作目录为你执行脚本的路径,该用户对目录有写权限,因此可以正常生成文件。 - 通过
systemctl启动Wildfly服务时,进程默认使用专属的wildfly系统用户运行,默认工作目录为Wildfly的安装目录(通常为/opt/wildfly),该目录默认权限仅允许root用户写入,wildfly用户没有写权限,因此写入脚本时抛出权限拒绝错误。
解决思路
方案1(推荐,适用于生产环境)
移除自动导出ddl脚本的配置,不需要生成文件即可避免权限问题:
删除persistence.xml中的以下两行配置即可:
<property name ="javax.persistence.schema-generation.scripts.action" value="drop-and-create"></property> <property name ="javax.persistence.schema-generation.scripts.create-target" value="productCreate.ddl"></property> <property name ="javax.persistence.schema-generation.scripts.drop-target" value="productDrop.ddl"></property>
也可以将javax.persistence.schema-generation.scripts.action的value改为none,效果一致。
方案2(适用于需要保留ddl导出的场景)
将脚本输出路径改为绝对路径,指向wildfly用户有写入权限的目录:
- 新建专属目录用于存储导出的ddl文件,示例:
mkdir /opt/wildfly/ddl chown -R wildfly:wildfly /opt/wildfly/ddl
- 修改
persistence.xml中的路径配置为绝对路径:
<property name ="javax.persistence.schema-generation.scripts.create-target" value="/opt/wildfly/ddl/productCreate.ddl"></property> <property name ="javax.persistence.schema-generation.scripts.drop-target" value="/opt/wildfly/ddl/productDrop.ddl"></property>
内容的提问来源于stack exchange,提问作者Tel lui
相关产品推荐
相关产品推荐

