【问题标题】:Tomcat in Eclipse failed to start with JSF project [duplicate]Eclipse中的Tomcat无法启动JSF项目[重复]
【发布时间】:2016-08-22 13:28:12
【问题描述】:

我已经使用了我的“旧”(几个月前创建,当时运行良好)JSF 和 maven 应用程序,并开始进行一些重构和重组。

但是,当我做了一些,应用程序完全停止工作(在 Eclipse 中,但我担心它在普通的 Tomcat 中会类似)。

日志

当我将我的应用程序添加到 Tomcat 实例并启动服务器时,eclipse 向我显示消息“Server Tomcat 8 (evic2 emulator) failed to start.”对话框。在日志中可以看到以下异常(完整日志在这里:http://pastebin.com/YEX60a9c)(第一个异常导致服务器再抛出三个,省略,如果需要查看完整日志):

 .... 
 SEVERE: A child container failed during start
 java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/hg6web]]
    at java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.util.concurrent.FutureTask.get(FutureTask.java:192)
    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(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
 Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/hg6web]]
    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@747befb5]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
    at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:4928)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5058)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    ... 6 more
 Caused by: java.lang.IllegalArgumentException: The main resource set specified [**MYAPP**/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/hg6web] 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

 Dub 28, 2016 2:06:01 DOP. org.apache.catalina.core.ContainerBase startInternal
 SEVERE: A child container failed during start
 java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost]]
    at java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.util.concurrent.FutureTask.get(FutureTask.java:192)
    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:441)
    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(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    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[Catalina].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(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
 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

 ....

问题的根源

由于我的应用程序组件出现问题,服务器无法启动。我的应用程序的问题 - 看起来 - 是由这个异常给出的:

Caused by: java.lang.IllegalArgumentException: The main resource set specified [**MYAPP**/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/hg6web] is not valid

这意味着我的应用程序有问题,但遗憾的是没有指定什么。

我尝试了什么

经过大量谷歌搜索,我没有找到解决方案,所以我一直在尝试这些(各种组合):

  • 清理 tomcat
  • 清理 Tomcat 工作目录
  • 添加和删除
  • 干净(项目 -> 干净...
  • 使用 maven 重建 (mvn clean install)
  • 重新打开项目
  • 再次删除并导入项目
  • 删除“有问题的”文件夹**MYAPP**/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/
  • 使用 maven (mvn eclipse:clean eclipse:eclipse) 删除并重新创建项目
  • 创建新服务器并使用旧服务器代替

这些都没有帮助。我得到的“最好”的是服务器启动了,没有错误,但应用程序仍然没有正确部署,因为浏览器总是向我显示 404 页面。

我的想法

我认为问题不在于我的应用程序(同样,在重构之前它运行良好),而是在 Eclipse/Tomcat 环境中。

我的环境

我正在跑步:

  • Debian Linux,amd64
  • Oracle java 1.8.0_60
  • Eclipse Mars.1 版本 (4.5.1)
  • Apache Maven 3.0.5
  • Apache Tomcat 8.0.30

我的应用

这是我应用的pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <artifactId>hg6web</artifactId>
    <packaging>war</packaging>

    <!-- the parent project is just simple pom project -->
    <parent>
        <groupId>cz.martlin</groupId>
        <artifactId>homeguard6local</artifactId>
        <version>0.1.0</version>
    </parent>


    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <!-- JSF stuff -->
        <dependency>
            <groupId>com.sun.faces</groupId>
            <artifactId>jsf-api</artifactId>
            <version>2.2.2</version>
        </dependency>
        <dependency>
            <groupId>com.sun.faces</groupId>
            <artifactId>jsf-impl</artifactId>
            <version>2.2.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
        </dependency>

    <!-- other dependencies went here -->

    </dependencies>
    <build>
        <plugins>


            <!-- http://kosalads.blogspot.cz/2014/03/maven-deploy-war-in-tomcat-7.html -->
            <!-- Tomcat plugin -->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <path>/${project.build.name}</path>
                    <update>true</update>
                    <url>http://localhost:8080/manager/text</url>
                    <username>***username***</username>
                    <password>***password***</password>
                </configuration>
            </plugin>
        </plugins>
    </build>    
</project>

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5">
    <display-name>hg6web</display-name>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>

    <context-param>
        <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>client</param-value>
    </context-param>
    <context-param>
        <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
        <param-value>resources.application</param-value>
    </context-param>

    <listener>
        <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
    </listener>

    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>

    <welcome-file-list>
        <welcome-file>index.xhtml</welcome-file>
    </welcome-file-list>

</web-app>

我的应用程序的项目方面 (https://www.dropbox.com/s/5kvz87ooc1ftzpb/hg6web-facets.png?dl=0) 是

  • 动态 Web 模块 3.1
  • Java 1.8
  • JavaScript 1.0
  • JavaServerFaces 2.2

请注意,Eclipse 在Problems 面板中显示以下错误元组:

  • 无法将项目构面动态 Web 模块的版本更改为 2.5。
  • 一个或多个约束条件未得到满足。

但是,无论应用程序是否正常运行,我都会看到此错误。

问题

有人遇到过这个问题吗?有人可以建议我尝试其他方法吗?或者我的项目设置有什么问题吗?

谢谢

【问题讨论】:

  • @Martin,感谢您在尝试的不同方法上所做的努力,1) 您能否尝试使用 Cargo-maven2-plugin 进行 WAR 部署,因为它最适合Tomcat 8+ 服务器部署.. 2) 如果您还没有作为 Maven 项目导入,请这样做!让知道结果,如果它有效将更新答案。
  • 您的 web.xml 声明了 Servlet 2.5 而不是 3.1,并且您的 pom.xml 告诉 Maven 应该在 WAR 部署中包含 Servlet 3.0.1 库。两者都是完全错误的。 Tomcat 8 是一个 Servlet 3.1 容器(它已经单独提供了 Servlet 3.1 库)。修复您的 web.xml 以匹配 Servlet 3.1 并修复 pom.xml 以告诉 Maven Servlet 3.1 库已经是目标运行时的provided。至少,这可能会修复您的 Eclipse Problems 面板,但不太可能修复根异常。无论如何都要试一试,这样我们就可以排除一个配置错误的项目。
  • 谢谢你,@BalusC,它有效!

标签: eclipse maven jsf tomcat exception


【解决方案1】:

@BalusC 的通知解决了这个问题。

我一直在使用 Servlet 版本 3.0 (3.0.1)(使用 maven 依赖项),但 web.xml 已针对 2.5 进行了配置,并且 Tomcat 8 适用于 3.1。

所以,我将 javax.servlet-api 的版本更改为 3.1.0,将 web.xml 更新为 servlet 的版本(请参阅 this post)并且它可以工作。

【讨论】:

  • 你需要确保依赖被&lt;scope&gt;provided&lt;/scope&gt;标记为“已经由目标运行时提供”。
猜你喜欢
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
  • 2014-04-24
  • 2015-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多