我使用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;
}
答案 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时,它也可以工作。