NetBeans 12.3运行Java Web项目报Servlet Allocate异常如何解决
问题描述
我是Java编程新手,在做JSP/数据库相关练习时遇到了问题。我有一个项目在NetBeans 8.2中打开运行完全正常,但在NetBeans 12.3中运行时Servlet无法正常工作(该项目在NetBeans 11版本中可以正常运行),我全程使用GlassFish作为服务器。
即便是使用默认内容创建的测试Servlet也会抛出相同错误,我想知道当前使用的版本中出现该错误的原因,以便修复问题。
报错信息
浏览器端报错

GlassFish服务器端报错

配置信息
web.xml配置
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"> <servlet> <servlet-name>Prueba</servlet-name> <servlet-class>controlador.Prueba</servlet-class> </servlet> <servlet> <servlet-name>Login</servlet-name> <servlet-class>controlador.Login</servlet-class> </servlet> <servlet> <servlet-name>Registrar</servlet-name> <servlet-class>controlador.Registrar</servlet-class> </servlet> <servlet> <servlet-name>CrearPelicula</servlet-name> <servlet-class>controlador.CrearPelicula</servlet-class> </servlet> <servlet> <servlet-name>EliminarPelicula</servlet-name> <servlet-class>controlador.EliminarPelicula</servlet-class> </servlet> <servlet> <servlet-name>CerrarSesion</servlet-name> <servlet-class>controlador.CerrarSesion</servlet-class> </servlet> <servlet-mapping> <servlet-name>Prueba</servlet-name> <url-pattern>/prueba</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Login</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Registrar</servlet-name> <url-pattern>/registrar</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>CrearPelicula</servlet-name> <url-pattern>/crearPelicula</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>EliminarPelicula</servlet-name> <url-pattern>/eliminarPelicula</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>CerrarSesion</servlet-name> <url-pattern>/cerrarSesion</url-pattern> </servlet-mapping> <session-config> <session-timeout> 30 </session-timeout> </session-config> </web-app>
问题原因与解决方案
核心原因
该问题是NetBeans 12.3默认的Jakarta EE 9+ 兼容性配置和你项目使用的Java EE 8/Servlet 3.1规范不兼容导致的:
- NetBeans 8.2、11版本默认支持Java EE 8规范,Servlet相关API包名为
javax.servlet.* - NetBeans 12.3开始默认优先适配Jakarta EE 9+规范,该版本把所有Java EE的包名从
javax.*重命名为jakarta.*,而你项目里的Servlet代码用的还是javax.servlet相关的导入,GlassFish在加载时找不到对应的类就会抛出类加载异常。
修复方案
方案1:调整NetBeans项目的服务器适配规则(推荐,无需修改代码)
- 右键点击项目名称,选择「属性」
- 找到「运行」分类,确认选中的GlassFish服务器版本是支持Java EE 8的版本(GlassFish 5.x及以下支持Java EE 8,GlassFish 6.x及以上仅支持Jakarta EE 9+)
- 切换到「源」分类,将「Java EE版本」设置为「Java EE 8」或者「Servlet 3.1」,不要选Jakarta EE相关的版本
- 清理并重新构建项目后重新运行即可。
方案2:如果要继续使用高版本GlassFish(6.x+),需要修改代码导入
将所有Servlet相关的导入语句从javax.servlet.*替换为jakarta.servlet.*即可,其他业务逻辑无需修改。
额外排查点
如果执行上述操作后仍然报错,检查项目的依赖库:
- 确认项目没有手动引入多余的
servlet-api包,Servlet API应该由GlassFish服务器提供,不要打包到项目的WEB-INF/lib目录下 - 检查NetBeans 12.3的全局服务器配置,确认你添加的GlassFish服务器的版本识别正常,没有被识别为Jakarta EE版本。
内容的提问来源于stack exchange,提问作者Isaías Carreño G
相关产品推荐
相关产品推荐

