Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >IDEA命令行缩短器助你解决此问题:Command line is too long. Shorten command line...

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

作者头像
YourBatman
发布于 2020-11-24 03:38:06
发布于 2020-11-24 03:38:06
10.1K00
代码可运行
举报
文章被收录于专栏:BAT的乌托邦BAT的乌托邦
运行总次数:0
代码可运行

目录

前言

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

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

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

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


版本约定

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

  • IntelliJ IDEA2020.1.2旗舰版

正文

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Error running 'Application': Command line is too long. Shorten command line for Application or also for Spring Boot default configuration.

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

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


控制台首行路径

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Application {

    public static void main(String[] args) {
        System.out.println("Hello world");
    }
}

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

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

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


首行路径内容

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

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

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

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


为何启动抛错Command line is too long

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

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

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

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

  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这个文件,添加如下项:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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方式

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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方式

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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的我不关心?


思考题

今日份思考题比较简单

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

总结

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


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/06/07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
IDEA命令行缩短器助你解决此问题:Command line is too long.
生命太短暂,不要去做一些根本没有人想要的东西。本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈、MyBatis、JVM、中间件等小而美的专栏供以免费学习。关注公众号【BAT的乌托邦】逐个击破,深入掌握,拒绝浅尝辄止。 [2020071809515896.png] 前言 各位小伙伴大家好,我是A哥。最近遇到两个问题,都是关于IDEA的(言外之意和代码无关),很是让我“生气”呀(关键是浪费时间)。在痛定思痛后,我决定写此专栏,来专门分享/记录使用IntelliJ
YourBatman
2020/07/18
2.4K0
IDEA命令行缩短器助你解决此问题:Command line is too long.
idea运行报Error running ‘XApplication‘_ Command line is too long. Shorten command line for XApplication
文章目录 SpringBoot项目启动报错 解決办法 SpringBoot项目启动报错 10:54 Error running 'xxxApplication': Command line is too long. Shorten command line for xxxApplication or also for Application default configuration. 报错翻译 10:54 运行“xxxApplication”时出错:命令行太长。缩短 xxxApplication 或应用
共饮一杯无
2022/11/24
5160
idea运行报Error running ‘XApplication‘_ Command line is too long. Shorten command line for XApplication
高性能微服务架构设计模式@霞落满天
菜单栏:View—>Tool Windows—>Structure或者Alt+7(注意不是Alt+F7)
Java架构师必看
2021/07/13
7120
Error running Application. Command line is too long.
今天由于业务需要,下载了一个开源项目想要在本地运行,处理完部分报错信息后,开始启动项目,启动项目然后报错,报错信息
六月的雨在Tencent
2024/04/08
1.5K0
Error running Application. Command line is too long.
Java命令行运行错误: 找不到或无法加载主类
本部分将针对在“一”中提出的两个问题发生原因,分别进行分析及处理。并且会介绍java的一些和处理问题相关的基本概念。
全栈程序员站长
2022/09/19
10.7K0
Java命令行运行错误: 找不到或无法加载主类
IDEA提示CreateProcess error=206, 文件名或扩展名太长。
引起这个错误的主要原因是java启动时带的启动参数超过了window的最大长度限制导致的,
JQ实验室
2022/10/17
3.9K0
idea 启动命令行的时候提示不能创建PTY
昨天上午,凯哥还在好好的使用idea,中午的时候,360扫描,好像要升级还是要干嘛的,没细看,然后凯哥就点击确定。结果到下午使用idea的Terminal 命令行的时候提示,如下图错误:
凯哥Java
2020/06/07
1.1K0
idea 启动命令行的时候提示不能创建PTY
【方向盘】启动命令和IDEA如何传递:VM参数、命令行参数、系统参数、环境变量参数、main方法参数
你好,这里是Java方向盘,我是方向盘(YourBatman),坐稳扶好,开始发车。
YourBatman
2022/09/16
4.5K0
【方向盘】启动命令和IDEA如何传递:VM参数、命令行参数、系统参数、环境变量参数、main方法参数
异常解决:idea Java 动态编译失败,获取classpath属性不正确问题解决
今天一个同事遇到了idea 在进行Java动态编译Class的时候失败了,其他人运行都正常,就他电脑上不行,帮查看其原因,是在编译的时候获取不到系统变量 CLASSPATH. 并且获取到的目录是: /C:/Users/DIY/AppData/Local/Temp/classpath.jar;按道理应该是JDK目录下的lib jar包。
执笔记忆的空白
2020/12/24
1.8K0
Java和Javac 命令行
这是个很基础的问题,但是因为基本上都是用现有的IDE工具 来开发java程序,所以很少有人意识到这一点。
IT工作者
2022/05/07
5160
Flink命令行 - 1.10
结合Flink官方文档,整理关于Flink命令行的操作参数,包含命令行接口和Scala Shell
Eights
2020/07/10
2.8K0
Flink命令行 - 1.10
【方向盘】升级到IDEA 2022.1版本后,我把Maven Helper卸载了
你好,这里是Java方向盘,我是方向盘(YourBatman),坐稳扶好,开始发车。
YourBatman
2022/09/16
1.6K0
【方向盘】升级到IDEA 2022.1版本后,我把Maven Helper卸载了
【Java】已解决java.lang.NoClassDefFoundError异常
java.lang.NoClassDefFoundError 是 Java 运行时环境(JRE)在尝试加载某个类时,但没有找到定义该类的 .class 文件所抛出的错误。这个问题通常发生在以下场景:
屿小夏
2024/06/17
3.4K0
Java 命令行运行参数大全
javac 用法:javac <选项> <源文件> 其中,可能的选项包括:   -g                                                       生成所有调试信息   -g:none                                             不生成任何调试信息   -g:{lines,vars,source}                    只生成某些调试信息   -nowarn                 
汤高
2018/01/11
18.4K0
springcloud本地开发的微服务如何调用远程k8s的微服务
一般来说k8s使用的容器网络与开发者的所在的办公网络并不能直接连通,如何在开发环境访问k8s的服务,就成为我们日常开发绕不开的坎。下边就介绍几种可以方便我们在本地环境调用k8s服务方案
lyb-geek
2020/10/10
2.7K0
springcloud本地开发的微服务如何调用远程k8s的微服务
IDE 运行出现Error running 'ReadKafkaWriteKafka': Command line is too long.
Command line is too long. 一般是因为项目需要打印的环境变量太长,超过了限制,需要你缩短命令行来解决问题
码农GT038527
2024/11/25
1220
IDE 运行出现Error running 'ReadKafkaWriteKafka': Command line is too long.
使用windows版Docker并在IntelliJ IDEA使用Docker运行Spring Cloud项目
  1.1 首先请确认你的电脑是windows10专业版或企业版,只有这只有这两个版本才带有hyper-v
