You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者임진욱

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:34:51