无法使用从相同 Maven 原型创建的两个 SpringMVC webapps 启动 Tomcat 服务器

Posted

技术标签:

【中文标题】无法使用从相同 Maven 原型创建的两个 SpringMVC webapps 启动 Tomcat 服务器【英文标题】:Unable to start Tomcat server with two SpringMVC webapps that are created from same maven archetype 【发布时间】:2013-09-03 19:08:45 【问题描述】:

我使用 spring-mvc-quickstart-archetype(包括 spring mvc、spring security、hibernate)创建了两个 Spring MVC 应用程序,我可以在 tomcat 上单独运行每个应用程序,但不能一起运行。

当我将两个项目都添加到 Tomcat 时,服务器不会出现,我明白了

Aug 30, 2013 8:14:48 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring FrameworkServlet 'appServlet'

然后下一行是红色文本中的错误如下,然后服务器被终止

Exception in thread "main" 

我在 logback.xml 上将 Spring 日志级别启用为 DEBUG,它会写入一堆带有 DEBUG 和 INFO 的日志消息,但没有任何带有 WARN 或 ERROR 的日志消息显示对内部发生的事情的任何洞察。

有没有人遇到过这个问题并找到了解决办法?

按照建议添加日志

Sep 13, 2013 8:20:24 AM org.apache.catalina.core.AprLifecycleListener init 
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Programs\Java\jdk1.7.0_21\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:/Programs/Java/jdk1.6.0_32/bin/../jre/bin/server;C:/Programs/Java/jdk1.6.0_32/bin/../jre/bin;C:/Programs/Java/jdk1.6.0_32/bin/../jre/lib/amd64;c:\Python27;C:\Programs\Java\jdk1.6.0_32\bin;C:\Programs\apache-maven-3.0.4\bin;c:\Programs\mongodb243\bin;C:\Program Files\Common Files\Microsoft Shared\Windows Live;C:\Program Files (x86)\Common Files\Microsoft Shared\Windows Live;C:\oraclexe\app\oracle\product\10.2.0\server\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Windows Live\Shared;C:\Programs\eclipse-jee-juno -with-SpringToolSuit;;.
Sep 13, 2013 8:20:24 AM org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]Server/Service/Engine/Host/Context Setting property 'source' to 'org.eclipse.jst.jee.server:shows' did not find a matching property.
Sep 13, 2013 8:20:24 AM org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]Server/Service/Engine/Host/Context Setting property 'source' to 'org.eclipse.jst.jee.server:com.maha.science.web' did not find a matching property.
Sep 13, 2013 8:20:24 AM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-bio-7080"]
Sep 13, 2013 8:20:24 AM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-bio-7009"]
Sep 13, 2013 8:20:24 AM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 705 ms
Sep 13, 2013 8:20:25 AM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
Sep 13, 2013 8:20:25 AM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.25
Sep 13, 2013 8:20:31 AM org.apache.catalina.core.ApplicationContext log
INFO: Spring WebApplicationInitializers detected on classpath:   [com.maha.science.config.WebAppInitializer@c2854c7]
Sep 13, 2013 8:20:31 AM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring root WebApplicationContext
Sep 13, 2013 8:20:35 AM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring FrameworkServlet 'appServlet1'
Exception in thread "main" 

【问题讨论】:

这两个应用程序是否具有相同的 servlet 名称.. ? 正在使用 WebAppInitializer,是的,我看到两个项目上的 DispacherServlet 被命名(appServlet)相同 部署两个同名 servlet 的应用程序会导致 tomcat 出现严重问题。尝试更改其中一个 servlet 的名称。 在您的 web.xml 中添加以下 <context-param> <param-name>webAppRootKey</param-name> <param-value>app.root</param-value> </context-param> 值对于每个应用程序应该是唯一的。 【参考方案1】:

经过一段时间的努力,这个问题终于得到了解决,我写的这篇文章对我有用,希望它能帮助遇到类似情况的其他人。

在尝试使用 logback,xml 时 已提供有关实际错误的更多信息

SEVERE: A child container failed during start
java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: PermGen space
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:252)
at java.util.concurrent.FutureTask.get(FutureTask.java:111)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1130)
at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:293)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)

看起来 webapp 与 hibernate、spring 和其他库很重有一个 permgen 空间问题,所以我将 VM 参数添加到服务器,如下所示

-XX:MaxPermSize=128m

双击服务器并打开启动配置,在虚拟机参数部分添加上述参数,这很神奇。

我已经恢复了之前为 appServlet 提供唯一 servlet 名称的更改,并删除了唯一的 webAppRootKey 作为上下文参数,它仍然有效。

总而言之,只要我们将-XX:MaxPermSize=128m 参数设置为服务器启动,我们就可以在一个 tomcat 服务器上运行从同一个 maven 快速启动创建的多个 web 应用程序,而不会出现任何问题。

【讨论】:

【参考方案2】:

文卡特,

您需要为每个应用指定不同的根密钥。

如果您使用 XML 配置,则使用 Karthikenyan 的方法,在每个 web.xml 中指定不同的值:

<context-param>
    <param-name>webAppRootKey</param-name>
    <param-value>thisisdistinctforeachwebapp</param-value>
</context-param>

如果您使用的是无 XML 配置(实现 WebApplicationInitializer),则只需一行代码:

servletContext.setInitParameter("webAppRootKey", "thisisdistinctforeachwebapp"); 

HTH

【讨论】:

感谢您的详细回答,由于某种原因,我仍然在线程“main”中收到异常,快速入门包含 spring 安全性,也集成了休眠,这会导致问题吗? 我没有看到任何错误消息,除了 Thread main 中的异常,我现在发布了我在问题中得到的日志 日志中的那些警告怎么样? ***.com/questions/104854/… 否则您需要获取有关异常根源的更详细信息。检查 Tomcat 的日志以及应用程序的日志。

以上是关于无法使用从相同 Maven 原型创建的两个 SpringMVC webapps 启动 Tomcat 服务器的主要内容,如果未能解决你的问题,请参考以下文章

maven 在我的存储库中找不到原型

克隆原型设计模式的功能?

Maven:如何在项目生成后从原型中删除一些文件?

05 创建型原型模式 理解克隆对象~

如何在 NetBeans 8.2 中使用 Spring 5.0?

无法从 springsource 中的原型创建项目