0%

Maven 打包后jar中没有主清单属性

两个问题,第一个是jar中没有主清单属性,第二个是jar 中缺少依赖


背景

写了一个Kafka的Java小工目,打包成jar包到服务器上执行,报错kafkaTool-1.0-SNAPSHOT-jar-with-dependencies.jar中没有主清单属性

解决后又遇到如下错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: scala/collection/Map
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)
at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Caused by: java.lang.ClassNotFoundException: scala.collection.Map
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 7 more

把问题记录下,下次查看也方便

  1. jar 中没有主清单属性
  2. jar 中缺少依赖

处理

执行没有主类处理

1.打包时指定了主类,可以直接用java -jar xxx.jar
2.打包时没有指定主类,可以用java -cp xxx.jar 主类名称(绝对路径)
3.要引用其他的jar包,可以用java -classpath $CLASSPATH:xxxx.jar 主类名称(绝对路径)。其中 -classpath 指定需要引入的类

1
2
3
4
5
# 指定主类时直接执行
java -jar kafkaTool-1.0-SNAPSHOT-jar-with-dependencies.jar

# 即没有指定mainClass时,用该命令
java -cp kafkaTool-1.0-SNAPSHOT-jar-with-dependencies.jar org.tu.OpTool

依赖处理

用maven导出的包中,如果没有在pom文件中将依赖包打进去,是没有依赖包。在pom中加入打包依赖的配置即可

pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.tencent.kp.OpTool</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<!--下面是为了使用 mvn package命令,如果不加则使用mvn assembly-->
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

参考链接