vincent zhang
vincent zhang

Reputation: 454

Spring boot can not find resource file after packaging

I use Spring boot maven plugin to package application as jar file.

It can find the resource file direct run in Itellij IDE, But it can not find resource file after, it display error as :

java.io.FileNotFoundException: class path resource [jmxremote.password] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/home/XXX/target/YYY.jar!/BOOT-INF/classes!/jmxremote.password

However, the file "jmxremote.password" indeed exist in the jar file.

    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;
}

Upvotes: 3

Views: 6690

Answers (3)

ShakingJ
ShakingJ

Reputation: 1

    parameters = parameters == null ? new HashMap<>(1) : parameters;
    ApplicationHome h = new ApplicationHome(getClass());
    File jarF = h.getSource();
    String reportPath = "jasperreports" + File.separator + client + File.separator + module + File.separator + jrxml + ".jrxml";
    String realReportPath = jarF.getParentFile().toString() + File.separator + reportPath;
    File reportFile = new File(realReportPath);
    InputStream inputStream;
    if (reportFile.exists()) {
        inputStream = new FileInputStream(reportFile);
    }else {
        ClassPathResource resource = new ClassPathResource(reportPath);
        //Compile to jasperReport
        inputStream = resource.getInputStream();
    }

Upvotes: 0

sajal rajabhoj
sajal rajabhoj

Reputation: 517

I have also faced similar issue.

class SomeClass{
  @Autowired
  ResourceLoader resourceLoader;

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

In this case, I have mapped JSON data to the Preferences class. In your case, you may use

resource.getURL()

for further use. This works for both the development environment and deployment, means it also works when you build and deploy JAR/WAR in tomcat or use java -jar.

Upvotes: 1

Simon Martinelli
Simon Martinelli

Reputation: 36163

You cannot load the file from a JAR as URL. You have to load it as an InputStream.

In your case:

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

Read more about here: Reading a resource file from within jar

Upvotes: 5

Related Questions