IDEA 命令行缩短器助你解决此问题:Command line is too long. Shorten command line

栏目: IT技术 · 发布时间: 3年前

内容简介:往期推荐

点击上方“ BAT的乌托邦 ”,选择“ 设为星标

后台回复“ 专栏 ”,开启 专栏模式 学习

往期推荐

前言

各位小伙伴大家好,我是A哥。最近遇到两个问题,都是关于IDEA的(言外之意和代码无关),很是让我“生气”呀(关键是浪费时间)。在痛定思痛后,我决定写此专栏,来专门分享/记录使用 IntelliJ IDEA 过程中遇到的那些奇葩问题和解决方案,以帮助你缩短日常排错时间,这么一思考好像还功德无量呢:smile:。

IntelliJ IDEA 作为 Java 开发者中最为流行的开发工具(eclipse粉勿喷),熟练掌握它(包括排雷)对提升编码效率能有显著提升。但 工具 毕竟是工具,这么长时间使用IDEA以来,每个人或多或少的都遇到过关于IDEA七七八八、奇奇怪怪的问题,这些与代码舞棍,但它很容易 偷走 你的时间,半天又更或者是一天之久。

说明:千万不要忽视对IDEA的研究,因为把它玩熟练了它就相当于你的物理外挂

本专栏内容 并非 IDEA教程,而是着眼于分享IDEA使用过程中,那些我遇到(或者大家遇到)的但又不是能够很快速解决,总之就是比较棘手的问题的汇总,有一种错题本的意思有木有。总之就是希望它能够帮助到大家迅速定位or解决问题,避免不必要的时间浪费,毕竟咱们的主业还是敲代码嘛~

IDEA 命令行缩短器助你解决此问题:Command line is too long. Shorten command line

版本约定

本文内容若没做特殊说明,均基于以下版本:

IntelliJ IDEA: 2020.1.2 旗舰版

正文

使用IDEA这么久,虽然之前时不时地的跟IDEA问题“交过手”,但真正促使我决定写此专栏的原因还是源自于前两天使用IDEA启动Spring Boot程序时的这个报错:

Error running 'Application': Command line is too long. Shorten command line for Application or also for Spring Boot default configuration.
IDEA 命令行缩短器助你解决此问题:Command line is too long. Shorten command line

说实话这个错误我前所未见,看起来还蛮有意思,因此决定研究一番。这不,把研究结果分享给大家,信息共享。

为了解释好这个问题,我们得先来做些功课,知晓写概念。

控制台首行路径

在IDEA里,你每次启动一个main函数时,控制台第一行输出的“日志”称作为: 控制台首行路径 。这里,我运行一个最最最简单的程序,看看它长啥样,程序如下:

public class Application {


public static void main(String[] args) {

System.out.println("Hello world");

}

}

运行程序,控制台输出如下截图:

IDEA 命令行缩短器助你解决此问题:Command line is too long. Shorten command line

相信小伙伴每天都能看见它但大概率不会注意到它,我也不例外。你想不到的是,恰巧这行“日志”就成为了本文今天的 主角 ,会围绕它来展阐述。

特别说明:如果你是用外置tomcat驱动应用启动的话效果不是这样子的。因为它使用的是tomcat的脚本来启动,所以首行日志形如这样: D:\developer\apache-tomcat-9.0.34\bin\catalina.bat run

首行路径内容

知道了什么叫首行路径,那么它的内容才是我们要关心的。如上截图中,细心的你会发现最后是 ... 省略号,因此内容绝不止你现在看到的那么简单。你可以鼠标点击一下,展开全部内容,截图如下:

一行 实在太长了,无法横向截图全部展示出来,因此我把它复制出来放在文本编辑器中查看:

IDEA 命令行缩短器助你解决此问题:Command line is too long. Shorten command line

这个截图是 一行 哦(只是我在文本编辑器了自动折行了而已),仍旧不能看到全部内容,因为字数真的太多了,总字数统计如下:

IDEA 命令行缩短器助你解决此问题:Command line is too long. Shorten command line

