Tomcat10环境下javac编译Servlet时ClassPath配置不生效问题排查
编译报错根因与修复方案
核心报错来源
- Tomcat 10 规范版本不匹配
Tomcat 10 及以上版本适配Jakarta EE规范,原javax开头的Servlet API包路径全部替换为jakarta开头。你代码中导入的javax.servlet.*、javax.servlet.http.*属于Tomcat 9及更早版本的API,与当前引入的servlet-api.jar内的类结构完全不对应,必然出现“找不到包、找不到类”的报错。 - JSON相关依赖完全缺失且导入路径错误
代码中导入的org.apache.json.util.*及对应JSONObject类,既不在Tomcat自带的jar包范围内,也没有被纳入javac的classpath参数,编译器没有渠道获取该类的定义。同时该导入路径本身存在偏差,目前主流JSON工具包不存在org.apache.json.util的标准包结构,常见的org.json工具包对应类路径为org.json.JSONObject,Apache系Johnzon工具包的对应类路径为org.apache.johnzon.*,路径不匹配就算放入jar包也无法识别。 - 命令格式的兼容性问题
你在控制台中拆分两行写javac命令,如果使用的是传统CMD,没有配置续行符^会导致命令参数解析中断;即便是支持自动引号续行的PowerShell,跨换行写复杂参数也容易出现引号不匹配、路径识别错误的问题。同时你当前的classpath配置里重复写入了两个.路径,属于无效冗余配置。
修复操作步骤
- 修正代码内的Servlet导入语句,将原有javax开头的导入全部替换为jakarta开头:
// 删除原错误导入 // import javax.servlet.*; // import javax.servlet.http.*; // 替换为匹配Tomcat10的导入 import jakarta.servlet.*; import jakarta.servlet.http.*; - 修正JSON相关的导入语句,将
import org.apache.json.util.*;替换为和实际使用的JSON工具包完全匹配的路径(如使用org.json工具包则写import org.json.JSONObject;),并将对应的JSON jar包放置在项目的WEB-INF/lib目录下,编译时将该路径加入classpath。 - 调整javac命令为单行可执行格式,修正后参考写法:
javac -cp ".;D:/Tomcat/apache-tomcat-10.0.2/lib/servlet-api.jar;./lib/对应JSON工具包的jar文件名.jar" -d ./classes ./src/mypkg/HelloServlet.java - 关于编译时出现的bootstrap classpath警告:该警告是Java 11编译器检测到你指定了
-source 1.8参数但没有配套配置Java 8的引导类路径导致的,不影响编译结果。如果需要消除警告,可以去掉-source/-target参数,Java 11编译的类文件可直接被Tomcat 10正常加载运行。
内容的提问来源于stack exchange,提问作者Matthew Patriak
相关产品推荐
相关产品推荐

