使用xsbt-web-plugin运行WAR时依赖缺失及配置报错求助
解决xsbt-web-plugin运行WAR时的依赖缺失与JMX警告问题
嘿,我来帮你搞定这个问题!你遇到的核心问题是依赖范围配置错误加上插件的运行命令用错了,咱们一步步拆解解决:
1. 修正依赖范围,让运行时能拿到关键jar包
你提到的两个依赖,tomcat-jdbc-pool和javax.servlet-api的范围不能一概而论:
javax.servlet-api:用Provided是对的,因为webapp-runner本身会自带这个API,不需要打包到WAR里;tomcat-jdbc-pool:绝对不能用Provided!webapp-runner不会自带这个连接池组件,必须让它出现在运行时类路径里,所以得用Runtime或者Compile范围。
在你的build.sbt里这么配置:
// Servlet API 由webapp-runner提供,标记为Provided libraryDependencies += "javax.servlet" % "javax.servlet-api" % "4.0.1" % Provided // Tomcat连接池需要在运行时可用,标记为Runtime libraryDependencies += "org.apache.tomcat" % "tomcat-jdbc-pool" % "9.0.65" % Runtime
2. 用正确的命令启动web容器
你说的container配置不存在,是因为新版的xsbt-web-plugin已经废弃了这个旧配置,现在要用web前缀的任务。首先确保你的project/plugins.sbt里引入了对应sbt版本的插件(比如sbt 1.x用4.x版本的插件):
addSbtPlugin("com.earldouglas" % "xsbt-web-plugin" % "4.2.0")
然后启动应用的正确命令是:
sbt web:run
这个命令会自动把你标记为Runtime的依赖(比如tomcat-jdbc-pool)加入到webapp-runner的类路径里,不会再出现找不到类的问题。
3. 消除JMX注册失败的警告
那个JMX警告的根源就是tomcat-jdbc-pool没在运行时类路径里,导致DataSourceFactory找不到。按照上面的依赖配置调整后,这个警告会自动消失,因为连接池组件已经能被正确加载了。
额外检查项
- 如果你用了
sbt-assembly打包WAR,要确保assembly配置没有排除Runtime范围的依赖; - 要是你以后手动部署WAR到外部Tomcat容器,可以把
tomcat-jdbc-pool放到Tomcat的lib目录下,这时再把它的依赖范围改成Provided就行,但用webapp-runner运行时必须保持Runtime。
内容的提问来源于stack exchange,提问作者Rashid Shaikh
相关产品推荐
相关产品推荐

