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