IntelliJ IDEA 无法解析导入 javax.servlet.*;
Posted
技术标签:
【中文标题】IntelliJ IDEA 无法解析导入 javax.servlet.*;【英文标题】:IntelliJ IDEA cannot resolve import javax.servlet.*; 【发布时间】:2014-10-24 16:44:43 【问题描述】:所以我的项目运行良好,我决定安装一个新的硬盘驱动器 (SSD),但现在我无法让它正常运行。
我正在使用 Intellij,但所有这些导入都有问题。
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
他们说无法解析符号。
我的 web.xml 中也有这个。
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.mkyong.LoginFilter</filter-class>
</filter>
说明
com.mkyong.LoginFilter is not assignable to javax.servlet.Filter
我将包含我的 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"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>JavaServerFaces</display-name>
<resource-ref>
<description>mysql Datasource example</description>
<res-ref-name>jdbc/mkyongdb</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<!-- Change to "Production" when you are ready to deploy -->
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<!-- Welcome page -->
<welcome-file-list>
<welcome-file>faces/default.xhtml</welcome-file>
</welcome-file-list>
<!-- JSF mapping -->
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map these files with JSF -->
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<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>*.faces</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.mkyong.LoginFilter</filter-class>
</filter>
<!-- Set the login filter to secure all the pages in the /secured/* path of the application -->
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/secured/*</url-pattern>
</filter-mapping>
<!-- By default go to secured welcome page -->
<welcome-file-list>
<welcome-file>secured/welcome.xhtml</welcome-file>
</welcome-file-list>
</web-app>
这是我现在遇到的错误。
javax.servlet.ServletException: Servlet.init() for servlet Faces Servlet threw exception
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:534)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1081)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)
org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:277)
org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2381)
org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2370)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.lang.Thread.run(Thread.java:745)
root cause
java.lang.IllegalStateException: Application was not properly initialized at startup, could not find Factory: javax.faces.context.FacesContextFactory
javax.faces.FactoryFinder$FactoryManager.getFactory(FactoryFinder.java:800)
javax.faces.FactoryFinder.getFactory(FactoryFinder.java:302)
javax.faces.webapp.FacesServlet.init(FacesServlet.java:186)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:534)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1081)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)
org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:277)
org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2381)
org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2370)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.lang.Thread.run(Thread.java:745)
一开始我也在使用 apache tomcat 8,然后我认为这可能是问题所在,我将其更改为 7,然后更改为 6。如果您需要其他任何内容,请告诉我!
这里是请求的 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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mkyong.common</groupId>
<artifactId>JavaServerFaces</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>JavaServerFaces Maven Webapp</name>
<url>http://maven.apache.org</url>
<repositories>
<repository>
<id>java.net.m2</id>
<name>java.net m2 repo</name>
<url>http://download.java.net/maven/2</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>3.2.5.RELEASE</version>
</dependency>
<!-- MySQL database driver -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
<!-- Spring framework -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>2.5.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>2.5.6</version>
</dependency>
<!-- For Servlet Container like Tomcat -->
<!-- http://download.java.net/maven/2 -->
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.1.0-b03</version>
</dependency>
<!-- EL 2.2 to support method parameter in EL -->
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>el-impl</artifactId>
<version>2.2</version>
</dependency>
<!-- http://repo1.maven.org/maven2/ -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
</dependencies>
<build>
<finalName>JavaServerFaces</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
【问题讨论】:
你的类路径中有 servlet-api.jar 吗? 老实说,我不是 100% 确定如何检查...。我的意思是我的库文件夹中有 3 个不同的 xml 文件,名称为 Maven_javax_el_el_api_2_2、Maven_javax_servlet_jsp_jsp_api_2_1、Maven_javax_servlet_jstl_1_2 和 Maven_javax_servlet_servlet_api_2_5 我刚刚点击了Packages,它显示我在JavaServerFaces -> Libraries -> javax -> servlet -> There is a Filter Interface....下有一个接口HttpServlet 请求。我还对有问题的单个类进行了编译,现在它告诉我 java: package javax.servlet 不存在。 你的 tomcat 类路径中有 JSF 库吗?在“WEB-INF/libs/”下的部署战争中还是在tomcat lib文件夹中? 如果您使用 maven 发布 pom.xml 将有所帮助或指定您正在使用的库 【参考方案1】:正如上面有人提到的 - 这些库是应用程序服务器的一部分,因此它们不应该像 Spring 等其他库一样部署到服务器上。您需要将它们作为提供的资源引用。
如果您的项目没有使用 Maven(即教程等),您可以转到您的项目结构设置/模块/您的模块/依赖项.. 依赖项列表下方是一个小加号 (+)您可以在其中选择“库”,然后将显示带有应用程序服务器库的弹出窗口。应按照后面提供的方式选择。
【讨论】:
【参考方案2】:servlet-api.jar 是您的服务器(在本例中为 Tomcat)的一部分。您需要在您的 POM 中声明对该 jar 的引用并将其标记在“提供”范围内,或者(如果您由于某种原因不使用 maven)您需要将其添加到您的类路径(您的 web 模块的库中项目)。
在您重新安装 HD 后,您的 Tomcat 安装 forder 或 maven repo 可能会有所不同。这似乎是一个环境问题。
【讨论】:
我手动将它添加到我的类路径中,它确实解析了 Intellij red 导入,但是如果我编译了代码,它会说 javax.servlet 不是有效的引用。或类似的规定。说它找不到 javax.servlet 还尝试重新安装 Intellij。无济于事。打算尝试重新安装 JDK 和 maven,看看会发生什么,因为我正在做任何可能的事情。 重新安装没有效果。 一定要检查模块设置>工件下的输出布局选项卡——结果我需要从WEB-INF/lib中手动删除Tomcat/lib jars。当我将全局 Tomcat 库作为模块依赖项包含在内时,Intellij 自动将这些 jar 添加到 WEB-INF/lib 下的输出工件中——即使它们被指示为“已提供”【参考方案3】:我发现了同样的问题,今天刚刚解决了。虽然我已经在 pom.xml 中声明了 javax.servlet-api 但仍然有问题。然后我通过将 javax.servlet-api:3.10.jar 文件添加到项目的类路径来修复它。
【讨论】:
【参考方案4】:你使用进入终端mvn clean install
此命令下载所有依赖项,之后,您转到“Maven Project”并选择“Reimport All Maven Project”
【讨论】:
【参考方案5】:似乎在导入项目时出现了问题。我做了一个新项目,把所有的东西都复制了一遍,效果很好。导入是在找不到 jar 文件的地方。不知道为什么....感谢大家的帮助!
【讨论】:
【参考方案6】:我知道我对这个问题的回答有点晚了,但就我而言,恰恰是因为缺少 SDK。
我通过在“项目结构”菜单中进行配置解决了这个问题。
所以,和我一样,以后可能其他人也有同样的问题,这是最简单的解决方法。
【讨论】:
【参考方案7】:对我有用的是点击下载/源代码和文档 -> 从这里重新加载 maven 项目
【讨论】:
【参考方案8】:在我的模块列表(ctrl+shift+alt+s 并导航到模块)中,我的 tomcat 的范围设置为运行时。我将它切换到编译时间并且它工作。
【讨论】:
以上是关于IntelliJ IDEA 无法解析导入 javax.servlet.*;的主要内容,如果未能解决你的问题,请参考以下文章
IntelliJ IDEA 无法解析导入 javax.servlet.*;
IntelliJ IDEA 中带有 Gradle 的 Java 项目:无法解析符号“google”但项目编译
TwirlKeys.templateImports with Play 未在 IntelliJ IDEA 模板文件中解析
Intellij IDEA 无法使用 Play 框架解析符号