Хранение веб-контента в файле 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

Я не уверен, насколько легко получить доступ к этим ресурсам напрямую из других приложений, в отличие от содержащихся в них составных компонентов.

Другие вопросы по тегам