首页 / 历史 / 古代史 / 正文

socket中文乱码(IDEA 社区版不支持 Tomcat?一招完美解决)

放大字体  缩小字体 来源:什么是信托产品 2026-04-15 13:32  浏览次数:11
IDEA 社区版不支持 Tomcat?一招完美解决nerror="javascript:errorimg.call(this);">

责编 | Elle

IDEA 社区版不支持 Tomcat?一招完美解决nerror="javascript:errorimg.call(this);">

IntelliJ IDEA Community Edition(社区版)不支持Tomcat,不想花钱购买Ultimate版本,也不想使用Eclipse,尝试通过其他方式使IDEA社区版支持Tomcat。

IDEA 社区版不支持 Tomcat?一招完美解决nerror="javascript:errorimg.call(this);">

2.1. Smart Tomcat插件

Web应用的class文件未被自动拷贝到对应的Web应用根目录中,导致Web应用的代码未被加载,需要手工处理,使用不方便;

  • 使用Smart Tomcat插件遇到问题之后,放弃了使用该插件,没有再去分析是否因为使用方法不当。

    IDEA 社区版不支持 Tomcat?一招完美解决nerror="javascript:errorimg.call(this);">

    3.1. 说明

    完成的Gradle脚本及示例Web工程代码可以从 https://github.com/Adrninistrator/IDEA-IC-Tomcat/ 、 https://gitee.com/adrninistrator/IDEA-IC-Tomcat/ 下载,脚本内容很短,有效行数不超过200行,处理也很简单。

    一键启动Tomcat并加载Web应用

  • 一键启动可调试的Tomcat(Web应用)

  • 3.2. 依赖环境

    • 使用IntelliJ IDEA Community Edition 2019.2.4版本。

      • 支持Tomcat 7、8、9版本(测试过Tomcat 7.0.55、7.0.79、8.5.20、9.0.30版本),理论上也支持Tomcat 5、6版本(未测试)。

        • 支持Gradle 4、5、6版本(测试过Gradle 4.1、4.7、5.6.4、6.0.1版本)。

          • 使用JDK 1.8.0_144版本。

            • 使用Windows 7 x64 SP1版本。

              假设存在以下Gradle任务:

              task testTask {
              doFirst {
              println "测试-" + System.getProperty("arg")
              }
              }

              在IDEA的Terminal中执行以上Gradle任务时,可以通过gradle或gradlew命令,以命令行的方式执行,并可以通过“-D”前缀指定传递给Gradle脚本的JVM参数,与执行Java程序时类似。

              执行的结果如下所示:

              > Task :testTask
              测试-abc

              打开IDEA的“Run/Debug Configurations”窗口,点击加号后,从弹出菜单中选择“Gradle”,可以新增一个配置,用于执行对应的Gradle任务。

              IDEA 社区版不支持 Tomcat?一招完美解决nerror="javascript:errorimg.call(this);">

              点击“Gradle project”右侧的图标,选择当前项目;

            • 在“VM options”右侧填入需要传递给Gradle脚本的JVM参数,如“-Darg=test_arg”,点击箭头图标可以展开编辑框。

            IDEA 社区版不支持 Tomcat?一招完美解决nerror="javascript:errorimg.call(this);">

            执行的结果在“Run”窗口中显示,如下所示:

            IDEA 社区版不支持 Tomcat?一招完美解决nerror="javascript:errorimg.call(this);">

            3.3.2.1. 解决在Run/Debug Configurations中执行Gradle脚本中文乱码问题

            或如下图所示:

            IDEA 社区版不支持 Tomcat?一招完美解决nerror="javascript:errorimg.call(this);">

            打开IDEA的“Help”“Edit Custom VM Options...”菜单;

          IDEA 社区版不支持 Tomcat?一招完美解决nerror="javascript:errorimg.call(this);">
          • 重启已打开的IDEA后生效。

          3.4.1. 在IDEA创建远程调试配置并获取调试参数

          打开IDEA的“Run/Debug Configurations”窗口,点击加号后,从弹出菜单中选择“Remote”,可以新增一个配置,用于进行远程调试。

          IDEA 社区版不支持 Tomcat?一招完美解决nerror="javascript:errorimg.call(this);">

          “Debugger mode”选项保持“Attach to remote JVM”

        • “Transport”选项保持“Socket”

        • “Port”参数指定被调试的Java进程监听的调试端口

        • “Command line arguments for remote JVM”展示的调试参数不能编辑,会跟随上方的参数变化。

          • “Port”参数对应调试参数“address=”

          复制“Command line arguments for remote JVM”对应的调试参数,将其添加到被调试Java进程的JVM参数中,启动Java进程。

          3.4.3. 在IDEA启动调试

          调试启动成功后,在“Debug”“Console”窗口提示“Connected to the target VM”,如下所示。

          IDEA 社区版不支持 Tomcat?一招完美解决nerror="javascript:errorimg.call(this);">

          停止被调试Java进程时,IDEA启动的调试会自动结束。

          当对Tomcat进行调试时,停止调试后在Tomcat窗口会出现类似“Listening for transport dt_socket at address: 5555”提示。

          3.5. runTomcat.gradle脚本使用方法

          3.5.1. 任务及参数说明

          在脚本中使用了以下参数。

          TOMCAT_HOME_4IDEA

        IDEA 社区版不支持 Tomcat?一招完美解决nerror="javascript:errorimg.call(this);">
        • 3.5.1.2. JVM参数

          • noBuild

          IDEA 社区版不支持 Tomcat?一招完美解决nerror="javascript:errorimg.call(this);">
          • arg4Tomcat

          IDEA 社区版不支持 Tomcat?一招完美解决nerror="javascript:errorimg.call(this);">

          在使用提供的Gradle脚本runTomcat.gradle时,首先需要完成环境配置,“TOMCAT_HOME_4IDEA”环境变量配置需要增加,“TOMCAT_INSTANCE_4IDEA”环境变量的配置可选。

          为了验证环境变量配置是否已生效,可在IDEA的Terminal中执行“echo %TOMCAT_HOME_4IDEA%”,当配置完成时会输出对应的环境变量值,未配置或未生效时会输出“%TOMCAT_HOME_4IDEA%”。

          3.5.3.1. 正常启动Tomcat进程

          在以上示例中,指定当前应用对应的Tomcat实例的名称,以及Web应用的上下文路径,均为“test-tomcat”,指定启动Tomcat时使用的JVM参数为“"-DtestValue=aaabbbccc -Dlog.home=E:\desktop\log-test"”。

          当以上Gradle脚本执行成功后,会启动Tomcat,Tomcat进程会产生单独的命令行窗口。

          IDEA 社区版不支持 Tomcat?一招完美解决nerror="javascript:errorimg.call(this);">

          3.5.3.2. 使用Tomcat实例启动脚本启动Tomcat进程

          当不需要对Web应用重新编译时,可以直接执行上述启动脚本,启动Tomcat进程,加载Web应用。

          在示例工程中,TestPostConstructLazyFalse.preDestroy方法使用了@PreDestroy注解,该方法会在应用停止阶段执行,会在当前目录生成名称为“preDestroy-”及当前时间戳的目录。

          将Tomcat窗口关闭,可以停止Tomcat进程。

          3.5.3.3.2. 使用Tomcat实例停止脚本停止Tomcat进程(应用实例可以接收到Web容器销毁通知)

          执行上述停止脚本,会执行Tomcat提供的stop命令,可以停止Tomcat进程,应用实例可以接收到Web容器销毁通知,示例工程的TestPostConstructLazyFalse.preDestroy方法会执行,当前目录会生成目录,如下所示。

          IDEA 社区版不支持 Tomcat?一招完美解决nerror="javascript:errorimg.call(this);">

          以下在IDEA创建远程调试配置并获取调试参数的过程,可以参考前文对应内容。

          启动Tomcat进程

        在执行Gradle “startTomcat”任务时,添加以上参数至arg4Tomcat参数中(可添加到IDEA的“Run/Debug Configurations”的Gradle配置中),如下所示:

        gradlew -DappName=test-tomcat
        -Darg4Tomcat="-DtestValue=aaabbbccc -Dlog.home=E:\desktop\log-test -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5555"

        启动IDEA调试

      对URI“/testrest/get”对应的TestRestController.get方法设置断点,通过浏览器访问后,IDEA调试器进入断点,可在“Debug”“Debugger”窗口查看。

      IDEA 社区版不支持 Tomcat?一招完美解决nerror="javascript:errorimg.call(this);">

      以上使用的调试参数中的suspend参数值为“n”,被调试的进程在启动时不会暂停线程,会正常启动。只支持先启动被调试进程,再进行调试。

      启动Tomcat进程

    将Gradle任务“startTomcat”的“arg4Tomcat”参数中配置的“suspend”参数设置为“y”,再通过该命令启动Tomcat,Tomcat窗口只显示“Listening for transport dt_socket at address: 5555”,未显示其他内容,即Tomcat进程此时在等待调试器连接address参数对应的端口,未完成启动。

    IDEA 社区版不支持 Tomcat?一招完美解决nerror="javascript:errorimg.call(this);">
    • 在Web应用初始化阶段会执行的代码设置断点,例如在示例工程的带有@PostConstruct注解的TestPostConstructLazyFalse.postConstruct方法设置断点。

      查看IDEA调试窗口,已进入以上设置的断点,证明可以从Web应用启动开始调试。

      IDEA 社区版不支持 Tomcat?一招完美解决nerror="javascript:errorimg.call(this);">

      以上从进程启动开始调试的操作需要先启动Tomcat进程,再启动IDEA调试,可以优化为一键完成。

      弹出“Select Gradle Task”窗口,“Gradle project”“Tasks”“VM options”参数配置,可参考在IDEA添加Gradle配置,通过“startTomcat”任务启动Tomcat进程的步骤,需要确保“VM options”参数填写的“arg4Tomcat”参数中的调试参数“suspend”为“y”。

      IDEA 社区版不支持 Tomcat?一招完美解决nerror="javascript:errorimg.call(this);">

      完成以上配置后,在启动IDEA调试之前,会执行指定的Gradle任务“startTomcat”,以“suspend=y”的调试参数启动Tomcat进程。可以实现一键从进程启动开始调试,与IDEA Ultimate版或Eclipse对Web应用从启动开始调试的效果类似。

      当需要对Tomcat的类进行调试时,需要将Tomcat的lib目录添加至IDEA的Web应用工程的依赖中,否则调试时无法查看Tomcat的类。

      在弹出的窗口,选择当前使用的Tomcat的安装目录的lib目录。

      IDEA 社区版不支持 Tomcat?一招完美解决nerror="javascript:errorimg.call(this);">

      当刷新Gradle后,项目配置会重置,以上添加的依赖会被清理,需要重新添加。

      3.6. 其他说明

      • runTomcat.gradle脚本中buildFiles4WebApp方法用于生成Web应用所需文件,拷贝的目录与文件可以根据实际情况调整。

        • 被调试Java进程的调试参数中指定的adderss参数对应的调试端口,需要确保未被监听,否则被调试Java进程会启动失败,窗口会自动消失,Tomcat的提示如下。

          IDEA 社区版不支持 Tomcat?一招完美解决nerror="javascript:errorimg.call(this);">
          • 当因为需要修改使用的Tomcat版本,或其他原因,导致需要重新创建Web应用使用的Tomcat实例时,需要将对应的Tomcat实例目录删除,如“C:\Users\user.tomcat_idea\test-tomcat”,之后再执行Gradle的startTomcat任务。

            • 当前Web应用对应的Tomcat实例目录,在执行Gradle “startTomcat”任务时会输出,如“C:\Users\user.tomcat_idea\test-tomcat”。

              当需要同时启动多个Tomcat进程分别加载不同的Web应用时,需要先修改对应Tomcat实例的“conf\server.xml”文件中的监听端口,避免不同的Tomcat实例使用同一个端口导致不可用。

              3.7. 原理说明

              3.7.1. 生成Web应用所需文件

              将编译生成的class文件拷贝至“build/tomcat/WEB-INF/classes”目录中

            • 将“src/main/webapp/”目录(静态资源与WEB-INF/web.xml文件)拷贝至“build/tomcat”目录中

            • 3.7.2. 生成Tomcat实例

              当前应用使用的Tomcat实例目录不存在时,进行以下操作生成Tomcat实例:

              将“TOMCAT_HOME_4IDEA”环境变量参数值指定的,需要使用的Tomcat安装目录的bin、conf目录拷贝至当前Web应用使用的Tomcat实例目录中;

              3.7.3. 处理Tomcat上下文描述符文件

              上下文描述符需要保存在当前Web应用使用的Tomcat实例目录的“conf\Catalina\localhost”目录中,当前Web应用的上下文路径与上下文描述符文件名相同(不含.xml后缀),上下文路径的大小写与文件名的大小写一致。

              3.7.4. 生成Tomcat实例启动/停止脚本

              runTomcat.gradle脚本会检查对应的脚本文件,在需要写入时进行写入操作。

              3.7.5. 启动Tomcat

              3.7.6. 调试Web应用

              JPDA(The Java Platform Debugger Architecture)包含三个接口,供调试器在桌面系统的开发环境中使用。JDWP属于其中一个,JPDA的说明可参考 https://docs.oracle.com/javase/8/docs/technotes/guides/jpda/ 。

              参考

              根据以上说明可知,当Java进程的调试参数中的suspend参数为“y”时,在启动时会暂时全部线程;suspend参数为“n”时,在启动时不会暂时线程。

              作者:郑祎,Java后台开发

  • 打赏
    0相关评论
    热门搜索排行
    精彩图片
    友情链接
    声明:本站信息均由用户注册后自行发布,本站不承担任何法律责任。如有侵权请告知立立即做删除处理。
    违法不良信息举报邮箱:115904045
    头条快讯网 版权所有
    中国互联网举报中心