启动报错:

Error running 'CmsFrontApplication': Command line is too long. Shorten command line for CmsFrontApplication or also for Spring Boot default configuration.

解决办法

原因分析

出现此问题的直接原因是:IDEA集成开发环境运行你的“源码”的时候(注意是源码基础上运行,并非打好的jar包哦),是通过命令(首行那个非常非常长的)来启动Java进程的。这个命令主要包含两大部分:

  1. vm 程序参数。也就是你看到的那些-XX -D等参数,这部分理论上可以无限长但实际上一般不会太长
  2. -classpath参数,它用于指定运行时jar包路径(因为jar包理论上是可以在任何地方的),这部分可能性就多了

关键就在于-classpath参数,它可以非常长,你依赖的jar包越多此路径就越长;你的base基路径越长它就越长;倘若你还要做复杂的Junit单元测试,那加入的jar包就更多长度可能就越长喽。总的来说:此part是很有可能超长从而导致Command line is too long现象的。

如果类路径太长(可能性大),或者您有许多VM参数(可能性小),则无法启动该程序。原因是大多数操作系统都有命令行长度限制。在这种情况下,IntelliJ IDEA将提供尝试缩短类路径的能力。


IDEA老版本方案

针对此问题,在之前版本(确切的说是2017.3之前的版本),需要通过XML文件配置来解决:找到工程下的.idea/workspace.xml这个文件,添加如下项:

<component name="PropertiesComponent">...<!-- 这句是你需要添加的项 --><property name="dynamic.classpath" value="true" />...
</component>

再次启动程序发现问题解决。我有理由相信,在这个时间节点上应该没有人用这么古老的版本了吧,但你在网上搜的文章大多数都还是这种解决方案,因此请务必注意甄别哦(2017.3以后的版本请参照下面方案解决)。

任何不指定版本的解决方案、源码分析文章都是不太负责任的。作为一个程序员,应该适当提高自己的版本意识


IDEA新版本方案:命令行缩短器

在IDEA的2017.3版本中提供了一项新特性:命令行缩短器。旨在用来解决此类问题,也就是说从此版本开始,不再需要通过XML文件来编辑IDE的设置那么麻烦了,而是直接在界面操作即可:

最初,IntelliJ IDEA尝试将长类路径写入文本文件(这意味着应用程序是中间类加载器)。但是不幸的是,这不适用于某些框架,例如JMock。然后,IntelliJ IDEA尝试使用或多或少的标准方法,即将长类路径打包到classpath.jar中。不幸的是,对于其他一些框架,这也不起作用。

总结:这两种方案都不是100%完美的,具体情况具体分析

从上对话框中可以看到IDEA一共提供了三种命令行缩短器供你选择:

  1. none。这是默认选项。IDE不会缩短长类路径。如果命令行超出操作系统限制,则IDEA将无法运行您的应用程序
  2. jar manifest。IDE通过临时classpath.jar传递长类路径。原始类路径在MANIFEST.MF中定义为classpath.jar中的类路径属性
  3. classpath file。IDE将把长类路径写入文本文件

jar manifest方式

选择此种方式,运行测试程序,首行全部内容展示如下:

D:\developer\jdks\1.8.0_241\bin\java.exe -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2020.1.1\lib\idea_rt.jar=5975:C:\Program Files\JetBrains\IntelliJ IDEA 2020.1.1\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\xxx\AppData\Local\Temp\classpath1199511058.jar com.xxx.Application

区别主要在于-classpath这一行,它不再是把所有jar的路径展示出来,而是“封装”到了一个jar文件里,这一下子让命令长度大幅减少,能够100%保证不会超长了,所以启动也就不会报错喽。

另外,在IDEA里你直接单击此jar路径是可以预览器内容的(真贴心):

当然,你也可以在你磁盘里找到此jar文件,然后查看其内容(说明:请确保hold住线程了再去找对应文件,否则临时文件是线程结束后就删除了的):

特别强调:我在实践过程中,使用此种方式出现过jar包没有被加载进来的情况,在此提醒各位,若你也有类似现象发生,请切换成使用classpath file方式吧。

毕竟官方也说了:这两种路径缩短方式,对某些框架可能存在不兼容情况,just可能而已哦~


classpath file方式

选择此种方式,运行测试程序,首行全部内容展示如下:

D:\developer\jdks\1.8.0_241\bin\java.exe -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2020.1.1\lib\idea_rt.jar=5975:C:\Program Files\JetBrains\IntelliJ IDEA 2020.1.1\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\xxx\AppData\Local\Temp\idea_classpath921151059com.xxx.Application


扩展知识:windows系统命令最大长度

这属于扩展知识,延伸阅读内容。

既然已经知道出现此问题的原因是命令超长了而“报错”,A哥就想那windows命令最长允许多少字符呢?带着这个问题,我开始了一番苦心寻找,最后终于在windows官网找到了我想要的答案。地址在这:https://docs.microsoft.com/zh-cn/windows/win32/api/processenv/nf-processenv-setenvironmentvariablea?redirectedfrom=MSDN

