前言
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就可以了
原因 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仓库的等等
简单的java HelloWorld
这样的运行命令已无法满足需求,复杂的springboot应用引用了大量外部jar包,需要告诉java这个jar包在哪儿加载。 –classpath就是这个作用。如果jar包太多就会导致命令行太长。windows命令最长允许多少字符呢? 命令行长度最大为32767 个字符。超过了就会报错启动不起来。这时候idea提出了两种解决方案来压缩这个太长的命令行
jar manifest。IDE通过临时classpath.jar 传递长类路径。
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
文件路径加入类路径,然后运行。
参考