【问题标题】:Error Deploying .war file with Spring Framework使用 Spring Framework 部署 .war 文件时出错
【发布时间】:2017-09-23 17:20:46
【问题描述】:

应用程序使用 Spring Framework,它需要有一个名为 config.path 的环境变量,这可以在名为 web.xml 的文件中进行配置。它看起来像这样:

<!-- Creates the Spring Container shared by all Servlets and Filters -->

<!-- *** Opcional, si no se quiere arrancar la aplicación con ninguna JAVA_OPT *** -->
<!-- context-param>
    <param-name>config.path</param-name>
    <param-value>ruta_absoluta_carpeta_ficheros_configuracion</param-value>
</context-param-->

<listener>
    <listener-class>es.mpt.dsic.inside.ws.configuration.ConfigLoaderListener</listener-class>       
</listener>

<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>file:${config.path}/log4j.properties</param-value>     
</context-param>

<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>


<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        classpath:es/mpt/dsic/inside/context/inside-ws-context.xml,
        /WEB-INF/mvc-dispatcher-servlet.xml,
        classpath:es/mpt/dsic/inside/context/inside-security-context.xml,
        classpath:es/mpt/dsic/inside/context/inside-context.xml
    </param-value>
</context-param>

<servlet>
    <servlet-name>CXFServlet</servlet-name>
    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>CXFServlet</servlet-name>
    <url-pattern>/ws/*</url-pattern>
</servlet-mapping>

<!-- Spring MVC -->
<servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<!-- Spring Security -->
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>


<!-- Spring encoding obligando a utf-8 -->
<filter>  
    <filter-name>encodingFilter</filter-name>  
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
    <init-param>  
       <param-name>encoding</param-name>  
       <param-value>UTF-8</param-value>  
    </init-param>  
    <init-param>  
       <param-name>forceEncoding</param-name>  
       <param-value>true</param-value>  
    </init-param>  
</filter>  
<filter-mapping>  
    <filter-name>encodingFilter</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping> 


<!-- Firma Trifasica -->
<servlet>
    <description>Servicio de firma electronica en 3 fases v2.1</description>
    <servlet-name>SignatureService</servlet-name>
    <servlet-class>es.gob.afirma.triphase.server.SignatureService</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>SignatureService</servlet-name>
    <url-pattern>/SignatureService</url-pattern>
</servlet-mapping>

我是这样设置的:

<context-param>
    <param-name>config.path</param-name>
    <param-value>/var/lib/tomcat8/webapps/aplicacion/resources/config</param-value>
</context-param>

我的问题是,如果我让这些行注释并尝试部署应用程序,我会在 catalina.out 收到此错误:

信息: Despliegue del archivo /var/lib/tomcat8/webapps/inside.war de la aplicación web 2017 年 1 月 25 日下午 1:51:12 org.apache.jasper.servlet.TldScanner scanJars INFORMACIÓN: Al menos un JAR, que se ha explorado buscando TLDs, aún no contenía TLDs。 Activar historial de depuración para este historiador para una completa lista de los JARs que fueron explorados y de los que nos se halló TLDs。 Saltarse JARs no necesarios durante la exploración puede dar lugar a una mejora de tiempo significativa en el arranque y compilación de JSP 。 调试:setDebug:JavaMail 版本 1.4ea 13:51:16,880 错误 ContextLoader:308 - 上下文初始化失败 java.lang.IllegalArgumentException:无法解析占位符“config.path” 在 org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:173) 在 org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:125) 在 org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:151) 在 org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:142) 在 org.springframework.core.env.AbstractEnvironment.resolveRequiredPlaceholders(AbstractEnvironment.java:440) 在 org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:188) 在 org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:149) 在 org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:126) 在 org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:263) 在 org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:203) 在 org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:617) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:446) 在 org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:385) 在 org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:284) 在 org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111) 在 org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4812) 在 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5255) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147) 在 org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725) 在 org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701) 在 org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717) 在 org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:939) 在 org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1812) 在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:745) 2017 年 1 月 25 日下午 1:51:16 org.apache.catalina.core.StandardContext startInternal GRAVE:一个或多个侦听器无法启动。完整的详细信息将在相应的容器日志文件中找到 2017 年 1 月 25 日下午 1:51:16 org.apache.catalina.core.StandardContext startInternal GRAVE: Falló en arranque del Contexto [/inside] debido a errores previos 13:51:16,938 WARN XmlWebApplicationContext:1028 - ApplicationListener 处理 ContextClosedEvent 引发的异常 java.lang.IllegalStateException:ApplicationEventMulticaster 未初始化 - 在通过上下文多播事件之前调用“刷新”:Root WebApplicationContext:启动日期 [Tue Apr 25 13:51:12 CEST 2017];上下文层次的根 在 org.springframework.context.support.AbstractApplicationContext.getApplicationEventMulticaster(AbstractApplicationContext.java:337) 在 org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:324) 在 org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1025) 在 org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:988) 在 org.springframework.web.context.ContextLoader.closeWebApplicationContext(ContextLoader.java:556) 在 org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:142) 在 org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4859) 在 org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5478) 在 org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:224) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:159) 在 org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725) 在 org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701) 在 org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717) 在 org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:939) 在 org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1812) 在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:745) 13:51:16,939 WARN XmlWebApplicationContext:1036 - 在上下文关闭时从 LifecycleProcessor 抛出异常 java.lang.IllegalStateException:LifecycleProcessor 未初始化 - 在通过上下文调用生命周期方法之前调用“刷新”:Root WebApplicationContext:启动日期 [Tue Apr 25 13:51:12 CEST 2017];上下文层次的根 在 org.springframework.context.support.AbstractApplicationContext.getLifecycleProcessor(AbstractApplicationContext.java:350) 在 org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1033) 在 org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:988) 在 org.springframework.web.context.ContextLoader.closeWebApplicationContext(ContextLoader.java:556) 在 org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:142) 在 org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4859) 在 org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5478) 在 org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:224) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:159) 在 org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725) 在 org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701) 在 org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717) 在 org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:939) 在 org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1812) 在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:745) 2017 年 1 月 25 日下午 1:51:17 org.apache.catalina.startup.HostConfig deployWAR 信息:Web 应用程序存档 /var/lib/tomcat8/webapps/inside.war 的部署已在 8.323 毫秒内完成

但是如果这些行没有被注释,tomcat 不会启动并且 catalina.out 会显示这个:

2017 年 1 月 25 日下午 12:10:08 org.apache.jasper.servlet.TldScanner scanJars
INFORMACIÓN: Al menos un JAR, que se ha explorado buscando TLDs, aún no contenía TLDs。 Activar historial de depuración para este historiador para una completa lista de los JARs que fueron explorados y de los que nos se halló TLDs。 Saltarse JARs no necesarios durante la exploración puede dar lugar a una mejora de tiempo significativa en el arranque y compilación de JSP 。
调试:setDebug:JavaMail 版本 1.4ea

我知道这是关于配置的,但我不知道如何进行

注意: 从来没有使用过 .war 文件,所以我有点迷茫。我用的是tomcat8。

【问题讨论】:

  • 我们也不知道如何进行,因为您还没有指定您真正想要的内容。您的应用程序依赖于配置值,如果未定义,则会出现异常。这不是预期的吗?
  • 我想知道为什么当我配置这些行时它没有部署应用程序,tomcat 在部署时“卡住”了。顺便说一句,这不是我的应用程序,我下载了该应用程序以在我们的网络中实现它。
  • 它没有部署,因为它的配置依赖于这些值。

标签: java spring


【解决方案1】:

这一行

<param-value>file:${config.path}/log4j.properties</param-value>  

期望有一个 java 系统参数被指定,你在 Tomcat 中通过添加到 catalina.sh 中的 JAVA_OPTS 来执行此操作,所以你需要这样的东西:

JAVA_OPTS='-Xmx256m -Djava.awt.headless=true -Dconfig.path=/var/lib/tomcat8/webapps/aplicacion/resources/config' 

从 tomcat7 中提取 catalina.sh 如下:

#   JAVA_OPTS       (Optional) Java runtime options used when any command
#                   is executed.
#                   Include here and not in CATALINA_OPTS all options, that
#                   should be used by Tomcat and also by the stop process,
#                   the version command etc.
#                   Most options should go into CATALINA_OPTS.
#

【讨论】:

  • 我已将 /etc/init.d/tomcat8 编辑为具有这样的默认 java 选项: JAVA_OPTS="-Dconfig.path=/var/lib/tomcat8/aplicacion/resources/config -Djava .awt.headless=true -Xmx128M"
  • @JavierSanz 我认为它需要在你的 catalina.sh 中,试试看。
  • 我已经更新了我的答案,它在我的 catalina.sh 中,如果你在 Windows 上,它将在 catalina.bat 中。
  • 好的,找到行并尝试您所说的,我得到的效果与我在 web.xml 中使用 contect 参数(未注释)时相同。 Tomcat 在部署应用时卡住了
猜你喜欢
  • 2013-06-01
  • 2015-05-08
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多