当我通过maven构建项目时,可以,但是在Tomkat进行部署时,我会遇到NullPointerException。 类,哪里可能出问题-PropertiesManager。 日志行:PropertiesManager.getApplicationProperties(PropertiesManager.java:31)
public class PropertiesManager {
private static final String PROPERTY_FILE_NAME =
"resources/application.properties";
private static PropertiesManager Instance;
private Properties properties;
private PropertiesManager() {
}
public static PropertiesManager getInstance() {
if (Instance == null) {
Instance = new PropertiesManager();
}
return Instance;
}
public Properties getApplicationProperties() {
if (properties == null) {
properties = new Properties();
try (InputStream stream = Thread.currentThread()
.getContextClassLoader()
.getResourceAsStream(PROPERTY_FILE_NAME)) {
properties.load(stream);
} catch (IOException e) {
throw new ApplicationException("Failed to load property file", e);
}
}
return properties;
}
}
和日志行:ApplicationLifecycleListener.contextInitialized(ApplicationLifecycleListener.java:14) 类ApplicationLifecycleListener:
public class ApplicationLifecycleListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
Properties applicationProperties = PropertiesManager.getInstance().getApplicationProperties();
DBManager.getInstance().initialize(applicationProperties);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
DBManager.getInstance().stopDb();
}
}
可能是什么问题?
答案 0 :(得分:1)
如果没有为文件提供确切的行,您将看到NullPointerException
(您提供的所有文件都没有日志中显示的行),则很难确定。但是有一个提示是,尽管您将要使用Maven构建的资源文件放在'<project>/src/main/resources'
文件夹中,但是在构建和打包war文件时,它将把您的应用程序资源文件放在'WEB-INF/classes'
文件夹中,即应用程序默认类路径的一部分。因此,要使用方法Thread.currentThread().getContextClassLoader().getResourceAsStream(...)
正确引用它们,您不应在文件名中添加'resources\...'
前缀,因为此方法已经在默认应用程序类路径中查找文件。删除前缀,看看它是否有效。请参考此answer以获得更多详细信息。