Если вы хотите добавить JAR-файл в ClassLoader вашего текущего потока, вы создадите новый URLClassLoader, используйте ClassLoader текущего класса в качестве родительского и добавьте новые URL-адреса JAR. Вы не можете указывать test.resource
в своем URL. Не забудьте назначить новый ClassLoader для вашего текущего потока. Смотрите пример ниже:
URL url = new URL("file:/out/resource.jar")
def urlList = [] << url
URL[] urls = urlList.toArray()
URLClassLoader classLoader = new URLClassLoader(urls, getClass().classLoader)
Thread.currentThread().setContextClassLoader(classLoader)
Теперь вы сможете получить файл через Thread.currentThread().getContextClassLoader().getResourceAsStream
.
Если вы на самом деле просто хотите прочитать файл из JAR, не добавляя его в путь к классам, вы можете воспользоваться следующим подходом:
JarFile jar = new JarFile(new File('/out/resource.jar'))
JarEntry jarEntry = jar.getJarEntry('test.resource')
if(jarEntry) {
File file = new File(new URL("jar:file:/out/resource.jar!/test.resource").toURI())
}