ํ์ฌ ์งํํ๊ณ ์๋ ํ๋ก์ ํธ ๊ฐ๋ฐ์๋ฒ๋ฅผ ๋์ปค์ jar ํ์ผ๋ก ์ด๋ฏธ์งํ ์์ผ์ ๋์ฐ๊ณ ์๋ค.
๋ฌธ์ ์์ด ์งํ๋๊ณ ์์๋๋ฐ, ๊ฐ๋ณ๊ฒ ์๊ฐํ๋ resource ํ์ผ ์์ ์๋ .dat ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ฝ์ด์ค๋ ๊ณผ์ ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๐ ๋ฌธ์ ๋ฐ์ ๋ด์ฉ
local์์๋ ๋ฌธ์ ์์ด ํด๋น ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ ์ฝ์ด์ค๋๋ฐ, ๋ฐฐํฌํ .jar ํ์ผ์์๋ ํด๋น ํ์ผ์ด ์กด์ฌํ์ง ์๋๋ค๋ FileNotFoundException ์๋ฌ๊ฐ ๊ณ์ ๋ํ๋ฌ๋ค.๐ฟ๐ฟ๐ฟ
์ฒ์์ .properties์ ๊ฒฝ๋ก๋ฅผ ์ค์ ํด๋์๋๋ฐ ์ด๊ฒ ์๋ชป๋๊ฑด๊ฐ ์ถ์ด์ ์์ ํด๋ณด์๋ค.
ํ์ง๋ง ์คํจํ๊ณ ๊ตฌ๊ธ๋ง ํ์ ๋ getClass().getURL()
๋๋ getClass().getClassLoader().getURL()
์ด๋ฐ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ ์ฌ๋๋ค๋ ์์ด์ ๋๋ ์ ์ฉํด๋ณด์์ง๋ง ์ด ๋ฐฉ๋ฒ ์ญ์ ์คํจ๐ฅ
์ฒ์๋ถํฐ ๋ค์ ์๊ฐํด๋ณด์๋ ์๊ฐ์ผ๋ก ๋ฐฐํฌํ .jar ํ์ผ์ ๋ํ ๋ฃจํธ ๊ฒฝ๋ก log๋ฅผ ํ์ธํด๋ดค๋ค.
๐ jar:file:/api.jar!/BOOT-INF/classes!/
๊ทธ๋์ BOOT-INF/classes๋ฅผ classpath๋ผ๊ณ ์๊ฐํด ์ฌ๊ธธ ๊ธฐ์ค์ผ๋ก ์ก๊ณ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ผ๋ ค ํ์ง๋ง ๋ ์คํจ!
๊ตฌ๊ธ๋ง ํด๋ณด๋ ์์ค์ฝ๋๊ฐ ์ฌ๋ผ๊ฐ๊ธฐ ์ Spring์ด ์ฌ๋ผ๊ฐ๊ณ ์ด ๋ Spring์ด ๋ฏธ๋ฆฌ resources์ ์์น๋ฅผ ์ก์์ค์ ๊ทธ๋ฐ๊ฒ ์๋๊น ์ถ๋ค๐ฉ
ClassPathResource๋ฅผ ์ฌ์ฉํด๋ณด๋ผ๋ ๋ง์ resource.getPath()๋ก ํด๋น ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ฐพ์๋ณด๋ ค๊ณ ํ๋ค.
ClassPathResource resource = new ClassPathResource("folder/resourceFile.dat");
String path = resource.getPath();
ํ์ง๋ง classpath + folder/resourceFile.dat์ผ๋ก ์์ ์งํํ ๊ฒ๊ณผ ๋์ผํ ํ
์คํธ๋ฅผ ์งํํ ๊ผด์ด ๋์ด ๋ ๋ค์ ์คํจํ๊ณ ๋ง์๋ค.
๐ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
์ ๋ง ๋ง์ ์๋ ๋์ ๋๋์ด ๊ฒฝ๋ก๋ฅผ ์ฐพ์๋ค!! ๋ง์ธ๐
InputStream inputStream = new ClassPathResource("folder/resourceFile.dat").getInputStream();
File file =File.createTempFile("resourceFile",".dat");
try {
FileUtils.copyInputStreamToFile(inputStream, file);
} finally {
IOUtils.closeQuietly(inputStream);
}
jarํ์ผ์ class file, resource์ nested jar๋ค๋ก ๊ตฌ์ฑ๋์ด ์๋๋ฐ ์ฌ๊ธฐ์ resource์ URL์ ์๋จ .jar ๋ฃจํธ ๊ฒฝ๋ก๋ฅผ ์ฐธ๊ณ ํด๋ณด๋ฉด jar://
๋ก ์์ํ๋ ์ฃผ์๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค.
๋ก์ปฌ๋ก ์คํํ์ ๋ ์ค์ resource ํ์ผ์ธ file://
ํ๋กํ ์ฝ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ File ๊ฐ์ฒด๋ฅผ ์์ฑํด ์ค ์ ์์ด ํด๋น ๊ฒฝ๋ก๋ฅผ ์ฐพ์์ฌ ์ ์์๊ณ , .jar ํ์ผ์ ํด๋น ๊ฒฝ๋ก๋ฅผ ์ฐพ์์ฌ ์ ์์๋ ๊ฒ์ด์๋ค!
๋ฐ๋ผ์, classloader์๊ฒ ์ฒ๋ฆฌ๋ฅผ ์์ํ ํ InputStream์ ํตํด ์ฒ๋ฆฌํ๋ค.
// ํ๊ฒฝ ๋ณ์๋ก ์ง์ ๋ tmp ๋๋ ํ ๋ฆฌ์ ์๋์ผ๋ก ์์ ํ์ผ์ ์์ฑ์ํจ๋ค.
File.createTempFile(prefix, suffix)
// InputStream์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ์์ ํ์ผ๋ก ์จ์ค๋ค.
FileUtils.copyInputStreamToFile(inputStream, tempFile)
์ ๋ง ์ฌ๋ฌ๋ฒ์ ๊ตฌ๊ธ๋ง๊ณผ ๋ง์ ์๋ ๋์ ํด๊ฒฐํ ๊ฒฝ๋ก ์ฐพ๊ธฐ์๋ค.๐
์ญ์ ๊ฐ๋ฐ์ ์ด๋ ต๊ณ ๊ณต๋ถํ ๊ฒ์ด ๋ง์ง๋ง, ํด๊ฒฐํ๊ณ ๋๋ฉด ๋๋ฌด ํ๋ณตํ๋ค. ์ผํธ๐๐๐
๊ฐ์ฌํฉ๋๋ค ๋๋ถ์ ํด๊ฒฐํ์ต๋๋ค