Обслуживание статических файлов пристанью в карафе (за пределами пакета)
Мы боремся с простой проблемой обслуживания статических файлов где-то в файловой системе, но за пределами веб-приложения, но мы не можем запустить его.
Есть несколько примеров того, как это сделать, но ни один из них, похоже, не работает, и до сих пор мы не смогли найти подтверждение от кого-то, что это действительно работает.
Файл jetty.xml, находящийся в каталоге etc, был отредактирован, как указано здесь https://ops4j1.jira.com/wiki/display/paxweb/Advanced+Jetty+Configuration или здесь пример ops4j GitHub
Так что добавил в jetty.xml это:
<Get name="handler">
<Call name="addHandler">
<Arg>
<New class="org.eclipse.jetty.servlet.ServletContextHandler">
<Set name="contextPath">/fileserver</Set>
<Set name="resourceBase">/Users/Shared/testenv</Set>
<Call name="addServlet">
<Arg>org.eclipse.jetty.servlet.DefaultServlet</Arg>
<Arg>/</Arg>
</Call>
</New>
</Arg>
</Call>
</Get>
или это:
<Get name="handler">
<Call name="addHandler">
<Arg>
<New class="org.eclipse.jetty.server.handler.ContextHandler">
<Set name="contextPath">/fileserver</Set>
<Set name="handler">
<New class="org.eclipse.jetty.server.handler.ResourceHandler">
<Set name="resourceBase">/Users/Shared/testenv</Set>
<Set name="directoriesListed">true</Set>
</New>
</Set>
</New>
</Arg>
</Call>
</Get>
В обеих версиях Jetty / Karaf запускается нормально, и когда Karaf выключен, я вижу
2015-06-02 12:02:57,838 | ИНФО | бассейн-7-нить-2 | ContextHandler
| 113 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.15.v20140411 | остановлено oejsServletContextHandler{/fileserver,file:/Users/Shared/testenv/}
Но файлы не обслуживаются под localhost:8181/fileserver
Единственный способ его работы (в недавно установленном контейнере karaf) - это использовать
<Set name="handler">
<New class="org.eclipse.jetty.server.handler.HandlerList">
<Set name="handlers">
<Array type="org.eclipse.jetty.server.Handler">
<Item>
<New class="org.eclipse.jetty.servlet.ServletContextHandler">
<Set name="contextPath">/fileserver</Set>
<Set name="resourceBase">/Users/Shared/testenv</Set>
<Call name="addServlet">
<Arg>org.eclipse.jetty.servlet.DefaultServlet</Arg>
<Arg>/</Arg>
</Call>
</New>
</Item>
</Array>
</Set>
</New>
</Set>
Но, делая это, сломает другие веб-приложения, работающие в karaf. Например, мы используем компонент Camel Servlet.
Так есть ли у кого-то рабочая конфигурация для обслуживания статических файлов через экземпляр Jetty в karaf или как теперь это сделать?
Любая помощь приветствуется. Заранее спасибо!
Кстати: Использование Karaf 3.0.3
РЕДАКТИРОВАТЬ:
Я перезапустил тест с использованием фрагмента, предоставленного Achim, и включил логин DEBUG.
2015-06-03 15: 33: 25,492 | ОТЛАДКА | бассейн-6-нить-1 | XmlConfiguration | 71 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.15.v20140411 | XML oejshContextHandler{/,null}.setContextPath(/static-content) 2015-06-03 15:33:25,527 | ОТЛАДКА | бассейн-6-нить-1 | XmlConfiguration | 71 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.15.v20140411 | XML oejshContextHandler{/static-content,null}.setHandler(org.eclipse.jetty.server.handler.ResourceHandler@3855ace4) 2015-06-03 15:33:25,529 | ОТЛАДКА | бассейн-6-нить-1 | Контейнер
| 71 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.15.v20140411 | Контейнер oejshContextHandler{/static-content,null} + org.eclipse.jetty.server.handler.ResourceHandler@3855ace4 в качестве обработчика 2015-06-03 15: 33: 25,529 | ОТЛАДКА | бассейн-6-нить-1 | Контейнер
| 71 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.15.v20140411 | Контейнер org.ops4j.pax.web.service.jetty.internal.JettyServerHandlerCollection@6665534e + oejshContextHandler {/ static-content, null} в качестве обработчика 2015-06-03 15:33:25,542 | ОТЛАДКА | бассейн-6-нить-1 | AbstractLifeCycle
| 71 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.15.v20140411 | начальный oejshContextHandler{/static-content,null} 2015-06-03 15:33:25,542 | ОТЛАДКА | бассейн-6-нить-1 | AbstractHandler
| 71 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.15.v20140411 | начальный oejshContextHandler{/static-content,null} 2015-06-03 15:33:25,543 | ОТЛАДКА | бассейн-6-нить-1 | AbstractLifeCycle
| 71 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.15.v20140411 | STARTED oejshContextHandler{/static-content,null} 2015-06-03 15:34:27,974 | ОТЛАДКА | /static-content | сервер
| 71 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.15.v20140411 | REQUEST /static-content для AsyncHttpConnection@638f2d20,g=HttpGenerator{s =0,h=-1,b=-1,c=-1},p=HttpParser{s=-5,l=10,c=0},r=1 2015-06-03 15:34:27,974 | ОТЛАДКА | /static-content | ServerModel
| 78 - org.ops4j.pax.web.pax-web-spi - 3.1.4 | Соответствие [/static-content]... 2015-06-03 15:34:27,975 | ОТЛАДКА | /static-content | ServerModel | 78 - org.ops4j.pax.web.pax-web-spi - 3.1.4 | Путь [/ static-content] не соответствует ни одному контексту 2015-06-03 15: 34: 27,975 | ОТЛАДКА | /static-content | Сервер | 71 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.15.v20140411 | ОТВЕТ /static-content 200 handled=false
Здесь я заметил разницу между версией Get (не работает) и версией Set (работает).
Set устанавливает класс org.eclipse.jetty.server.handler.HandlerList
Получить получает и добавить в класс org.ops4j.pax.web.service.jetty.internal.JettyServerHandlerCollection
, который описывается как
Коллекция Jetty Handler, которая вызывает только тот обработчик (=context), который соответствует пути запроса после выполнения сопоставления пути запросов на основе подстрок с зарегистрированными псевдонимами
Может ли быть проблема с псевдонимами?
РЕДАКТИРОВАТЬ 2:
Я пытался копаться в этом, но я действительно не могу заставить это работать. Я не знаю о различиях между интеграционным тестом и обычным графиком, но тут должна быть проблема. Чтобы воспроизвести проблему, просто возьмите свежий контейнер karaf (3.0.3), выполните feature:install war
и добавьте фрагмент в файл etc/jetty.xml, чтобы он выглядел следующим образом, и отредактируйте путь resourceBase, чтобы он соответствовал локальному пути.
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//
DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
<Configure class="org.eclipse.jetty.server.Server">
<!-- =========================================================== -->
<!-- Set connectors -->
<!-- =========================================================== -->
<!-- One of each type! -->
<!-- =========================================================== -->
<!-- Use this connector for many frequently idle connections and for
threadless continuations. -->
<Call name="addConnector">
<Arg>
<New class="org.eclipse.jetty.server.nio.SelectChannelConnector">
<Set name="host">
<Property name="jetty.host" />
</Set>
<Set name="port">
<Property name="jetty.port" default="8181" />
</Set>
<Set name="maxIdleTime">300000</Set>
<Set name="Acceptors">2</Set>
<Set name="statsOn">false</Set>
<Set name="confidentialPort">8443</Set>
<Set name="lowResourcesConnections">20000</Set>
<Set name="lowResourcesMaxIdleTime">5000</Set>
</New>
</Arg>
</Call>
<!-- =========================================================== -->
<!-- Configure Authentication Realms -->
<!-- Realms may be configured for the entire server here, or -->
<!-- they can be configured for a specific web app in a context -->
<!-- configuration (see $(jetty.home)/contexts/test.xml for an -->
<!-- example). -->
<!-- =========================================================== -->
<Call name="addBean">
<Arg>
<New class="org.eclipse.jetty.plus.jaas.JAASLoginService">
<Set name="name">karaf</Set>
<Set name="loginModuleName">karaf</Set>
<Set name="roleClassNames">
<Array type="java.lang.String">
<Item>org.apache.karaf.jaas.boot.principal.RolePrincipal
</Item>
</Array>
</Set>
</New>
</Arg>
</Call>
<Call name="addBean">
<Arg>
<New class="org.eclipse.jetty.plus.jaas.JAASLoginService">
<Set name="name">default</Set>
<Set name="loginModuleName">karaf</Set>
<Set name="roleClassNames">
<Array type="java.lang.String">
<Item>org.apache.karaf.jaas.boot.principal.RolePrincipal
</Item>
</Array>
</Set>
</New>
</Arg>
</Call>
<Get name="handler">
<Call name="addHandler">
<Arg>
<New class="org.eclipse.jetty.server.handler.ContextHandler">
<Set name="contextPath">/static-content</Set>
<Set name="handler">
<New class="org.eclipse.jetty.server.handler.ResourceHandler">
<Set name="resourceBase">/Users/Shared/testenv/in</Set>
<Set name="directoriesListed">true</Set>
</New>
</Set>
</New>
</Arg>
</Call>
</Get>
</Configure>
Попробуйте получить доступ к контексту через браузер, используя localhost:8181/static-content.
Результат всегда 404 - Не найдено.
Мы пробовали это на нескольких системах под управлением Linux и Windows.
3 ответа
Возможно, проблема связана с версией pax-web. В Karaf 3.0.5 он использует версию Pax-web 3.2.6, которую я прочитал (извините, я не могу найти ссылку), в которой была ошибка, связанная с обслуживанием статического контента.
Я протестировал подход @Achim в Karaf 4.0.3 (Pax-web 4.2.3), и он работает как шарм.
Я не могу заставить это работать. Используя только что загруженный Karaf 3.0.5:
$ cd /tmp
$ tar xzf ~/Downloads/apache-karaf-3.0.5.tar.gz
$ ./apache-karaf-3.0.5/bin/karaf
__ __ ____
/ //_/____ __________ _/ __/
/ ,< / __ `/ ___/ __ `/ /_
/ /| |/ /_/ / / / /_/ / __/
/_/ |_|\__,_/_/ \__,_/_/
Apache Karaf (3.0.5)
Hit '<tab>' for a list of available commands
and '[cmd] --help' for help on a specific command.
Hit '<ctrl-d>' or type 'system:shutdown' or 'logout' to shutdown Karaf.
karaf@root()>
Проверка, есть ли что-нибудь еще:
$ curl http://localhost:8181/
curl: (7) Failed to connect to localhost port 8181: Connection refused
Хорошо. Нет пристани еще.
Установка pax web
karaf@root()> feature:repo-add mvn:org.ops4j.pax.web/pax-web-features/2.1.0/xml/features
Adding feature url mvn:org.ops4j.pax.web/pax-web-features/2.1.0/xml/features
karaf@root()> feature:install pax-jetty
karaf@root()> feature:install http
Проверка снова с помощью curl
$ curl http://localhost:8181/
...
<h2>HTTP ERROR: 404</h2>
<hr /><i><small>Powered by Jetty://</small></i>
...
Хорошо. Причал жив.
Добавление ResourceHandler в apache-karaf-3.0.5/etc/jetty.xml
<Get name="handler">
<Call name="addHandler">
<Arg>
<New class="org.eclipse.jetty.server.handler.ContextHandler">
<Set name="contextPath">/static-content</Set>
<Set name="handler">
<New class="org.eclipse.jetty.server.handler.ResourceHandler">
<Set name="resourceBase">/tmp</Set>
<Set name="directoriesListed">true</Set>
</New>
</Set>
</New>
</Arg>
</Call>
</Get>
локон все еще видит 404:
$ curl http://localhost:8181/
...
<h2>HTTP ERROR: 404</h2>
...
Не уверен, что мне нужно перезапустить что-нибудь. Я все равно перезагружаю весь Караф.
Обе локоны дают 404:
$ curl http://localhost:8181/
$ curl http://localhost:8181/static-content
Включение ведения журнала DEBUG в apache-karaf-3.0.5 / etc / org.ops4j.pax.logging.cfg
log4j.rootLogger=DEBUG, out, osgi:*
curl по-прежнему получает 404 для http://localhost:8181/static-content, а karaf.log говорит:
2015-11-14 12:57:00,938 | DEBUG | 673-63 Selector0 | nio | 70 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.17.v20150415 | created SCEP@5b87b8b7{l(/127.0.0.1:46304)<->r(/127.0.0.1:8181),s=0,open=true,ishut=false,oshut=false,rb=false,wb=false,w=true,i=0}-{AsyncHttpConnection@21d1b60b,g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=-14,l=0,c=0},r=0}
2015-11-14 12:57:00,939 | DEBUG | qtp425678673-70 | HttpParser | 70 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.17.v20150415 | filled 92/92
2015-11-14 12:57:00,939 | DEBUG | /static-content | Server | 70 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.17.v20150415 | REQUEST /static-content on AsyncHttpConnection@21d1b60b,g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=-5,l=3,c=0},r=1
2015-11-14 12:57:00,940 | DEBUG | /static-content | ServerModel | 77 - org.ops4j.pax.web.pax-web-spi - 3.2.6 | Matching [/static-content]...
2015-11-14 12:57:00,940 | DEBUG | /static-content | ServerModel | 77 - org.ops4j.pax.web.pax-web-spi - 3.2.6 | Path [/static-content] does not match any context
2015-11-14 12:57:00,940 | DEBUG | /static-content | Server | 70 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.17.v20150415 | RESPONSE /static-content 200 handled=false
2015-11-14 12:57:00,940 | DEBUG | qtp425678673-70 | AsyncHttpConnection | 70 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.17.v20150415 | Enabled read interest SCEP@5b87b8b7{l(/127.0.0.1:46304)<->r(/127.0.0.1:8181),s=1,open=true,ishut=false,oshut=false,rb=false,wb=false,w=true,i=0r}-{AsyncHttpConnection@21d1b60b,g=HttpGenerator{s=4,h=0,b=0,c=-1},p=HttpParser{s=0,l=3,c=0},r=1}
2015-11-14 12:57:00,941 | DEBUG | qtp425678673-70 | ChannelEndPoint | 70 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.17.v20150415 | ishut SCEP@5b87b8b7{l(/127.0.0.1:46304)<->r(/127.0.0.1:8181),s=1,open=true,ishut=false,oshut=false,rb=false,wb=false,w=true,i=0r}-{AsyncHttpConnection@21d1b60b,g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=-14,l=0,c=-3},r=1}
2015-11-14 12:57:00,941 | DEBUG | qtp425678673-70 | HttpParser | 70 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.17.v20150415 | filled -1/0
2015-11-14 12:57:00,941 | DEBUG | qtp425678673-70 | AsyncHttpConnection | 70 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.17.v20150415 | Disabled read interest while writing response SCEP@5b87b8b7{l(/127.0.0.1:46304)<->r(/127.0.0.1:8181),s=1,open=true,ishut=true,oshut=false,rb=false,wb=false,w=true,i=0r}-{AsyncHttpConnection@21d1b60b,g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=0,l=0,c=-3},r=1}
2015-11-14 12:57:00,942 | DEBUG | qtp425678673-70 | ChannelEndPoint | 70 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.17.v20150415 | close SCEP@5b87b8b7{l(/127.0.0.1:46304)<->r(/127.0.0.1:8181),s=1,open=true,ishut=true,oshut=false,rb=false,wb=false,w=true,i=0r}-{AsyncHttpConnection@21d1b60b,g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=0,l=0,c=-3},r=1}
2015-11-14 12:57:00,942 | DEBUG | 673-63 Selector0 | nio | 70 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.17.v20150415 | destroyEndPoint SCEP@5b87b8b7{l(null)<->r(0.0.0.0/0.0.0.0:8181),s=0,open=false,ishut=true,oshut=true,rb=false,wb=false,w=true,i=0!}-{AsyncHttpConnection@21d1b60b,g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=0,l=0,c=-3},r=1}
2015-11-14 12:57:00,943 | DEBUG | 673-63 Selector0 | AbstractHttpConnection | 70 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.17.v20150415 | closed AsyncHttpConnection@21d1b60b,g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=0,l=0,c=-3},r=1
Затем попробуйте DefaultServlet как набросок в Advanced Jetty Configuration, заменив мое предыдущее дополнение в jetty.xml на
<Get name="handler">
<Call name="addHandler">
<Arg>
<New class="org.eclipse.jetty.servlet.ServletContextHandler">
<Set name="contextPath">/static-content</Set>
<Set name="resourceBase">/tmp</Set>
<Call name="addServlet">
<Arg>org.eclipse.jetty.servlet.DefaultServlet</Arg>
<Arg>/</Arg>
</Call>
</New>
</Arg>
</Call>
</Get>
Перезапуск Karaf и curl http://localhost:8181/static-content прежнему дает 404, и журнал Karaf говорит, по существу, так же, как с ResourceHandler.
Чего не хватает?
На самом деле вы уже получили его в своем образце, так оно и есть. Как видно из этого интеграционного теста, он работает.
поэтому, пожалуйста, убедитесь, что у вас есть это в соответствии с этим:
<Get name="handler">
<Call name="addHandler">
<Arg>
<New class="org.eclipse.jetty.server.handler.ContextHandler">
<Set name="contextPath">/static-content</Set>
<Set name="handler">
<New class="org.eclipse.jetty.server.handler.ResourceHandler">
<Set name="resourceBase">target/logs</Set>
<Set name="directoriesListed">true</Set>
</New>
</Set>
</New>
</Arg>
</Call>
</Get>