乐趣区

关于spring:IDEA命令行缩短器助你解决此问题Command-line-is-too-long

生命太短暂,不要去做一些基本没有人想要的货色。本文已被 https://www.yourbatman.cn 收录,外面一并有 Spring 技术栈、MyBatis、JVM、中间件等小而美的 专栏 供以收费学习。关注公众号【BAT 的乌托邦】一一击破,深刻把握,回绝浅尝辄止。

前言

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

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

阐明:千万不要漠视对 IDEA 的钻研,因为把它玩纯熟了它就相当于你的物理外挂

本专栏内容 并非 IDEA 教程,而是着眼于分享 IDEA 应用过程中,那些我遇到(或者大家遇到)的但又不是可能很疾速解决,总之就是比拟辣手的问题的汇总,有一种错题本的意思有木有。总之就是心愿它可能帮忙到大家迅速定位 or 解决问题,防止不必要的工夫节约,毕竟咱们的主业还是敲代码嘛~


版本约定

本文内容若没做非凡阐明,均基于以下版本:

  • 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 里,你每次启动一个 main 函数时,控制台第一行输入的“日志”称作为:控制台首行门路。这里,我运行一个最最最简略的程序,看看它长啥样,程序如下:

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

<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_classpath921151059
    com.xxx.Application

有了下面的形容,这个就不必 A 哥赘述了。



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

这属于扩大常识,延长浏览内容。

既然曾经晓得呈现此问题的起因是命令超长了而“报错”,A 哥就想那windows 命令最长容许多少字符呢?带着这个问题,我开始了一番苦心寻找,最初终于在 windows 官网找到了我想要的答案。地址在这:https://docs.microsoft.com/zh…

在 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 实则无限,有倡议的能够下方扫码加我好友私聊我。


关注 A 哥

Author A 哥(YourBatman)
集体站点 www.yourbatman.cn
E-mail yourbatman@qq.com
微 信 fsx641385712
沉闷平台
公众号 BAT 的乌托邦(ID:BAT-utopia)
常识星球 BAT 的乌托邦
每日文章举荐 每日文章举荐

退出移动版