getResourceAsStream()在Ubuntu失效但Windows正常的问题求助
先从最可能的原因入手排查,一步步解决你的问题:
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

