You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

getResourceAsStream()在Ubuntu失效但Windows正常的问题求助

解决方案:Ubuntu下Spring Boot项目无法加载下划线开头的配置文件

先从最可能的原因入手排查,一步步解决你的问题:

1. 确认jar包中是否包含_a.properties

Windows和Linux下打包的差异很可能导致文件没被正确打进jar里。在Ubuntu终端执行这个命令查看jar的内容:

jar tf myfile.jar

看看输出里有没有_a.properties(或者如果你的config目录是资源目录,有没有config/_a.properties)。如果找不到这个文件,那问题根源就是打包时没包含该文件,直接跳到第2步调整Maven配置。

2. 调整Maven资源配置,确保下划线开头的文件被打包

Maven的资源插件默认可能会忽略某些特殊命名的文件(比如下划线开头),或者你的资源目录配置有问题。修改pom.xml的build部分,明确包含下划线开头的配置文件:

<build>
    <resources>
        <!-- 假设你的_a.properties在src/main/config目录下 -->
        <resource>
            <directory>src/main/config</directory>
            <includes>
                <include>**/*.properties</include>
                <!-- 明确指定包含下划线开头的文件 -->
                <include>**/_*.properties</include>
            </includes>
            <filtering>false</filtering> <!-- 不需要变量过滤的话设为false,避免破坏文件 -->
        </resource>
        <!-- 保留原有的resources目录配置 -->
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
            </includes>
        </resource>
    </resources>
</build>

修改后执行mvn clean package重新打包,再用jar tf命令确认文件已经在jar里了。

3. 修正资源加载路径

如果jar里的_a.properties确实在config/目录下,那你原来的路径"_a.properties"是错误的——类加载器的getResourceAsStream是从类路径根开始查找的,正确路径应该是"config/_a.properties"。Windows下能加载可能是因为IDE把config目录直接设为了资源根,但Linux下jar包的类路径结构更严格,必须使用正确的相对路径。

4. 改用Spring Boot推荐的资源加载方式

直接用类加载器加载资源兼容性较差,建议用Spring提供的ResourceLoader来加载,它对不同环境的适配更好:

import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.beans.factory.annotation.Autowired;
import java.io.InputStream;

// 在你的组件类中注入ResourceLoader
@Autowired
private ResourceLoader resourceLoader;

// 加载资源的代码
try {
    Resource resource = resourceLoader.getResource("classpath:_a.properties");
    InputStream in = resource.getInputStream();
    // 后续处理流的逻辑
} catch (IOException e) {
    e.printStackTrace();
}

5. 排查JDK版本差异

OpenJDK 10和Oracle JDK 8在类加载器处理资源的逻辑上有细微差异,你可以尝试在Ubuntu下安装JDK 8,用java -jar运行你的包,看看是否能加载成功,排除JDK版本的影响。


内容的提问来源于stack exchange,提问作者yoplay one

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:46:43