学习Java Web,学到将WAR包部署到Tomcat中时,遇到一个问题。

部署WAR包的过程本身没什么问题,把.war文件放在<Tomcat安装目录>/webapps/中,然后修改<Tomcat安装目录>/conf/server.xml,过程很顺利。因为是部署多个WebApp,每个WebApp都是基于根路径开发的,所以就在<Host name="localhost">后面增加了几个<Host>

<Host name="localhost" ……>
……
</Host> <Host name="my-web-app.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context docBase="my-web-app" path="/" />
</Host> ……

通过startup.bat启动Tomcat,部署的WebApp都能正常访问。

但是,再回到IDEA中(自己手动启动的Tomcat进程已关闭),通过IDEA启动Tomcat就报错了,关键日志如下:

……
Caused by: java.lang.IllegalArgumentException: 指定的主资源集 [C:\Users\tianlin\AppData\Local\JetBrains\IntelliJIdea2021.2\tomcat\643078ef-a97d-4f46-a4c3-5a50080f0431\webapps\my-web-app] 无效
……

可见,虽然我只想关注localhost主机的WebApp(即IDEA中正在开发的项目),但我在Tomcat安装目录中部署的这个my-web-app也存在于IDEA启动的这个Tomcat进程的配置之中,而且正是因为新增的<Host>导致了Tomcat无法启动。

经过一番研究,在搞清楚IDEA是如何控制Tomcat的基本原理之后,原因就很明了了:

因为IDEA使用的是临时配置目录,而这个my-web-app配置时使用的是相对路径,这就导致IDEA启动时,在临时配置目录下找不到my-web-app,所以就报错,无法启动。

解决方案:

  • 部署时<Host>使用绝对路径。这种方案下,在IDEA中运行Tomcat时,除了localhost之外的其他Host也都能正常访问到。
    <Host name="my-web-app.com" appBase="C:\Users\tianlin\Java\apache-tomcat-8.5.70\webapps\my-web-app" unpackWARs="true" autoDeploy="true">
    <Context docBase="/" path="" />
    </Host>
  • 部署用的Tomcat环境和IDEA开发用的Tomcat环境分离,各自使用不同的目录。

多Host情况下IDEA无法启动Tomcat的问题的更多相关文章

  1. Mac下没有权限启动tomcat的解决办法

    问题描述 在Mac中通过./startup.sh执行启动脚本文件,启动tomcat时报如下错误: -bash: ./startup.sh: Permission denied 解决方法 错误信息说明了 ...

  2. Tomcat学习笔记 - 错误日志 - NetBeans配置tomcat出错情况总结 -- 部署错误: 启动 Tomcat 失败。-- '127.0.0.1' 不是内部或外部命令,也不是可运行的程序

    真的管用,不知道为啥管用.转载自:http://blog.sina.com.cn/s/blog_709548200102vgy4.html 问题描述: 新安装的NetBeans8.0.2,安装过程中还 ...

  3. service iptables xxx无效命令的情况下,如何启动/重启iptables

    最近在CentOS 7.6下使用service iptables xxx相关命令,提示如下错误:The service command supports only basic LSB actions ...

  4. Centos7多内核情况下修改默认启动内核方法

    1.1  进入grub.cfg配置文件存放目录/boot/grub2/并备份grub.cfg配置文件 [root@linux-node1 ~]# cd /boot/grub2/ [root@linux ...

  5. 如果遇到继承控件,添加到新项目里在工具栏找不到的情况下,F5启动一下,重新生成是不会有的,要运行成功才有

    继承控件只的是cs结尾的那种,类直接继承对应控件,不是usercontrol类型的

  6. eclipse启动tomcat时设置端口

    近在做项目需要更改tomcat的端口号,开发工具用的是Eclipse,更改后在Eclipse中重启发现,端口号依然是8080,原来在配置文件更改了tomcat端口号后,要在Eclipse重新装载一次, ...

  7. Linux下一个Redis启动/关闭/重新启动服务脚本

    脚本功能: 实现redis单机多实例情况下的正常启动.关闭.重新启动单个redis实例.完毕系统标准服务的下面经常使用功能:  start|stop|status|restart 注:redis程序代 ...

  8. 在linux下安装并操作tomcat

    1.安装tomcat1).下载tomcat从官网http://tomcat.apache.org/下载tomcat,保存在/home目录下.root@ubuntu:/home/ubuntu/Downl ...

  9. eclipse本地启动tomcat报错集锦

    1.eclipse本地添加tomcat服务器    打开Eclipse,单击“window”菜单,选择下方的“Preferences”: 找到Server下方的Runtime Environment, ...

随机推荐

  1. 2019-07-06 sql备忘 连续取最大

    连续最大: SELECT M.* FROM #temp MINNER JOIN (SELECT ISNULL(A.score,0)-b.score AS score,B.id FROM #temp A ...

  2. docker容器网络bridge

    我们知道docker利用linux内核特性namespace实现了网络的隔离,让每个容器都处于自己的小世界里面,当这个小世界需要与外界(宿主机或其他容器)通信的时候docker的网络就发挥作用了,这篇 ...

  3. Vue-Router 详细解析学习

    首先还是先创项目 然后选择vue-router 再创建 再敲代码学习前,我们先了解什么是路由? 路由有一个非常重要的概念就是路由表: 本质就是一个映射表,决定数据的指向. 我们生活中常常听到的路由器, ...

  4. 记一次在Windows10桌面环境搭建Jekins的吐血经历

    目录 写在前面 故事背景 踩坑详情 最后总结 写在前面 首先声明,除非万不得已,千万不要在Windows环境做这个事情,否则就等着各种坑吧. 本人一贯的立场都是坚持用正确的方法做事,显然在Window ...

  5. Unsatisfied dependency expressed through field 'rabbitTemplate'错误总结

    1. 在springboot中整合RabbitMq的过程中,遇到如下错误:(截取部分) org.springframework.beans.factory.UnsatisfiedDependencyE ...

  6. UNIX环境高级编程APUE练习3.2-不用fcntl实现dup2的功能

    1 题面 编写与dup2功能相同的函数,要求不调用fcntl函数,并且要有正确的出错处理. 2 基本思路 不能用fcntl,能够返回一个文件描述符的只有open和dup.而open会创建一个新的文件表 ...

  7. 6.算法竞赛中的常用JAVA API :Math类(转载)

    6.算法竞赛中的常用JAVA API :Math类 求最值 最小值 Math.min(int a, int b) Math.min(float a, float b) Math.min(double ...

  8. SpringMVC学习05(整合ssm)

    5.整合SSM 环境要求 环境: IDEA MySQL 5.7.19 Tomcat 9 Maven 3.6 要求: 需要熟练掌握MySQL数据库,Spring,JavaWeb及MyBatis知识,简单 ...

  9. KNeighborsClassifier()的参数无效错误

    KNeighborsClassifier()的参数无效错误 写在前面:如果对自己英语拼写很自信,可以不用往下看了,我就是拼写错误 错误提示 Invalid parameter n_neightbors ...

  10. ViewPager2 使用说明书

    ViewPager2 使用说明书 零.Demo 项目源码 演示 apk 如果对你有用,希望能给个 star,谢谢. 一.功能 官方关于使用 ViewPager2 创建滑动视图的说明: Swipe vi ...