Linux服务器启动jar包报启动main类ClassNotFoundException

本文讲述了作者在Linux服务器部署jar包时遇到的启动类名冲突问题,通过查找pom.xml中的配置并进行修正,解决了ClassNotFoundError,展示了如何排查和解决Spring Boot应用部署中的类加载问题。

Linux服务器启动jar包报启动main类启动异常

今天部署文件时遇到了启动异常报错,在网上找了好久没发现我要的答案,没办法只能自己找一下问题了

事件回顾

和往常一样打了个jar包就往服务器上扔,启动时报了这个异常

Exception in thread "main" java.lang.ClassNotFoundException: cn.**.DongdongApplication
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:348)
	at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:46)
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:108)
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
	at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88)

但是我本地启动却是正常的,然后我想起来前几天确实修改了启动类的名称,由原本的DongdongApplication改成了DongDongQiangApplication,但是服务器上却依旧搜索了原先的启动类

全局搜索一下发现,原来是在pom里面写死了启动类

<mainClass>
	cn.**.DongdongApplication
</mainClass>

接下来就好办了,直接修改pom.xml

<mainClass>
	cn.**.DongDongQiangApplication
</mainClass>

启动
成功

<think>嗯,用户想在Linux服务器上通过命令行执行Javamain方法。首先,我需要回忆一下Java程序在命令行中的运行方法。记得需要用javac编译.java文件生成.class文件,然后用java命令执行。不过有时候可能直接运行,特别是如果已经有编译好的文件的话。 然后,用户提到的引用里有几个例子,比如引用[1]中的命令是java [options] xxx.class param1 param2 ... paramn。这里要注意的是,执行的时候应该是java 名,不带.class扩展名。比如如果名是Main,应该用java Main,而不是Main.class。可能用户会在这里出错,需要提醒一下。 另外,引用[3]中的例子用了javac -cp Jexxus.jar WebSocketServerExample.java,这里涉及到路径的问题。如果用户的项目依赖外部jar,就需要用-cp或者-classpath来指定。所以在回答里需要说明如何设置classpath,括多个jar的情况,用冒号分隔。 还有,用户可能需要传递参数给main方法,比如param1 param2这些,应该在名后面加上。比如java -cp .:lib.jar com.example.Main arg1 arg2。 另外,考虑到用户可能没有先编译,或者编译的版本问题,需要提醒他们先用javac编译,或者使用Maven/Gradle构建工具生成可执行jar。比如引用[4]里提到了make命令,可能用户的项目比较复杂,需要编译步骤。这时候可以建议使用构建工具,或者直接生成jar,然后用java -jar执行。 还需要注意Java版本的问题,比如服务器上的Java版本是否和开发环境一致。可以使用java -version检查。如果版本不一致,可能需要调整环境变量或者安装合适的JDK。 还有,如果用户的中,比如package com.example;,那么执行的时候需要指定完整的名,并且目录结构要正确。例如,文件应该在com/example目录下,执行时用java com.example.Main。 可能用户会遇到ClassNotFoundException或者NoClassDefFoundError,这时候需要检查classpath是否正确,是否含了所有依赖的jar和当前目录。 总结一下,步骤应该是:1. 编译Java文件;2. 执行main方法,指定正确的路径和参数。还要考虑依赖结构、Java版本等问题。同时,结合用户提供的引用,特别是引用[1]和[3],给出具体的命令示例,并解释各个参数的作用,比如-cp、-D等选项。 另外,用户可能需要优化执行命令,比如使用通配符加载所有jar,或者使用显式的主声明。还可以提到如何通过生成可执行jar来简化命令,这样就不需要每次指定classpath了。比如使用jar cvfe app.jar MainClass *.class,然后java -jar app.jar。 最后,生成相关问题的时候,可以围绕编译问题、依赖管理、参数传递、环境配置等方面提问,帮助用户进一步理解和解决问题。</think>### 如何在Linux命令行执行Javamain方法 #### 步骤说明 1. **编译Java源文件** 使用 `javac` 命令编译 `.java` 文件生成 `.class` 字节码文件。例如: ```bash javac YourClass.java ``` 若需指定外部依赖库(如 `lib.jar`),使用 `-cp` 参数: ```bash javac -cp .:lib.jar YourClass.java # 使用冒号分隔多个路径[^3] ``` 2. **执行main方法** 使用 `java` 命令运行编译后的文件,格式为: ```bash java [options] 完整名 [参数1 参数2 ...] ``` - **示例1(无依赖)**: ```bash java YourClass ``` - **示例2(带外部依赖)**: ```bash java -cp .:lib.jar com.example.YourClass arg1 arg2 # 传递参数arg1、arg2[^1] ``` - **示例3(设置系统属性)**: ```bash java -Dconfig.path=/opt/config YourClass # 通过-D定义系统属性 ``` 3. **使用通配符加载多JAR** 若需加载目录下所有JAR文件(如 `libs/*`),使用: ```bash java -cp ".:libs/*" YourClass # 注意引号避免路径被shell解析[^3] ``` 4. **直接运行未编译的Java文件(JDK 11+)** Java 11及以上版本支持单文件直接运行: ```bash java YourClass.java # 自动编译并执行 ``` #### 关键注意事项 - **名与结构**:若中(如 `package com.example;`),需确保目录结构与名匹配,并指定完整名: ```bash java -cp . com.example.YourClass ``` - **Java版本一致性**:使用 `java -version` 确认服务器JDK版本与编译环境一致。 - **环境变量配置**:若出现 `java: command not found`,需配置 `JAVA_HOME` 并添加 `PATH`。 #### 扩展方法:生成可执行JAR 1. 创建含主声明的 `MANIFEST.MF`: ``` Main-Class: com.example.YourClass ``` 2.并运行: ```bash jar cvfe app.jar com.example.YourClass *.class java -jar app.jar ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值