文章未完成,先做记录
执行maven的package命令,将程序打包成jar,在执行java -jar xxx.jar
时会报找不到某个类,或者提示“没有物料清单属性”:
错误信息
- 提示
Exception in thread "main" java.lang.NoClassDefFoundError
异常
问题原因:打包的jar中没有将使用的第三方jar的类打包在内,如果打包的jar在几十K左右大小,那么就有可能会造成该异常 - 提示
no main manifest attribute, in xxxx.jar
问题原因:没有在jar中的MANIFEST.MF
中声明主方法所在的类,即Main-Class
属性
MANIFEST.MF
一般不需要自己手动去创建或者定义其中的属性,可以通过插件自动生成
解决办法
- 在pom中添加
maven-jar-plugin
插件
作用:负责在生成的MANIFEST.MF
中添加主方法类的声明,可以解决no main manifest attribute, in xxxx.jar
错误信息
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<!-- 这里指定了要执行的main方法的类 -->
<!-- 会在生成jar中的/META-INF/MANIFEST.MF中声明该类 -->
<mainClass>com.beemo.XX</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
...
MANIFEST.MF
如下:
...
Main-Class: com.beemo.XX
...
- 在pom中添加
maven-shade-plugin
插件
作用:负责将引用的第三方jar中的类进行处理,一并打包在jar中。可以解决Exception in thread "main" java.lang.NoClassDefFoundError
异常信息
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<createDependencyReducedPom>false</createDependencyReducedPom>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
添加完这两个插件之后,再执行maven package机会发现jar包从原来的几十K变为了几十兆,查看其中文件会引用的第三方jar中的类也被打包在内
此时执行java -jar xxx.jar
就可以执行成功了