Spring Boot嵌入式Tomcat Jenkins部署WebApp报错,找不到tomcat-users.xml
先把你遇到的错误日志贴出来方便对照:
FATAL: java.net.MalformedURLException: no protocol: /manager java.net.MalformedURLException: no protocol: /manager at java.net.URL.<init>(URL.java:593) at java.net.URL.<init>(URL.java:490) at java.net.URL.<init>(URL.java:439) at hudson.plugins.deploy.tomcat.TomcatAdapter.configure(TomcatAdapter.java:40) Caused: java.lang.AssertionError at hudson.plugins.deploy.tomcat.TomcatAdapter.configure(TomcatAdapter.java:43)
核心问题拆解
这个错误表面上是Jenkins部署插件使用的Tomcat Manager URL缺少协议(http/https)——比如只填了/manager而不是完整的http://xxx:port/manager/text。但你提到其他项目部署正常,且目标是嵌入式Tomcat,那问题的关键其实在:
嵌入式Tomcat和独立Tomcat完全不同,它默认不会加载tomcat-users.xml,甚至连Manager应用都没启用!这就是你找不到配置文件的根本原因。
针对嵌入式Tomcat的实操解决步骤
1. 先修正Jenkins的URL配置
哪怕是嵌入式Tomcat,只要启用了Manager,Jenkins里的Tomcat服务器配置必须填写完整带协议的Manager地址,比如:http://localhost:8080/manager/text
(端口根据你的Spring Boot配置调整,默认是8080)
2. 给嵌入式Tomcat添加Manager模块依赖
嵌入式Tomcat默认不带Manager应用,得手动引入依赖:
如果用Maven,在pom.xml中添加:
<dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-core</artifactId> <version>8.0.30</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-manager</artifactId> <version>8.0.30</version> <type>war</type> </dependency>
如果用Gradle,在build.gradle中添加:
implementation 'org.apache.tomcat.embed:tomcat-embed-core:8.0.30' implementation 'org.apache.tomcat:tomcat-manager:8.0.30'
3. 用代码配置用户权限(替代tomcat-users.xml)
嵌入式Tomcat没有默认的tomcat-users.xml,咱们可以通过配置类创建内存用户并分配权限:
import org.apache.catalina.realm.MemoryRealm; import org.apache.catalina.users.MemoryUserDatabase; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class TomcatConfig { @Bean public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() { return factory -> { factory.addContextCustomizers(context -> { // 创建内存用户数据库,禁用文件加载 MemoryUserDatabase userDb = new MemoryUserDatabase(); userDb.setPathname(""); // 添加Jenkins部署专用用户,替换为你的实际密码 userDb.addUser("jenkins", "your-secure-password"); // 分配部署所需的权限 userDb.addRole("jenkins", "manager-script"); userDb.addRole("jenkins", "manager-gui"); // 关联到Tomcat权限验证体系 MemoryRealm realm = new MemoryRealm(); realm.setUserDatabase(userDb); context.setRealm(realm); }); }; } }
这里给jenkins用户分配了manager-script(Jenkins脚本部署必需权限)和manager-gui(方便手动验证),记得替换密码为实际值。
4. 验证Manager应用是否正常启用
启动Spring Boot应用后,访问http://localhost:8080/manager/html,用刚才配置的用户名密码登录,如果能正常进入管理页面,说明Manager应用和权限配置都没问题。
5. 最后确认Jenkins部署配置
进入Jenkins的「系统管理」→「系统设置」,找到Tomcat服务器配置项:
- 确认URL是完整带协议的地址,比如
http://localhost:8080/manager/text - 填入刚才配置的用户名和密码
- 保存后重新尝试部署WebApp项目
额外注意事项
- 如果你的Spring Boot配置了上下文路径(
server.servlet.context-path),记得在Manager URL中加上,比如http://localhost:8080/your-app-context/manager/text - 检查嵌入式Tomcat的端口和Jenkins配置的是否一致,避免端口冲突
- 如果是远程部署,确保Jenkins服务器能访问到嵌入式Tomcat所在主机,没有防火墙或网络拦截
内容的提问来源于stack exchange,提问作者임진욱

