2015-12-09 28 views
12

Ho due servizi Web un SOAP (Axis2) e l'altro tipo REST (Jersey 2).Tomcat - Eccezione quando provo a condividere due progetti su due porte diverse

Tutto funziona bene, ma voglio mettere uno sulla porta 8080 e uno sulla porta 8081.

ho iniziato a modificare il mio server.xml dentro la mia cartella/conf Tomcat per creare un nuovo servizio con il proprio connettore, motore e di accoglienza come questo:

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> 

ho un problema con il mio contesto sulla seconda di servizio. Quando aggiungo questo e provo a lanciare Tomcat ho ottenuto questa eccezione:

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 

quando elimino contesto lancio Tomcat e ascolto su questa porta.

port

Questa è la prima volta che provo a farlo, sto facendo qualcosa di sbagliato, ma non so dove faccio una ricerca su google e lo stack, ma non ho trovato la soluzione.

Io lavoro su Windows 10, Tomcat 8 ed Eclipse su Marte.

Se uno di voi conosce la soluzione, gli sarò grato per l'aiuto. Grazie

+1

Penso che sia il WTP Eclipse a causare problemi. Hai provato a eseguire un Tomcat con la stessa configurazione ma a distribuire manualmente i file?Hai anche trovato esattamente * dove * viene implementato il tuo progetto REST? Chiaramente non è dove Tomcat lo cerca: 'C: \ DEV \ eclipse \ workspace \ .metadata \ .plugins \ org.eclipse.wst.server.core \ tmp0 \ webapps \ REST'. –

+0

Non pubblicare immagini del test qui. Pubblica il testo. – EJP

risposta

4

Il problema è che si sta tentando di avviare Tomcat con tale configurazione dall'interno di Eclipse IDE.

Ghayel è giusto che la segue è la ragione principale:

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) 

Vedi Eclipse IDE in Tomcat FAQ e Eclipse WebTools Project Tomcat FAQ in Eclipse per i riferimenti.

problema

Si è causata dalla combinazione delle seguenti due fatti:

  1. Per impostazione predefinita Eclipse IDE non usa il file server.xml che si sta modificando nel vostro IDE, ma elabora durante la copia in diverse ' Directory CATALINA_BASE '. Dal tuo messaggio di log quella directory è C:\DEV\eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\webapps.

    Innanzitutto, cercare il file conf/server.xml in quella directory. Potrebbe essere diverso dal file che hai modificato.

    In secondo luogo, mi aspetto che l'elaborazione IDE di Eclipse di server.xml non supporti più elementi del motore. (Potrebbe supportarli, ma sarei sorpreso se lo facesse).

  2. Quando l'elemento Context è definito in server.xml, il mancato avvio di questo contesto provoca un errore di avvio di Tomcat nel suo complesso.

    Questo è uno dei motivi per cui non è necessario definire gli elementi di contesto in server.xml.

per quanto ne so, un server Tomcat in Eclipse può essere configurato per utilizzare una directory CATALINA_BASE diversa, e può essere configurato per pubblicare contesti come file XML (invece di metterli in server.xml), ma ho ancora dubbio che tali la configurazione supporta più elementi del motore.

Penso che la soluzione migliore per configurare un'istanza Tomcat al di fuori di Eclipse e utilizzare altri strumenti (come Apache Ant) per comprimere e distribuire la tua applicazione web lì (sia copiando i file + affidandosi alla condivisione automatica o utilizzando Tomcat Ant tasks per distribuire un'applicazione su un'istanza di Tomcat in esecuzione).

Se non è necessario che questi servizi Web si trovino sulla stessa JVM, è sufficiente configurare diverse istanze Server in Eclipse e avviarle in parallelo. (Naturalmente, i loro numeri di porta devono essere diversi).

-3

Questa è la ragione principale:

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 

Qui è possibile risolvere il problema Issue with ContextLoaderListener

+0

@JoffreyHernandez Non capisco ==> Bug grazie per tout anwser ?? – Ghayel

+0

