Tomcat - Исключение, когда я пытаюсь поделиться двумя проектами на двух разных портах
У меня есть два webservice: SOAP (Axis2) и другой тип REST (Jersey 2).
Все работает отлично, но я хочу поместить его на порт 8080 и один на порт 8081.
Я начал редактировать свой server.xml внутри моей папки tomcat/conf для создания новой службы со своим собственным коннектором, движком и хостом, как это:
server.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener SSLEngine="on"
className="org.apache.catalina.core.AprLifecycleListener" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource auth="Container" description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase"
pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase" />
</GlobalNamingResources>
<Service name="reciver">
<Connector acceptCount="100" connectionTimeout="10000"
disableUploadTimeout="true" enableLookups="false" maxHttpHeaderSize="8192"
maxThreads="10" port="8080" useBodyEncodingForURI="true" />
<Engine defaultHost="localhost" jvmRoute="host1" name="reciver">
<Host autoDeploy="true" name="localhost" unpackWARs="true">
<Context docBase="SOAP" path="/SOAP" reloadable="true"
source="org.eclipse.jst.jee.server:SOAP" />
</Host>
</Engine>
</Service>
<Service name="reciver2">
<Connector acceptCount="100" connectionTimeout="10000"
disableUploadTimeout="true" enableLookups="false" maxHttpHeaderSize="8192"
maxThreads="10" port="8081" useBodyEncodingForURI="true" />
<Engine defaultHost="localhost" jvmRoute="host2" name="reciver2">
<Host autoDeploy="true" name="localhost" unpackWARs="true">
<Context docBase="REST" path="/REST" reloadable="true"
source="org.eclipse.jst.jee.server:REST" />
</Host>
</Engine>
</Service>
У меня проблема с моим контекстом на второй службе. Когда я добавляю это и пытаюсь запустить Tomcat, я получил это исключение:
GRAVE: A child container failed during start
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[reciver2].StandardHost[localhost].StandardContext[/REST]]
at java.util.concurrent.FutureTask.report(Unknown Source)
at java.util.concurrent.FutureTask.get(Unknown Source)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:916)
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:871)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[reciver2].StandardHost[localhost].StandardContext[/REST]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
... 6 more
Caused by: org.apache.catalina.LifecycleException: Failed to start component [[email protected]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:4909)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5039)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
... 6 more
Caused by: java.lang.IllegalArgumentException: The main resource set specified [C:\DEV\eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\webapps\REST] is not valid
at org.apache.catalina.webresources.StandardRoot.createMainResourceSet(StandardRoot.java:723)
at org.apache.catalina.webresources.StandardRoot.startInternal(StandardRoot.java:684)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
... 9 more
déc. 09, 2015 11:23:28 AM org.apache.catalina.core.ContainerBase startInternal
GRAVE: A child container failed during start
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[reciver2].StandardHost[localhost]]
at java.util.concurrent.FutureTask.report(Unknown Source)
at java.util.concurrent.FutureTask.get(Unknown Source)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:916)
at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.StandardService.startInternal(StandardService.java:439)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:769)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.startup.Catalina.start(Catalina.java:625)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:351)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:485)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[reciver2].StandardHost[localhost]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: org.apache.catalina.LifecycleException: A child container failed during start
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:924)
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:871)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
... 6 more
déc. 09, 2015 11:23:28 AM org.apache.catalina.startup.Catalina start
GRAVE: The required Server component failed to start so Tomcat is unable to start.
org.apache.catalina.LifecycleException: Failed to start component [StandardServer[8005]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
at org.apache.catalina.startup.Catalina.start(Catalina.java:625)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:351)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:485)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardService[reciver2]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:769)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
... 7 more
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[reciver2]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
at org.apache.catalina.core.StandardService.startInternal(StandardService.java:439)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
... 9 more
Caused by: org.apache.catalina.LifecycleException: A child container failed during start
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:924)
at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
... 11 more
Когда я удаляю запуск tomcat в контексте и слушаю на этом порту.
![port]()
Это первый раз, когда я пытаюсь это сделать, я делаю что-то не так, но я не знаю, где я ищу Google и стек, но я не нашел решение.
Я работаю над окнами 10, tomcat 8 и Eclipse Mars.
Если один из вас знает решение, я буду благодарен ему за помощь. Спасибо вам
Ответы
Ответ 1
Проблема заключается в том, что вы пытаетесь запустить Tomcat с такой конфигурацией из Eclipse IDE.
Гайель прав, что главная причина:
Caused by: java.lang.IllegalArgumentException: The main resource set specified [C:\DEV\eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\webapps\REST] is not valid
at org.apache.catalina.webresources.StandardRoot.createMainResourceSet(StandardRoot.java:723)
at org.apache.catalina.webresources.StandardRoot.startInternal(StandardRoot.java:684)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
Смотрите Eclipse IDE в FAQ Tomcat и Eclipse WebTools Project Tomcat FAQ в Eclipse для ссылок.
Проблема связана с комбинацией следующих двух фактов:
-
По умолчанию Eclipse IDE не использует файл server.xml
, который вы редактируете в своей среде IDE, но обрабатывает его при копировании в другой каталог CATALINA_BASE. Из вашего сообщения журнала этот каталог C:\DEV\eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\webapps
.
Сначала просмотрите файл conf/server.xml
в этом каталоге. Он может отличаться от файла, который вы редактировали.
Во-вторых, я ожидал бы, что обработка Eclipse IDE server.xml
не поддерживает несколько элементов Engine. (Это может поддержать их, но я буду удивлен, если это так).
-
Когда элемент Context
определен в файле server.xml, отказ запустить этот контекст приводит к сбою запуска Tomcat в целом.
Это одна из причин не определять элементы контекста в server.xml
.
AFAIK, сервер Tomcat в Eclipse может быть настроен на использование другого каталога CATALINA_BASE, и его можно настроить для публикации контекстов в виде XML файлов (вместо того, чтобы помещать их в server.xml
), но я все же сомневаюсь, что такая поддержка конфигурации несколько элементов двигателя.
Я считаю, что лучше всего настроить экземпляр Tomcat вне Eclipse и использовать другие инструменты (например, Apache Ant) для упаковки и развертывания там своего веб-приложения (либо путем копирования файлов +, либо с помощью autodeploy, либо путем используя Tomcat Ant задачи, чтобы развернуть приложение на исполняемый экземпляр Tomcat).
Если вам не нужно, чтобы эти веб-службы находились на одной JVM, просто настройте несколько экземпляров сервера в Eclipse и начните их параллельно. (Конечно, их номера портов должны быть разными).
Ответ 2
Я предполагаю, что вы запускаете Tomcat из Eclipse с помощью плагина сервера.
Имейте в виду, что плагин может сделать какую-то магию. Например. он установит appBase в wtpwebapps для первого элемента <Host>
.
Итак, ваш первый элемент хоста в вашем config (/Service[@name="reciver"]/Engine/Host
) имеет атрибут, неявно установленный в appBase = "wtpwebapps", тогда как второй элемент Host (/Service[@name="reciver2"]/Engine/Host
) имеет appBase = "webapps". Таким образом, для второго хоста webapp не найден, поскольку он выглядит не в том месте.
Это то, что строка ~ 25 в вашем журнале сообщает вам:
Caused by: java.lang.IllegalArgumentException: The main resource set specified [C:\DEV\eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\webapps\REST] is not valid
У вас есть разные варианты:
1) добавьте appBase = "wtpwebapps" ко второму хосту, однако это сделает оба Webapps доступными на обоих портах 8080 и 8081.
2) достигните того же результата, что и в 1), добавив второй соединитель к <Service name="reciver"...
и удалив вторую службу.
3) добавьте третий сервис, который настроен с помощью eclipse, а два других контролируются вами, сравните конфигурацию ниже. Это позволяет Eclipse сконфигурировать первую услугу и предоставляет различные веб-приложения на двух других портах 8080 и 8081 с недостатком наличия обоих веб-приложений на 8888.
4) вы можете играть с комбинациями, просто имейте в виду, что первый хост настроен Eclipse.
Я бы порекомендовал 2) для разработки. 3) и 1) несколько вмешиваются в плагин WTP, например. при добавлении/удалении модулей на сервер или выходе из синхронизации.
Решение 2)
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener SSLEngine="on"
className="org.apache.catalina.core.AprLifecycleListener" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<Service name="forEclipse">
<Connector acceptCount="100" connectionTimeout="10000"
disableUploadTimeout="true" enableLookups="false" maxHttpHeaderSize="8192"
maxThreads="10" port="8080" useBodyEncodingForURI="true" />
<Connector acceptCount="100" connectionTimeout="10000"
disableUploadTimeout="true" enableLookups="false" maxHttpHeaderSize="8192"
maxThreads="10" port="8081" useBodyEncodingForURI="true" />
<Engine defaultHost="localhost" jvmRoute="host1" name="reciver">
<Host autoDeploy="true" name="localhost" unpackWARs="true">
<Context docBase="SOAP" path="/SOAP" reloadable="true"
source="org.eclipse.jst.jee.server:SOAP" />
<Context docBase="REST" path="/REST" reloadable="true"
source="org.eclipse.jst.jee.server:REST" />
</Host>
</Engine>
</Service>
Решение 3)
<Service name="forEclipse">
<Connector acceptCount="100" connectionTimeout="10000"
disableUploadTimeout="true" enableLookups="false" maxHttpHeaderSize="8192"
maxThreads="10" port="8888" useBodyEncodingForURI="true" />
<Engine defaultHost="localhost" jvmRoute="host1" name="reciver">
<Host autoDeploy="true" name="localhost" unpackWARs="true">
<Context docBase="SOAP" path="/SOAP" reloadable="true"
source="org.eclipse.jst.jee.server:SOAP" />
<Context docBase="REST" path="/REST" reloadable="true"
source="org.eclipse.jst.jee.server:REST" />
</Host>
</Engine>
</Service>
<Service name="reciver">
<Connector acceptCount="100" connectionTimeout="10000"
disableUploadTimeout="true" enableLookups="false" maxHttpHeaderSize="8192"
maxThreads="10" port="8080" useBodyEncodingForURI="true" />
<Engine defaultHost="localhost" jvmRoute="host1" name="reciver">
<Host appBase="webapps" autoDeploy="true" name="localhost"
unpackWARs="true">
<Context docBase="../wtpwebapps/SOAP" path="/SOAP"
reloadable="true" source="org.eclipse.jst.jee.server:SOAP" />
</Host>
</Engine>
</Service>
<Service name="reciver2">
<Connector acceptCount="100" connectionTimeout="10000"
disableUploadTimeout="true" enableLookups="false" maxHttpHeaderSize="8192"
maxThreads="10" port="8081" useBodyEncodingForURI="true" />
<Engine defaultHost="localhost" jvmRoute="host2" name="reciver2">
<Host appBase="webapps" autoDeploy="true" name="localhost"
unpackWARs="true">
<Context docBase="../wtpwebapps/REST" path="/REST"
reloadable="true" source="org.eclipse.jst.jee.server:REST" />
</Host>
</Engine>
</Service>
Ответ 3
Прочитав конфигурацию server.xml
и рассмотрев официальную документацию Apache Tomcat 8 для:
Я могу сказать вам следующее: конфигурации Server
, Service
и Engine
кажутся правильными.
Однако в конфигурации Host
отсутствует атрибут appBase, , который помечается как обязательный в официальной документации. То же самое для атрибута Context
docBase, является обязательным, а - нет в вашем образце config. ( РЕДАКТИРОВАТЬ: вычеркнуть из-за комментария @EJP)
Кроме того, Context
config указывает следующее о атрибуте docBase:
Каталог База документов (также известный как Контекстный корень) для этого веб-приложения или путь к файлу архива веб-приложения (если это веб-приложение выполняется непосредственно из файла WAR), Вы можете указать абсолютный путь для этого каталога или WAR файла или путь, относящийся к каталогу appBase владеющего узла.
Я не вижу ни одного из них в вашей конфигурации образца.
С другой стороны, официальный документ сообщает о Context
следующее:
НЕ рекомендуется размещать элементы < Контекст непосредственно в файле server.xml. Это связано с тем, что модификация конфигурации Контекст более инвазивная, поскольку основной файл conf/server.xml
нельзя перезагрузить без перезапуска Tomcat.
Итак, просмотрите конфигурацию, потому что я обнаружил некоторые ошибки, которые могут вызывать ваш org.apache.catalina.LifecycleException: A child container failed during start
Ответ 4
Это основная причина:
Caused by: java.lang.IllegalArgumentException: The main resource set specified [C:\DEV\eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\webapps\REST] is not valid
Здесь вы можете исправить его Проблема с ContextLoaderListener