Для этого вы можете использовать CodeSource#getLocation()
. CodeSource
доступно для ProtectionDomain#getCodeSource()
. ProtectionDomain
в свою очередь доступен по Class#getProtectionDomain()
.
URL location = getClass().getProtectionDomain().getCodeSource().getLocation();
File file = new File(location.getPath());
// ...
Возвращает точное местоположение Class
, о котором идет речь.
Обновление : согласно комментариям, оно, очевидно, уже находится в пути к классам. Затем вы можете просто использовать ClassLoader#getResource()
, в котором вы передаете относительный путь к корневому пакету.
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
URL resource = classLoader.getResource("filename.ext");
File file = new File(resource.getPath());
// ...
Вы даже можете получить его как InputStream
, используя ClassLoader#getResourceAsStream()
.
InputStream input = classLoader.getResourceAsStream("filename.ext");
// ...
Это также нормальный способ использования упакованных ресурсов. Если он находится внутри пакета, используйте вместо него, например, com/example/filename.ext
.