JAVA葵花宝典
2019/05/24
2.7K0
HBase 命令行
hbase是一款分布式数据库. 其对数据的索引只通过row key进行. 在存储数据的时候, 通过row key的排序进行存储. 在面对一个新的数据库时, 深究其原理并不知一个明智的选择, 正如开车一般, 大多数人都是先学会开车, 然后在开车的过程中车子出故障了, 再慢慢学着去修理. 不管怎么说, 第一步都是要先会使用.
烟草的香味
2020/12/08
1.8K0
HBase 命令行
第9章 Spring Boot开发者工具第9章 Spring Boot开发者工具
Spring Boot Maven Plugin,提供了使用Maven构建Spring Boot 工程的支持。我们可以用这个插件完成打包功能。支持打可执行jar包, war包。该插件支持Maven 3.2 +版本。
一个会写诗的程序员
2018/08/20
1.3K0
第9章 Spring Boot开发者工具第9章 Spring Boot开发者工具
IDEA Spring Boot 自动化构建+部署
3.在Add Host对话框中设置Host List、Username、Password和Tag等参数,完成后单击 Add。
IT大咖说
2021/02/24
9140
IDEA Spring Boot 自动化构建+部署
推荐阅读
相关推荐
IDEA命令行缩短器助你解决此问题:Command line is too long.
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验