打包后Spring Boot找不到资源文件

时间:2019-01-05 15:51:55

标签: spring resources

我使用Spring boot maven插件将应用程序打包为jar文件。

它可以找到直接在Itellij IDE中运行的资源文件, 但是之后找不到资源文件,显示错误为:

java.io.FileNotFoundException:类路径资源[jmxremote.password]无法解析为绝对文件路径,因为它不驻留在文件系统中:jar:file:/home/XXX/target/YYY.jar!/ BOOT-INF / classes!/jmxremote.password

但是,jar文件中确实存在文件“ jmxremote.password”。

    private Properties initialJMXServerProperties() throws RuntimeException {
    URL passwordURL = JMXConfig.class.getClassLoader().getResource(passwordFileName);
    URL accessURL   = JMXConfig.class.getClassLoader().getResource(accessFileName);

    String passFile     = Optional.ofNullable(passwordURL).map(URL::getPath).orElseThrow(() -> new RuntimeException("JMX password file not exist"));
    String accessFile   = Optional.ofNullable(accessURL).map(URL::getPath).orElseThrow(() -> new RuntimeException("JMX access file not exist"));

    Properties properties = new Properties();
    properties.setProperty(PASSWORD_FILE_PROP, passFile);
    properties.setProperty(ACCESS_FILE_PROP, accessFile);
    return properties;
}

2 个答案:

答案 0 :(得分:1)

您不能将JAR文件作为URL加载。您必须将其加载为InputStream。

在您的情况下:

InputStream passwordInputStream = 
                 JMXConfig.class.getClassLoader().getResourceAsStream(passwordFileName);

在此处了解更多信息: Reading a resource file from within jar

答案 1 :(得分:0)

我也遇到过类似的问题。

class SomeClass{
  @Autowired
  ResourceLoader resourceLoader;

  void someFunction(){
    Resource resource=resourceLoader.getResource("classpath:preferences.json");
    Preferences defaultPreferences = objectMapper.readValue(resource.getInputStream(), Preferences.class);
 }
}

在这种情况下,我已将JSON数据映射到Preferences类。您可以使用

resource.getURL()

供进一步使用。这适用于开发环境和部署,这意味着当您在tomcat中构建和部署JAR / WAR或使用java -jar时,它也可以工作。