Tomcat - 当我尝试在两个不同的端口上共享两个项目时出现异常

时间:2015-12-09 10:46:32

标签: tomcat

我有两个web服务SOAP(Axis2)和另一个类型REST(Jersey 2)。

一切正常,但我想把一个放在端口8080上,一个放在端口8081上。

我开始在tomcat / conf文件夹中编辑我的server.xml,用这个创建一个带有自己的连接器,引擎和主机的新服务:

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 [org.apache.catalina.webresources.StandardRoot@5e8549c9]
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和stack上搜索的位置,但我还没有找到解决方案。

我在Windows 10,tomcat 8和eclipse Mars上工作。

如果你们其中一个人知道解决方案,我将非常感谢他的帮助。谢谢

4 个答案:

答案 0 :(得分:5)

您的问题是您正在尝试从Eclipse IDE中使用此类配置启动Tomcat。

Ghayel说得对,以下是主要原因:

 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)

请参阅Tomcat FAQ中的Eclipse IDE和Eclipse上的Eclipse WebTools Project Tomcat FAQ以获取参考信息。

您的问题是由以下两个事实的组合引起的:

  1. 默认情况下,Eclipse IDE不使用您在IDE中编辑的server.xml文件,但在复制到不同的“CATALINA_BASE”文件时会对其进行处理。目录。从您的日志消息中,该目录为C:\DEV\eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\webapps

    首先,查看该目录中的conf/server.xml文件。它可能与您编辑的文件不同。

    其次,我希望server.xml的Eclipse IDE处理不支持多个Engine元素。 (它可能会支持他们,但如果它这样做我会感到惊讶)。

  2. 在server.xml中定义Context元素时,无法启动此上下文会导致Tomcat整体启动失败。

    这是不在server.xml中定义Context元素的原因之一。

  3. AFAIK,Eclipse中的Tomcat服务器可以配置为使用不同的CATALINA_BASE目录,并且可以将其配置为将上下文发布为xml文件(而不是将它们放入server.xml),但我仍然怀疑这样配置支持多个Engine元素。

    我认为最好的办法是在Eclipse之外配置一个Tomcat实例,并使用其他工具(如Apache Ant)在那里打包和部署您的Web应用程序(通过复制文件+依靠自动部署,或使用{ {3}}将应用程序部署到正在运行的Tomcat实例上。

    如果您不需要将这些Web服务放在同一个JVM上,只需在Eclipse中配置多个Server实例并并行启动它们。 (当然,他们的端口号必须不同)。

答案 1 :(得分:2)

我假设您使用Server插件从Eclipse运行Tomcat。 请注意,插件可能会有一些魔力。例如。它会将appBase设置为第一个<Host>元素的wtpwebapps。

因此,配置中的第一个Host元素(/Service[@name="reciver"]/Engine/Host)的属性隐式设置为appBase =&#34; wtpwebapps&#34;而第二个Host元素(/Service[@name="reciver2"]/Engine/Host)有appBase =&#34; webapps&#34;。所以对于第二个主机,找不到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 =&#34; wtpwebapps&#34;到第二台主机,但这将使两个端口8080和8081上的两个webapp都可用。

2)通过向<Service name="reciver"...添加第二个连接器并删除第二个服务,获得与1)相同的结果。

3)添加第三个服务,一个由eclipse配置,另外两个由你控制,比较下面的配置。这使得Eclipse可以配置第一个服务,并在另外两个端口8080和8081上公开不同的Web应用程序,但缺点是在8888上同时提供了两个Web应用程序。

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>

答案 2 :(得分:-1)

阅读server.xml配置并查看Apache Tomcat 8官方文档:

我可以告诉您以下内容:您的ServerServiceEngine配置似乎正确。

但是,Host个配置都缺少 appBase 属性,在官方文档中标记为强制Context docBase 属性相同,是强制性的,在示例配置中不存在。 (编辑:感谢@EJP发表评论)

此外,Context配置声明了以下 docBase 属性:

  

此Web应用程序的文档库(也称为上下文根)目录,或Web应用程序存档文件的路径名(如果此Web应用程序直接从WAR文件执行) 。您可以为此目录或WAR文件指定绝对路径名,也可以指定相对于拥有主机的appBase目录的路径名。

我在您的示例配置中看不到它们。

另一方面,官方文件指出Context以下内容:

  

不建议放置&lt; Context&gt;元素直接在server.xml文件中。这是因为它使得修改 Context 配置更具侵入性,因为在不重新启动Tomcat的情况下无法重新加载主conf/server.xml文件。

因此,请检查您的配置,因为我发现了一些可能导致您org.apache.catalina.LifecycleException: A child container failed during start

的错误

答案 3 :(得分:-3)

这是主要原因:

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

您可以在此修复Issue with ContextLoaderListener