谁动了我的心弦 2024-03-29 21:18 采纳率: 0%
浏览 152

springboot打包jar centos无法读取外部yml配置文件

springboot maven打包的jar 打包好的jar内是有application.yml
这是jar包解压后内部BOOT-INF\classes内的文件结构

img

在config文件夹内还有一个application.yml 这个文件是在pom中通过resource标签引入的

<resource>
   <directory>../conf/devCommons</directory>
      <includes>
        <include>**/*.yml</include>
      </includes>
</resource>

因为服务器环境跟开发环境的不同 上传到centos后 我想通过jar外部的yml类覆盖掉jar包内的yml配置
可是发现我在在jar同级目录下的application.yml配置文件压根不起作用 依然只会读取jar包内的yml配置
但在Windows下测试是可以正常读取jar包外的application.yml配置文件

application.yml文件就是配置了数据库连接等参数 代码内也不是通过什么Properties类来读取yml进行配置
就是单纯使用的spring框架配置

spring:
  datasource:
    url:jdbc:mysql://localhost:3306/xxxxxxx
    username: xxx
    password:xxxxx

我找了很多资料 有说使用-Dspring.config.location 我试过了也没用
centos下文件的权限都给过的 为了测试这个问题 jar包括yml文件都是777 肯定不会存在权限的问题
现在我不知道问题到底出在哪 windows下测试是可以正常读取jar包外的yml 但centos下就跟没作用一样

  • 写回答

6条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-03-29 21:18
    关注

    引自免费微信小程序:皆我百晓生

    在 CentOS 环境下,如果你想要在 .jar 包中的 .application.yml 文件中使用外部 application.yml 文件的内容,并且不想覆盖或改变当前目录下的 .application.yml 文件的内容,你可以尝试以下几个步骤:

    1. **首先,确保 .application.yml文件被正确地添加到了.jar包的目录。在资源文件 (.maven) 中,通常包含一个模块,用于加载外部 YAML 配置文件。你需要将application.yml文件的路径指定为这个模块的directory` 属性,例如:
    <resource>
       <directory>src/main/resources/conf/devCommons</directory>
          <includes>
            <include>**/*.yml</include>
          </includes>
    </resource>
    
    1. **接下来,在运行 .jar包时,添加-Dspring.config.location 参数。这会告诉 Spring 利用 .application.yml 文件的位置。例如:
    mvn spring-boot:run -Dspring.config.location=classpath:/my-app/conf/devCommons/application.yml
    

    在命令行中,.application.yml 文件所在的路径将会替换为 -Dspring.config.location 的值。

    1. **测试 Windows 下的 application.yml 文件是否能被读取。你可以在命令行中通过查看依赖于 application.ymlorg.springframework.boot:spring-boot-starter-weborg.springframework.boot:spring-boot-autoconfigure 组件的输出来确认这个配置是否生效:
    mvn spring-boot:run -Dspring.config.location=/path/to/my-app/conf/devCommons/application.yml
    

    在这个命令中,/path/to/my-app/conf/devCommons 是你提供的路径,即 .application.yml 文件所在的目录。

    1. 如果在 Windows 下没有看到 application.yml 文件被正确加载并覆盖,可能存在以下几种可能的原因:
    • Windows 操作系统的默认信任环境(信任环境中)禁止从 Internet 加载外部文件。
    • .application.yml 文件没有正确的权限,没有足够的访问权限来读取 application.yml 文件。
    • Windows 下的用户可能无意间阻止了 application.yml 文件的加载。
    • 在 Windows 下的程序自身或者脚本有可能误操作导致 application.yml 文件被修改或者删除。

    要解决这些问题,以下是一些具体的步骤:

    • **检查 Windows 操作系统的信任环境设置。如果允许从 Internet 加载外部文件,可以启用 Windows 防火墙、文件系统权限管理等安全设置。查找并禁用可能阻止 application.yml 文件加载的软件或服务。”

    • **确认 .application.yml文件具有足够的权限。查看应用程序所在项目中的配置文件,确定该配置文件拥有足够的权限来读取application.yml文件。通常情况下,配置文件应位于应用启动点所在的目录下,如src/main/resources/conf或者/etc目录,而不是应用项目的直接目录。如果application.yml文件在src/main/resources/conf` 目录下,你需要确保其父目录有足够的权限来读取它。

    • **尝试在命令行中使用 chmod +x 命令对 application.yml 文件进行权限更改,增加其可读属性。例如:

    chmod +x application.yml
    

    注意:此命令仅用于保证 application.yml 文件的可读性,不保证文件内容会被正确处理或覆盖。如果你想强制修改或删除 application.yml 文件内容,你需要使用更复杂的工具或者文件操作方式,比如使用 sedawk 或其他文本编辑器操作,而不应该简单地覆盖 application.yml 文件本身。

    • **若以上方法都无法解决问题,可能是由于文件结构问题导致的。例如,文件名可能会导致 spring-boot:run 配置项无法找到文件。检查 application.yml 文件的文件名是否符合预期,以及 .jar包及其依赖包的命名规则。确保application.yml文件与.jar` 包的包名和扩展名匹配,同时遵守 Apache 的 Maven 规范,即命名规范中不允许使用空格、反斜杠和特殊字符。

    • **确保 Dockerfile 或 Gradle 插件在 application.yml 文件引用前已被正确创建或添加到构建过程。一些容器化工具(如 Docker、Kubernetes)或依赖库插件可能在编译或部署过程中自动忽略或忽略 .application.yml 文件。

    • **测试添加 application.yml 文件后的行为。通过运行基于 application.yml 的依赖注入容器(如 JBoss EAP、Wildfly 或 other container frameworks),观察应用程序的行为变化,确保正确设置了 application.yml 文件的依赖关系和配置信息。

    • **如果所有上述方法都无法解决问题,建议查阅相关文档、咨询 Spring Boot 头部团队或分析你的运行时错误日志,找出具体的问题源头并采取相应的修复措施。

    总之,了解 CentOS 环境下读取外部 YAML 文件的基本流程,通过配置 <resource> 模块并使用 -Dspring.config.location 参数加载 application.yml 文件,以及检查默认信任环境设置和文件权限,可以解决读取外部 YAML 文件的问题。然而,对于更复杂的情况,可能需要深入理解 Dockerfile、Gradle 插件的配置和工作原理,以及可能出现的异常情况和处理策略。始终使用完整代码或模拟图作为示例,并遵循相关的 Java 技术指南和最佳实践来确保解决方案的有效性和可靠性。在不确定的情况下,最好参考官方文档、Stack Overflow 或线上社区的解答,以便获取更准确和针对性的帮助。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月29日