Maven WAR Build for Tomcat:“无法打开ServletContext资源”

关于这个话题已经有一些问题了,但是我的Tomcat运行还不顺畅。
我的工作空间包括jsf和spring。 只要我在Eclipse中构build和运行locale中的项目并将其部署到Eclipse中的Tomcat中,一切都运行良好。 但是现在我想将war文件部署到外部Tomcat中,在我的情况下是Docker-Container中的Tomcat。

所以我做的是:
*使用以下Maven-pom(摘录)构buildWAR文件。
*并将战争文件复制到我的正在运行的容器,如下所示:

docker cp projectName.war containerID:/ usr / local / tomcat / webapps /

在Tomcat启动期间,我总是得到以下错误。

一开始,我已经将applicationContext.xml文件直接放在WEB-INF文件夹中。 但是我知道在“\ WEB-INF \ classes”中使用它会更好,所以我将它移动到那里,并在web.xml中执行了以下context-Location-parameter。

所以工作空间的Hierarchy看起来像下面的图片projectName
| – 网页内容
| – WEB-INF
| – pom.xml

另一件事是,当我在构build之后提取war文件以查看applicationContext.xml文件的实际位置时,我在“\ WEB-INF \ classes”中find了它,但是在web中的context-Location-parameter .xml缺lessfind它。 我也试着把applicationContext.xml -File的副本放到src / main / resources中 ,这导致,这个文件位于WAR文件的正确位置,但web.xml改变了。

有人build议在何处放置applicationContext.xml文件,以及如何在构build过程中包含和指向正确的方法。 此外,为什么web.xml在构build过程中发生变化。 还是有一个完全不同的问题?

感谢帮助。

的pom.xml

<version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <properties> <jsf.version>2.2.14</jsf.version> <spring.version>4.3.6.RELEASE</spring.version> </properties> <dependencies> <dependency> <groupId>com.sun.faces</groupId> <artifactId>jsf-api</artifactId> <version>${jsf.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.sun.faces</groupId> <artifactId>jsf-impl</artifactId> <version>${jsf.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <!-- JSF Ende --> <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <version>6.1.0.jre8</version> </dependency> <!-- Spring Start --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <!-- Spring Ende --> </dependencies> <build> <finalName>projectName</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.6.1</version> <configuration> <!--<webXml>WebContent\WEB-INF\web.xml</webXml>--> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> 

启动错误

 2017-02-24 03:15:44 ERROR ContextLoader:351 - Context initialization failed org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from ServletContext resource [/WEB-INF/applicationContext.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/applicationContext.xml] at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:344) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:217) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188) at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125) at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94) at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129) at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:613) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:514) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4853) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5314) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:753) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:729) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717) at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:940) at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1816) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) at java.util.concurrent.FutureTask.run(FutureTask.java:262) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745) Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/applicationContext.xml] at org.springframework.web.context.support.ServletContextResource.getInputStream(ServletContextResource.java:141) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:330) ... 25 more 24-Feb-2017 03:15:44.613 SEVERE [localhost-startStop-2] org.apache.catalina.core.StandardContext.startInternal One or more listeners failed to start. Full details will be found in the appropriate container log file 24-Feb-2017 03:15:44.614 SEVERE [localhost-startStop-2] org.apache.catalina.core.StandardContext.startInternal Context [/projectName] startup failed due to previous errors 2017-02-24 03:15:44 INFO XmlWebApplicationContext:987 - Closing Root WebApplicationContext: startup date [Fri Feb 24 03:15:44 UTC 2017]; root of context hierarchy 2017-02-24 03:15:44 WARN XmlWebApplicationContext:1005 - Exception thrown from LifecycleProcessor on context close java.lang.IllegalStateException: LifecycleProcessor not initialized - call 'refresh' before invoking lifecycle methods via the context: Root WebApplicationContext: startup date [Fri Feb 24 03:15:44 UTC 2017]; root of context hierarchy at org.springframework.context.support.AbstractApplicationContext.getLifecycleProcessor(AbstractApplicationContext.java:417) at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1002) at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:961) at org.springframework.web.context.ContextLoader.closeWebApplicationContext(ContextLoader.java:581) at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:116) at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4900) at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5537) at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:221) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:149) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:753) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:729) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717) at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:940) at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1816) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) at java.util.concurrent.FutureTask.run(FutureTask.java:262) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745) 24-Feb-2017 03:15:44.622 INFO [localhost-startStop-2] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive 

web.xml中

  <!-- Add Support for Spring --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/classes/applicationContext.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <listener> <listener-class> org.springframework.web.context.request.RequestContextListener </listener-class> </listener> 

工作区的层次结构

过了一会儿,我做了。

  1. “maven clean”是因为一些依赖关系老旧无效。 这就是为什么web.xml在构build过程中没有更改
  2. JSF依赖关系是需要的,所以没有更多的“提供”
  3. Docker容器有一个JDK 7,但我的应用程序是用JDK 8构build的,所以我将容器更改为一个带有JDK 8的Tomcat 8
  4. 需要告诉Maven-Build web.xml文件在哪里,哪些文件应该包含在WAR-Build中。 我用下面的Maven-Plugin做了这个:(也不要忘了添加Maven Dependencies到Eclipse中的部署程序集)

Maven的战争插件

 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.0.0</version> <configuration> <warSourceDirectory>WebContent</warSourceDirectory> <webXml>WebContent\WEB-INF\web.xml</webXml> </configuration> </plugin> 

玩的开心