仅仅一行,字数超过26000个。咋舌吧:第一行控制台“日志”竟然输出了超过2.6w个字符。从内容结构上来看,这是一个command命令: 调用java.exe程序启动一个java进程的命令

为何启动抛错Command line is too long

99.99%的情况下,你可以在IDEA里正常启动你的应用,即使首行路径很长很长。但是直到当我启动我的这个Spring Boot应用时,弹出红色提示:

IDEA 命令行缩短器助你解决此问题:Command line is too long. Shorten command line

直接禁止了我的running运行。提示内容中文释义为:运行“Application”时出错: 命令行太长 。缩短应用程序或Spring Boot默认配置的命令行。我相信如果你也是第一次见到此case,表情和我一样是这样的:

IDEA 命令行缩短器助你解决此问题:Command line is too long. Shorten command line

main方法都启不动了,那还得了。遇到这种情况,我只能使用百度大法(谷歌大法)了:

IDEA 命令行缩短器助你解决此问题:Command line is too long. Shorten command line

一看能搜出这么多结果,我也就不慌了,按照“教程”很容易的把问题解决了。另外呢,通过此次搜索到的结果聊两句题外话:

1. 虽然Result Count不少,但是我发现实质上内容几乎一毛一样,真乃天下文章一大抄 2. 访问量并不代表文章质量高,只是它刚好命中了关键字而已,比如标题党

我得出如此感悟,也是促使我写本文的原因之一。 因为A哥的文章一贯如此,是有些B格的 。接下来以点带面,把这部分内容帮大家展开展开,解决问题并非最终目的,而是为了:记得牢,能装x,一切为了加薪。

原因分析

出现此问题的直接原因是: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的设置那么麻烦了,而是直接在界面操作即可:

IDEA 命令行缩短器助你解决此问题:Command line is too long. Shorten command line

最初,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路径是可以预览器内容的(真贴心):

IDEA 命令行缩短器助你解决此问题:Command line is too long. Shorten command line

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

IDEA 命令行缩短器助你解决此问题:Command line is too long. Shorten command line

特别强调 :我在实践过程中,使用此种方式出现过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_classpath921151059

com.xxx.Application

有了上面的描述,这个就不用A哥赘述了。

扩展知识: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%能解决问题)

别问A哥为毛只给出windows的最大长度,没有Mac的吗?我只能说,我很穷所以用的是windows本,Mac的我不关心:smile:

思考题

今日份思考题比较简单

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

总结

IDEA踩坑系列第一篇到这就结束了,算不算精彩呢?我个人觉得还可以:smile:。此专栏后续将不定期的更新,除了我自己准备外,同时也 非常欢迎 各位小伙伴能把平时遇到的IDEA遇到的棘手问题反馈给我(最好有解决方案哦),咱们一起把这个事做好,也算造福于大家嘛,毕竟我一个人碰见的case实则有限,有建议的可以下方扫码加我好友私聊我。

IDEA 命令行缩短器助你解决此问题:Command line is too long. Shorten command line

专栏式学习,我们是认真的 (关注公众号回复“知识星球”领券后再轻装入驻)

IDEA 命令行缩短器助你解决此问题:Command line is too long. Shorten command line

IDEA 命令行缩短器助你解决此问题:Command line is too long. Shorten command line

关注A哥,开启专栏式学习

IDEA 命令行缩短器助你解决此问题:Command line is too long. Shorten command line IDEA 命令行缩短器助你解决此问题:Command line is too long. Shorten command line

扫码关注后,回复“专栏”进入更多Spring专栏学习

右侧为私人微信(加好友备注:Java入群)

https://www.yourbatman.cn

点个在看,养成习惯


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Mechanics of Web Handling

The Mechanics of Web Handling

David R. Roisum

This unique book covers many aspects of web handling for manufacturing, converting, and printing. The book is applicable to any web including paper, film, foil, nonwovens, and textiles. The Mech......一起来看看 《The Mechanics of Web Handling》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具