Glassfish 5.1中servlet-api.jar位置及javax.servlet导入报错问题
根本原因
你全局搜不到带javax.servlet的jar包,本质是踩中了Java EE移交Eclipse基金会改名Jakarta EE的版本过渡坑:
- GlassFish 5.1本身是Java EE 8到Jakarta EE的过渡版本,你在modules目录找到的
jakarta.servlet-api.jar就是Servlet规范的对应依赖包,不用怀疑。 - 你grep整个目录搜不到
javax.servlet字符串有两种可能:要么这个jar经过OSGi模块化重打包,class字节码做了特殊封装,直接搜明文搜不到;要么你实际装的是更高版本的GlassFish(6.0+对应Jakarta EE 9+),从这个版本开始所有Servlet类的包名已经从javax.servlet全量改成了jakarta.servlet,自然搜不到旧包名的内容。
解决办法
选其中一种方案就能解决编译报错:
- 方案1:保留项目里
javax.servlet的导入写法(兼容旧Java EE项目)
不用硬扒GlassFish安装目录里的jar,直接在构建配置里引入官方提供的Servlet API依赖,注意把依赖范围设为provided——服务器运行时自带相关类,不需要把这个依赖打包进你的项目war包。
如果是Maven项目,在pom.xml里加这段依赖:
如果是Gradle项目,加这行配置即可:<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency>compileOnly 'javax.servlet:javax.servlet-api:4.0.1' - 方案2:适配当前GlassFish自带的Jakarta EE规范
把项目代码里所有import javax.servlet.*的语句全部替换成import jakarta.servlet.*,再把C:\Users\ian\GlassFish_Server\glassfish\modules路径下的jakarta.servlet-api.jar添加到项目的编译依赖路径,依赖范围同样设为provided,编译报错就会消失。
补充提示
后续新出的商用、开源应用服务器(包括GlassFish 6+、Tomcat 10+、Jetty 11+等)都已经全面切换到jakarta.*包名,不会再内置javax.servlet相关类,如果是新开发项目建议直接用Jakarta命名空间,减少后续迁移成本。
内容的提问来源于stack exchange,提问作者Ian Boyd
相关产品推荐
相关产品推荐