@Ghayel Joffrey significava "grande grazie per la tua risposta". – approxiblue

+2

La tua risposta non ha nulla a che fare con il vero problema. Si collega a una domanda con un 'ClassNotFoundException' invece il problema descritto. – malaguna

-1

Dopo aver letto la configurazione server.xml e rivedere Apache Tomcat 8 documentazione ufficiale per:

vi posso dire quanto segue: La configurazione Server, Service e Engine sembra giusto.

Tuttavia, sia la configurazione Host manca AppBase attributo, contrassegnato come obbligatorio nella documentazione ufficiale . Lo stesso per Contextattributo docBase, obbligatorio e non è presente nella configurazione di esempio.(EDIT: Cancellare grazie alla @EJP commento)

Inoltre, Context config afferma, a proposito docBase attributi:

Il documento base (noto anche come la root del contesto) annuario per questa applicazione Web o il percorso del file di archivio dell'applicazione Web (se questa applicazione Web viene eseguita direttamente dal file WAR). È possibile specificare un percorso assoluto per questa directory o file WAR, o un percorso che è relativo alla directory appBase dell'host proprietario.

Non vedo nessuno di questi nella configurazione di esempio.

D'altra parte, doc ufficiale Uniti circa Context seguente:

non è consigliabile posizionare < Context> elementi direttamente nel file server.xml. Questo perché rende più invasiva la configurazione del contesto dal momento che il file principale conf/server.xml non può essere ricaricato senza riavviare Tomcat.

Quindi, si prega di esaminare la configurazione, perché ho trovato alcuni errori che possono essere la causa vostra org.apache.catalina.LifecycleException: A child container failed during start

+1

La parola "obbligatorio" non viene visualizzata nel [collegamento] (https://tomcat.apache.org/tomcat-8.0-doc/config/host.html) . Quello che effettivamente dice su 'appBase' è "Se non specificato, verrà usato il default di' webapps'. ". – EJP

+0

Hai ragione, mi dispiace. Entrambi gli attributi appaiono in grassetto, quindi entrambi sono molto importanti. Ho dimenticato di dire che ci sono errori simili in SO correlati a ** docBase ** e ** appBase **, quindi volevo enfatizzare ciò, ma ho sbagliato. Modificherò la mia risposta. – malaguna

2

Sto assumendo si esegue il Tomcat da Eclipse con il plugin Server. Attenzione che il plugin potrebbe fare un po 'di magia. Per esempio. imposterà appBase su wtpwebapps per il primo elemento <Host>.

Così il vostro primo elemento host nella configurazione (/Service[@name="reciver"]/Engine/Host) ha l'attributo implicitamente impostato AppBase = "wtpwebapps", mentre il secondo elemento Host (/Service[@name="reciver2"]/Engine/Host) ha AppBase = "webapps". Quindi per il secondo host la webapp non viene trovata poiché sembra nel posto sbagliato.

Questo è ciò che la linea ~ 25 nel registro ti dice: 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

Avete diverse opzioni:

1) aggiungere AppBase = "wtpwebapps" per il secondo Host, tuttavia questo renderà entrambe le webapps disponibile su entrambe le porte 8080 e 8081.

2) ottenere lo stesso risultato di 1) aggiungendo un secondo connettore a <Service name="reciver"... e rimuovendo il secondo servizio.

3) aggiungere un terzo servizio, uno configurato da eclipse e gli altri due controllati dall'utente, confrontare la configurazione riportata di seguito. Ciò consente a Eclipse di configurare il primo servizio ed espone le diverse webapps sulle altre due porte 8080 e 8081 con l'inconveniente di avere entrambe le webapp disponibili su 8888.

4) si può giocare con le combinazioni, basta essere consapevoli che il primo L'host è configurato da Eclipse.

Vorrei raccomandare 2) per lo sviluppo. 3) e 1) interferiscono in qualche modo con il plugin WTP, ad es. quando aggiungi/rimuovi moduli su un server o stai uscendo dalla sincronizzazione.

Soluzione 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> 

Soluzione 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> 

Problemi correlati