在Spring Boot中從類路徑加載文件
在下面,您將找到在WAR和JAR中加載文件的解決方案。
資源加載器
使用Java,您可以使用當(dāng)前線程的classLoader并嘗試加載文件,但是Spring Framework為您提供了更為優(yōu)雅的解決方案,例如ResourceLoader。
您只需要自動連接ResourceLoader,然后調(diào)用getResource(„somePath“)方法即可。
在Spring Boot(WAR)中從資源目錄/類路徑加載文件的示例
在以下示例中,我們從類路徑中加載名為GeoLite2-Country.mmdb的文件作為資源,然后將其作為File對象檢索。
- @Service("geolocationservice")
- public class GeoLocationServiceImpl implements GeoLocationService {
- private static final Logger LOGGER = LoggerFactory.getLogger(GeoLocationServiceImpl.class);
- private static DatabaseReader reader = null;
- private ResourceLoader resourceLoader;
- @Autowired
- public GeoLocationServiceImpl(ResourceLoader resourceLoader) {
- this.resourceLoader = resourceLoader;
- } @PostConstruct
- public void init() {
- try {
- LOGGER.info("GeoLocationServiceImpl: Trying to load GeoLite2-Country database...");
- Resource resource = resourceLoader.getResource("classpath:GeoLite2-Country.mmdb");
- File dbAsFile = resource.getFile(); // Initialize the reader
- reader = new DatabaseReader
- .Builder(dbAsFile)
- .fileMode(Reader.FileMode.MEMORY)
- .build();
- LOGGER.info("GeoLocationServiceImpl: Database was loaded successfully.");
- } catch (IOException | NullPointerException e) {
- LOGGER.error("Database reader cound not be initialized. ", e);
- }
- }
- @PreDestroy
- public void preDestroy() {
- if (reader != null) {
- try {
- reader.close();
- } catch (IOException e) {
- LOGGER.error("Failed to close the reader.");
- }
- }
- }
- }
在Spring Boot(JAR)中從資源目錄/類路徑加載文件的示例
如果您想從Spring Boot JAR中的 classpath加載文件,則必須使用該resource.getInputStream()方法將其作為InputStream檢索。如果嘗試使用resource.getFile()該方法,則會收到錯誤消息,因為Spring嘗試訪問文件系統(tǒng)路徑,但無法訪問JAR中的路徑。
- @Service("geolocationservice")
- public class GeoLocationServiceImpl implements GeoLocationService {
- private static final Logger LOGGER = LoggerFactory.getLogger(GeoLocationServiceImpl.class);
- private static DatabaseReader reader = null;
- private ResourceLoader resourceLoader;
- @Inject
- public GeoLocationServiceImpl(ResourceLoader resourceLoader) {
- this.resourceLoader = resourceLoader;
- } @PostConstruct
- public void init() {
- try {
- LOGGER.info("GeoLocationServiceImpl: Trying to load GeoLite2-Country database...");
- Resource resource = resourceLoader.getResource("classpath:GeoLite2-Country.mmdb");
- InputStream dbAsStream = resource.getInputStream(); // <-- this is the difference
- // Initialize the reader
- reader = new DatabaseReader
- .Builder(dbAsStream)
- .fileMode(Reader.FileMode.MEMORY)
- .build();
- LOGGER.info("GeoLocationServiceImpl: Database was loaded successfully.");
- } catch (IOException | NullPointerException e) {
- LOGGER.error("Database reader cound not be initialized. ", e);
- }
- }
- @PreDestroy
- public void preDestroy() {
- if (reader != null) {
- try {
- reader.close();
- } catch (IOException e) {
- LOGGER.error("Failed to close the reader.");
- }
- }
- }
- }