我有两个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启动并在此端口上侦听时。
这是我第一次尝试这样做,我做错了什么,但我不知道我在google和stack上搜索的位置,但我还没有找到解决方案。
我在Windows 10,tomcat 8和eclipse Mars上工作。
如果你们其中一个人知道解决方案,我将非常感谢他的帮助。谢谢
答案 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以获取参考信息。
您的问题是由以下两个事实的组合引起的:
默认情况下,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元素。 (它可能会支持他们,但如果它这样做我会感到惊讶)。
在server.xml中定义Context
元素时,无法启动此上下文会导致Tomcat整体启动失败。
这是不在server.xml
中定义Context元素的原因之一。
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官方文档:
我可以告诉您以下内容:您的Server
,Service
和Engine
配置似乎正确。
但是,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