Предупреждение: этот ответ является частью предположения и догадки о механике, он может быть не на 100% правильным, но я думаю, что он достаточно близок. Насколько я знаю, фактическая загрузка класса WAR будет варьироваться в зависимости от контейнера сервлета или сервера приложений, поэтому этот ответ может не подходить для всех из них.
Если вы посмотрите на
jar:file:/Users/myName/warPath/warName.war!/WEB-INF/classes!/rewrite/common/RenameFunctor.groovy
Вы можете разделить его на следующие части:
file:/Users/myName/warPath/warName.war
/WEB-INF/classes
/rewrite/common/RenameFunctor.groovy
Фактический ресурс, который находится на пути к классам, является последним, /rewrite/common/RenameFunctor.groovy
, остальные части - это координаты, используемые загрузчиком классов войны, чтобы найти часть пути к классам, которая содержит этот ресурс: сначала местоположение сам файл войны file:/Users/myName/warPath/warName.war
, а затем путь в войне /WEB-INF/classes
.
Эта теория основана на документации JarURLConnection
, которая гласит:
URL-соединение с файлом Java ARchive (JAR) или записью в JAR
файл.
Синтаксис URL-адреса JAR:
jar:<url>!/{entry}
например:
jar:http://www.foo.com/bar/baz.jar!/COM/foo/Quux.class
URL-адреса Jar должны использоваться для ссылки на файл JAR или записи в JAR
файл. Пример выше - это URL JAR, который ссылается на запись JAR. Если
имя записи опущено, URL относится ко всему файлу JAR:
jar:http://www.foo.com/bar/baz.jar!/
Таким образом, для простого jar первая часть URL идентифицирует сам файл jar, а вторая часть идентифицирует ресурс внутри jar.
Технически файлы war являются файлами jar, но, в отличие от файлов jar, сам файл war не является частью пути к классам. Вместо этого он содержит элементы, которые добавляются в путь к классам. Например, файлы jar в WEB-INF/lib
и классы и другие файлы в WEB-INF/classes
.
Разделенные !
части затем определяют шаги, предпринятые загрузчиком war-класса для поиска определенного ресурса, в данном случае /rewrite/common/RenameFunctor.groovy
.