在Windows上,命令行长度最大为32767个字符(和shell长度、命令提示符长度的区别)。当提供足够大的类路径时,将违反此限制,并且Windows拒绝执行该命令并抛出错误代码87。推荐的解决方案有如下两种:

  1. 将所有jar复制到一个公共文件夹,例如c:\jars,然后将其包括在内。这样,每个jar都有一个短路径,即c:\jars(而不是长路径c:\program files\app\lib\app-jar1.jar),并且应该可以将这个路径们控制在38kb之内
  2. 如果步骤1不起作用,则可以将单个jar提取到一个文件夹中,并创建一个包含所有提取文件的新jar。这样就只需要引入这个新jar就可以了

这是两种解决问题的思想:短路径方式(简单高效)和打包方式(100%能解决问题)


思考题

  1. 为毛你的Spring Boot应用在生产环境下从来不用担心出现Command line is too long这种错误?
  2. 有哪些有效的方式可以避免你的开发环境出现此问题?

IDEA Springboot启动报Command line is too long错误相关推荐

  1. IDEA运行报Command line is too long错误解决办法

    运行idea的时候,突然发现项目跑不了:出现以下错误: Command line is too long. In order to reduce its length classpath file c ...

  2. springboot启动报错:Unregistering JMX-exposed beans on shutdown

    环境 1,maven 3.5.0 2,eclipse 4.7.1 3,spring boot 1.5.9.RELEASE springboot启动报错 按照spring 用户手册创建新的spring ...

  3. 解决Intellij IDEA运行报Command line is too long的问题

    解决Intellij IDEA运行报Command line is too long的问题

  4. SpringBoot启动报错:Parameter 0 of method hmset in com.qcby.rbac.util.RedisUtils required a bean of type

    SpringBoot启动报错,报错信息如下: 报错是由于A类中定义了含参数的构造函数,Spring自动构造和注入时未为该Bean传入参数,引起报错. 查了很多资料,最后发现,我是因为注释的时候没有把@ ...

  5. 启动Spring项目报错,Springboot启动报错 Disconnected from the target VM 解决过程

    启动Spring项目报错,Springboot启动报错 Disconnected from the target VM 解决过程 大概率是缺少了一下依赖 <dependency><g ...

  6. IDEA springboot启动报错java.lang.UnsatisfiedLinkError: no tcnative-1 in java.library.path

    IDEA springboot启动报错: java.lang.UnsatisfiedLinkError: no tcnative-1 in java.library.path: [D:\Java\bi ...

  7. SpringBoot启动报错Could not resolve placeholder ‘XXX.XXX‘ in value

    SpringBoot启动项目时报错: Exception encountered during context initialization - cancelling refresh attempt: ...

  8. IDEA运行报Command line is too long和unable to find valid certification path to requested target

    IDEA解决 Maven:unable to find valid certification path to requested target 一.报错信息: Could not transfer ...

  9. springboot启动报jar包加载异常问题解决

    问题描述: springboot启动报jar包扫描错误,但不影响项目正常使用: Failed to scan [file:/Users/ds/.m2/repository/com/sun/xml/bi ...

最新文章

  1. mysql触发器运算_在MySQL中使用触发器计算列值?
  2. ES6的export与Nodejs的module.exports比较
  3. 一. DotNet MVC4.0+EasyUI Web简单框架-前言
  4. 动态添加ContextMenuStrip项(ToolStripItem)
  5. 如何使用用window.open()
  6. windows用户账户类型
  7. js jquery 判断元素是否在数组内
  8. iOS:Reachability网络监听
  9. 母函数 经典题目汇总
  10. AD 20中文软件安装教程
  11. 阿里飞猪个性化推荐:召回篇
  12. 全球与中国处方太阳镜市场深度研究分析报告
  13. 为什么使用VO,DTO,BO
  14. html 边框重叠问题,详解css边距重叠的几种解决方案
  15. MP | 东农吴凤芝/南农韦中-根系分泌物介导的植物种间互作塑造了根际微生物组抑病力...
  16. DolphinDB智臾科技CEO周小华:《从反向控制的终极目标谈时序数据库的架构设计》
  17. '/',‘\\’与‘\’的区别
  18. 计算机光驱图标符号,WinXP光驱图标不见了如何找回?
  19. [蓝桥杯2019初赛]立方和
  20. Ubuntu 下谷歌浏览器、搜狗输入法的下载安装

热门文章

  1. 超详细的计算机视觉数据集汇总(自动驾驶、SLAM、三维重建、立体视觉、深度估计)
  2. hdu2894// 算法竞赛——进阶指南——acwing 400. 太鼓达人 欧拉回路经典题 //欧拉回路的建模小结
  3. 关于教育类网站的安全防护方案
  4. rtl8188eu无线网卡驱动移植
  5. 中信建投:“技术+业务+数据”三管齐下的中台建设精髓
  6. 安装jenkins-中文版-国内源-超简单
  7. Git 撤销 删除(六种情况下的撤销)
  8. 宝宝的成长脚印3/20
  9. fiddler限速_fiddler之弱网设置(模拟限速)
  10. [IAR][CC2642][CC2640] 使用TI图形化配置界面