Linux下运行Java -jar 报错: Could not find or load main class

时间:2021-07-23 06:27:44
最近在用maven assembly plugin开发一个程序,将程序class文件和依赖的jar包一起打成一个可执行的jar。所以用了maven assembly插件。
这是一个demo代码:
public class HelloTest {

  public static void main(String[] args){
     System.out.println("@@@@@@@@@@@@ Hello World! From HelloTest!! ");
  }
}

这是打包后的jar文件Test3-0.0.1-assembly.jar目录:
|-----META-INF
|         |
|         |---MANIFEST.MF
|
|-----Test3-0.0.1.jar

这是manifest文件:
Manifest-Version: 1.0
Build-Jdk: 1.6.0_18
Class-Path: Test3-0.0.1.jar
Created-By: Apache Maven
Main-Class: com.example.HelloTest
Archiver-Version: Plexus Archiver

很奇怪的是运行mvn clean packge后打出来的jar文件manifest缺少Class-Path信息,但是源码本身的Test3-0.0.1.jar在assembly jar包里,为了让程序执行,我自己手动在manifest中加了Class-Path: Test3-0.0.1.jar,不知道是我哪里配置问题,求指教。
运行java -jar Test3-0.0.1-assembly.jar,在windows下OK,但是我把jar包拷到linux(ubuntu)下运行就报错了:
Error: Could not find or load main class com.example.HelloTest
为什么同样一个jar包在两个系统中一个可以运行,一个不行呢,求大大指教啊。。。

7 个解决方案

#1


另外一个没有jre环境。

#2


ubuntu上也有java环境。

#3


那你输出执行echo $CLASSPATH看看输出什么

#4


/usr/java/jdk1.7.0_51/lib。

我发现为啥在win下能运行,ubuntu上不行了。因为在win下我是在target目录下执行java -jar的,而target下除了Test3-0.0.1-assembly.jar外,还并列的有maven产生的Test3-0.0.1.jar,所以java找manifest的main class时就可以从这个Test3-0.0.1.jar里面找到,而如果我把Test3-0.0.1-assembly.jar拷贝到win下其他目录,报的错就是和ubuntu上一样。
所以我有个认识误区,我以为Test3-0.0.1-assembly.jar里有Test3-0.0.1.jar(包含具体class文件),就应该可以运行,所以这种多层的jar文件是不是不能这样直接运行啊?

#5


引用 3 楼 fangmingshijie 的回复:
那你输出执行echo $CLASSPATH看看输出什么


那我这个需求该怎么解决呢?就是我需要打一个单一的可执行jar,并把所有的工程依赖jar也打入这个jar中。

#6


引用 4 楼 zuogan_whut 的回复:
/usr/java/jdk1.7.0_51/lib。

我发现为啥在win下能运行,ubuntu上不行了。因为在win下我是在target目录下执行java -jar的,而target下除了Test3-0.0.1-assembly.jar外,还并列的有maven产生的Test3-0.0.1.jar,所以java找manifest的main class时就可以从这个Test3-0.0.1.jar里面找到,而如果我把Test3-0.0.1-assembly.jar拷贝到win下其他目录,报的错就是和ubuntu上一样。
所以我有个认识误区,我以为Test3-0.0.1-assembly.jar里有Test3-0.0.1.jar(包含具体class文件),就应该可以运行,所以这种多层的jar文件是不是不能这样直接运行啊?


你这个classpath配的不多,windows下如何配classpath的,前面有点分号(.;)的

#7


引用 6 楼 fangmingshijie 的回复:
Quote: 引用 4 楼 zuogan_whut 的回复:

/usr/java/jdk1.7.0_51/lib。

我发现为啥在win下能运行,ubuntu上不行了。因为在win下我是在target目录下执行java -jar的,而target下除了Test3-0.0.1-assembly.jar外,还并列的有maven产生的Test3-0.0.1.jar,所以java找manifest的main class时就可以从这个Test3-0.0.1.jar里面找到,而如果我把Test3-0.0.1-assembly.jar拷贝到win下其他目录,报的错就是和ubuntu上一样。
所以我有个认识误区,我以为Test3-0.0.1-assembly.jar里有Test3-0.0.1.jar(包含具体class文件),就应该可以运行,所以这种多层的jar文件是不是不能这样直接运行啊?


你这个classpath配的不多,windows下如何配classpath的,前面有点分号(.;)的


linux 下是 .:/usr/java/jdk1.7.0_51/lib,这个设置了也没用,我觉得是不是这种jar中嵌套着jar导致找不到class,因为程序的主类是以jar形式嵌套在里面的。

#1


另外一个没有jre环境。

#2


ubuntu上也有java环境。

#3


那你输出执行echo $CLASSPATH看看输出什么

#4


/usr/java/jdk1.7.0_51/lib。

我发现为啥在win下能运行,ubuntu上不行了。因为在win下我是在target目录下执行java -jar的,而target下除了Test3-0.0.1-assembly.jar外,还并列的有maven产生的Test3-0.0.1.jar,所以java找manifest的main class时就可以从这个Test3-0.0.1.jar里面找到,而如果我把Test3-0.0.1-assembly.jar拷贝到win下其他目录,报的错就是和ubuntu上一样。
所以我有个认识误区,我以为Test3-0.0.1-assembly.jar里有Test3-0.0.1.jar(包含具体class文件),就应该可以运行,所以这种多层的jar文件是不是不能这样直接运行啊?

#5


引用 3 楼 fangmingshijie 的回复:
那你输出执行echo $CLASSPATH看看输出什么


那我这个需求该怎么解决呢?就是我需要打一个单一的可执行jar,并把所有的工程依赖jar也打入这个jar中。

#6


引用 4 楼 zuogan_whut 的回复:
/usr/java/jdk1.7.0_51/lib。

我发现为啥在win下能运行,ubuntu上不行了。因为在win下我是在target目录下执行java -jar的,而target下除了Test3-0.0.1-assembly.jar外,还并列的有maven产生的Test3-0.0.1.jar,所以java找manifest的main class时就可以从这个Test3-0.0.1.jar里面找到,而如果我把Test3-0.0.1-assembly.jar拷贝到win下其他目录,报的错就是和ubuntu上一样。
所以我有个认识误区,我以为Test3-0.0.1-assembly.jar里有Test3-0.0.1.jar(包含具体class文件),就应该可以运行,所以这种多层的jar文件是不是不能这样直接运行啊?


你这个classpath配的不多,windows下如何配classpath的,前面有点分号(.;)的

#7


引用 6 楼 fangmingshijie 的回复:
Quote: 引用 4 楼 zuogan_whut 的回复:

/usr/java/jdk1.7.0_51/lib。

我发现为啥在win下能运行,ubuntu上不行了。因为在win下我是在target目录下执行java -jar的,而target下除了Test3-0.0.1-assembly.jar外,还并列的有maven产生的Test3-0.0.1.jar,所以java找manifest的main class时就可以从这个Test3-0.0.1.jar里面找到,而如果我把Test3-0.0.1-assembly.jar拷贝到win下其他目录,报的错就是和ubuntu上一样。
所以我有个认识误区,我以为Test3-0.0.1-assembly.jar里有Test3-0.0.1.jar(包含具体class文件),就应该可以运行,所以这种多层的jar文件是不是不能这样直接运行啊?


你这个classpath配的不多,windows下如何配classpath的,前面有点分号(.;)的


linux 下是 .:/usr/java/jdk1.7.0_51/lib,这个设置了也没用,我觉得是不是这种jar中嵌套着jar导致找不到class,因为程序的主类是以jar形式嵌套在里面的。