springboot项目报Command line is too long. Shorten the command line via

前言

image-20240221195257887

springboot项目启动时有时候会报Error running xxxxx. Command line is too long. Shorten the command line via JAR manifest or via a classpath file and rerun.这时候常常直接按照提示点击JAR manifest之后就可以正常运行了。要格物致知为什么会造成这样的现象,如何解决。

解决

右键打开应用的 Edit Configuration,点击Modify options 勾选 Shorten command line 再选择JAR manifest就可以了

image-20240221195415655

image-20240221195427142

原因

java 入门案例写的Helloword.java程序运行cmd命令很简洁。 对于简单的、无需任何外部依赖的Java程序直接使用javac进行编译,然后使用java命令运行生成的.class文件就足够了。但对于复杂的应用程序,特别是像Spring Boot这种依赖众多、涉及许多配置项的项目,简单的java HelloWorld 这样的运行命令已无法满足需求。这时就需要使用更复杂的命令来运行应用。这些命令做的事情其实和java HelloWorld类似,只不过多了一些对运行环境进行微调的参数。

查看idea启动springboot应用时的控制台打印第一行参数

1
"C:\Program Files\Java\jdk1.8.0_171\bin\java.exe" -XX:TieredStopAtLevel=1 -noverify -Dspring.profiles.active=dev -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-Dmanagement.endpoints.jmx.exposure.include=*" "-javaagent:D:\A.IDEA\IntelliJ IDEA 2023.2.5\lib\idea_rt.jar=10083:D:\A.IDEA\IntelliJ IDEA 2023.2.5\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\admin\AppData\Local\Temp\classpath721649236.jar com.yw.elibooappboot.ElibooAppBootApplication

丢入gpt-4解释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
这段代码是在Windows环境下启动一个Java应用程序的命令,下面是各个部分的解释:

- `"C:\Program Files\Java\jdk1.8.0_171\bin\java.exe"`:这是Java的解释器,需要用它来运行Java程序

- `-XX:TieredStopAtLevel=1 `-noverify`:这是Java虚拟机(JVM)的参数,用来改善启动性能

- `-Dspring.profiles.active=dev `-Dspring.output.ansi.enabled=`always`:这是Spring框架的参数,设置Spring的活动配置文件为开发环境,该配置文件在项目的资源文件夹下的application-dev.yml或application-dev.properties

- `-Dcom.sun.management.jmxremote `-Dspring.jmx.enabled=true `-Dspring.liveBeansView.mbeanDomain `-Dspring.application.admin.enabled=true `:这是Java的JMX(Java Management Extensions)相关参数,可以通过JMX来查看和管理Java应用程序

- `-javaagent:D:\A.IDEA\IntelliJ IDEA 2023.2.5\lib\idea_rt.jar=10083:D:\A.IDEA\IntelliJ IDEA 2023.2.5\bin`:这是IntelliJ IDEA的Java Agent参数,用于在IDE中进行调试

- `-Dfile.encoding=UTF-8`:这条命令设置了程序运行时的默认字符编码为UTF-8

- `-classpath C:\Users\admin\AppData\Local\Temp\classpath721649236.jar`:这是classpath,是Java查找class文件和jar包文件的路径

- `com.yw.elibooappboot.ElibooAppBootApplication`:这是你的Spring Boot主程序所在的位置,运行这条命令将会启动你的Spring Boot应用

这个命令中使用到的参数可以根据实际需要进行调整。

-classpath后的路径 idea显示是个链接,点击可以查看里面的内容。可以看到里面有很多java jar包,有java自带的,有maven仓库的等等

image-20240221195312649

简单的java HelloWorld 这样的运行命令已无法满足需求,复杂的springboot应用引用了大量外部jar包,需要告诉java这个jar包在哪儿加载。 –classpath就是这个作用。如果jar包太多就会导致命令行太长。windows命令最长允许多少字符呢? 命令行长度最大为32767个字符。超过了就会报错启动不起来。这时候idea提出了两种解决方案来压缩这个太长的命令行

  1. jar manifest。IDE通过临时classpath.jar传递长类路径。

  2. classpath file。IDE将把长类路径写入文本文件

思考:Spring Boot应用在生产环境下从来不用担心出现Command line is too long这种错误?

答: 对于 Spring Boot 应用来说,Spring Boot 的启动方式是通过打包成一个“胖jar”,也就是说把应用程序以及所有依赖的 jar 包都打包到一个 jar 文件中。因此,当你使用 java 命令运行 Spring Boot应用时,你只需要指定这个jar文件的位置即可,不需要指定所有依赖的jar包的路径。

日常的开发和测试过程中,直接运行Java类而非打包运行是为了提高效率,因为打包操作会消耗一些时间。IDEA为了提升开发者的开发效率,使用了这种方式来运行Java程序,即直接编译需要运行的Java文件,然后通过 -classpath 的方式将编译产生的 .class 文件或者依赖的 .jar 文件路径加入类路径,然后运行。

参考


springboot项目报Command line is too long. Shorten the command line via
https://lililib.github.io/springboot项目报Command line is too long/
作者
煨酒小童
发布于
2024年2月21日
许可协议