java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
问题背景
在部署优雅草蜻蜓z系统的时候也遇到这个问题,那么如何解决呢、这个问题基本就是构建脚本中没有指定主类,而且我们发现打包的大小明显小于正常大小,
造成的原因有以下3种可能:
1,maven打包中多余true配置跳过了主程序
2,这个问题通常是由于生成的jar包缺少Manifest文件中的Main-Class属性引起的,甚至是没有Manifest文件引起的。
解决方案
第一种原因引起
问题很好处理,注释或者直接删除在build 中 关于 有skip ture的。
也就是这个造成的
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
不过这个问题我们并没有
因此排除。
第二种原因引起
方法一:手动添加或修改Manifest文件(没有使用maven)
以优雅草蜻蜓z系统为例,我们的主类com.yyc.songshu.manager
那么我就创建一个Manifest.mf文件里面的内容就是
Manifest-Version: 1.0
Main-Class: com.yyc.songshu.manager
com.yyc.songshu.manager 是写你自己的项目主类名
编译打包,执行”jar cvfm z-server.jar Manifest.mf com.yyc.songshu.manager “
这里,com.yyc.songshu.manager
是你的JAR文件名,Manifest.mf
是你的Manifest文件,com.yyc.songshu.manager/
是包含你编译的.class
文件的目录。
扩展知识:
基本命令介绍
在 Java 中,jar cvfm是用于创建 JAR(Java Archive)文件的命令。jar是 Java Archive 工具的命令,c代表创建(create),v代表详细输出(verbose),f代表指定文件名(file),m代表包含清单文件(manifest)。
具体参数解释
c(创建)
这个参数告诉jar工具要创建一个新的 JAR 文件。例如,你有一些编译好的.class文件和其他资源文件,如配置文件、图片等,使用c参数就可以将它们打包成一个 JAR 文件,方便分发和使用。
v(详细输出)
当使用v参数时,在创建 JAR 文件的过程中,命令会在控制台输出详细的打包信息。这些信息包括正在添加的文件的名称、大小等内容。例如,它会显示 “adding: com/company/MyClass.class (3420 bytes)” 这样的信息,让你清楚地了解每个文件的打包情况。
f(指定文件名)
f参数用于指定要创建的 JAR 文件的名称。如果不使用这个参数,jar工具会根据标准输入来确定文件名,但这样可能会导致一些混淆。通过使用f参数,你可以明确地指定一个文件名,如myapp.jar,这样生成的 JAR 文件就会按照你指定的名称保存。
m(包含清单文件)
m参数用于将一个清单文件(META - INF/MANIFEST.MF)包含到 JAR 文件中。清单文件是 JAR 文件中的一个重要组成部分,它可以包含关于 JAR 文件的各种信息,如主类(Main - Class)的名称、版本信息、类路径等。例如,在一个可执行的 JAR 文件中,清单文件中的主类名称是非常关键的,因为当你运行这个 JAR 文件时,Java 虚拟机会根据清单文件中的主类来启动应用程序。
但是我们打包是用的maven 因此需要以下方法二
方法二:使用maven构建工具
使用maven构建工具来管理Java项目的情况,你可以在构建脚本中指定主类。在pom.xml
文件添加以下内容
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration> <archive> <manifest> <addClasspath>true</addClasspath>
<mainClass>com.yyc.songshu.manager</mainClass>
</manifest>
</archive> </configuration></plugin>
这回我们重新打包试试,成功,再次上传jar 去执行,现在没问题了。