Хранение веб-контента в файле JAR
Можно ли хранить веб-контент (например, JSP, HTML, изображения, CSS и т. Д.) В файле JAR?
Я искал различные варианты модульности наших веб-приложений, и это одна из возможностей.
В настоящее время мы используем JSF и Facelets для нашей технологии представлений - я думаю, что возможно написать какую-то форму настраиваемого преобразователя представлений, которая будет проверять путь к классам, а не каталог файловой системы, но я не уверен, что это сработает.
Любые идеи были бы хорошы!:)
Обновление: я, вероятно, должен уточнить. Как вы получаете веб-контейнер (например, Tomcat) для загрузки ресурсов из файла JAR? Например, я развертываю файл.war с моим веб-приложением. Если я получу доступ к /index.jsp, контейнер попытается найти в каталоге веб-материалов файл index.jsp.
Есть ли простой способ настроить свой собственный загрузчик ресурсов, используя Tomcat или тому подобное, чтобы он выполнял поиск по пути к классам, а также по файловой системе?
6 ответов
Если вы используете Maven для создания своего веб-приложения, вы можете создать WAR своих ресурсов и наложить эту WAR на WAR вашего веб-приложения во время сборки.
Ресурс WAR, содержащий все ваши JSP, изображения, CSS и т. Д., Называется "наложением" и представляет собой просто зависимость в целевом веб-приложении с типом, установленным в "war".
Когда вы упаковываете свое веб-приложение, ресурс WAR будет копировать только неконфликтующие файлы. Итак, если у вас есть уникальный index.jsp в вашем проекте, и вы хотите использовать его вместо index.jsp в оверлее, просто включите его в целевое веб-приложение, и Maven не будет копировать этот ресурс.
Больше информации на странице плагина Maven War о оверлеях.
Да, можно хранить файлы, например, свойства, XML, XSLT, изображения и т. Д.; в файл JAR (или WAR) и извлеките их во время выполнения.
Чтобы загрузить ресурс из файла развертывания, используйте следующий код.
this.getClass().getClassLoader().getResourceAsStream( filename ) ;
В проекте maven папки и файлы, размещенные в ресурсах, включены в jar. Имя файла относится к корню файла jar, поэтому "./filename.xml" будет соответствовать файлу filename.xml, помещенному в "/src/java/resources".
Файл тега похож на фрагмент JSP, который можно поместить в банку. Использование файлов тегов может помочь вам, но я никогда не пытался использовать изображения, CSS и т. Д. В банке.
Вы также можете использовать проект weblets (см. https://weblets.dev.java.net/).
Вы храните некоторые ресурсы в библиотеке JAR (например, images, css, javascript...) и пишете очень простой weblet-config.xml. Затем на странице JSF вы можете ссылаться на них напрямую с помощью следующего синтаксиса:
<h:graphicImage src="weblet://some-name/images/someimage.jpg" .../>
Абсолютно. Черт возьми, вы можете хранить контент непосредственно в файле WAR, который в основном представляет собой файл JAR с несколькими дополнительными битами. Да, вам может понадобиться написать собственный распознаватель, чтобы использовать ClassLoader.getResourceAsStream, но в основном, поскольку вы получаете возможность генерировать контент, как вам нравится, выборка его из файла JAR кажется совершенно разумной. Вы, вероятно, захотите убедиться, что он выбирает только очень специфический набор расширений:)
В Core JavaServer Faces, 3-е издание, в разделе "Упаковка составных компонентов в JAR" на стр. 382, речь идет об упаковке составных компонентов в файлы JAR.
"Все, что вам нужно сделать, это поместить ваш составной компонент и его артефакты, такие как JavaScript, таблицы стилей или файлы свойств, в каталог META-INF в JAR, как показано на рисунке 9-14".
components.jar
+-- META-INF
+-- resources
+-- css
| +-- styles.css
+-- images
| +-- back.png
+-- util
+-- icon.xhtml
+-- login.js
+-- login.properties
Я не уверен, насколько легко получить доступ к этим ресурсам напрямую из других приложений, в отличие от содержащихся в них составных компонентов.