jar运行报错no main manifest attribute

今天自己学习Docker的时候,复制package的jar到docker中,运行的时候发现总是出现错误:

image-20231130234925229

**原因:**找不到主类进行加载,一般情况下,java 打包成 jar 包需要在 MANIFEST.MF 中指定 Main-Class项,以便运行 java -jar xxx.jar 时找到对应的主类。

将打包的jar解压后检验是否包含主类的文件:

image-20231130235152514

内容如下:

Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Archiver-Version: Plexus Archiver
Built-By: administered
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
Start-Class: com.example.DockerTestApplication // jar包的入口类
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 2.6.13
Created-By: Apache Maven 3.8.1
Build-Jdk: 1.8.0_331
Main-Class: org.springframework.boot.loader.JarLauncher

如果没有 Start-Class:入口类则表示无法进行加载

解决办法一

如果pom文件的build -> plugins 缺少打包的文件则需要添加如下代码

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.example.DockerTestApplication</mainClass>
                    <finalName>example</finalName>
					 <includes>
                            <include>
                                <groupId>nothing</groupId>
                                <artifactId>nothing</artifactId>
                            </include>
                     </includes>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
  • mainClass 标签里是你的项目的启动类的包路径,如果你的项目没有有启动类也不需要通过 java -jar 运行的话可以删除mainClass
  • finalName 标签里的就是打出来的 jar 名,我这里是 XTool ,最终生成的就是 XTool.jar 。若不使用 finalName 指定,则打包生成的 jar 包名默认使用 pom.xml 文件里 artifactId 标签和 version 标签里的值作为 jar 的名。
  • 如果你希望最终生成的 jar 包不包含第三方依赖那直接用上面的插件配置即可。如果希望最终生成的 jar 包里包含第三方依赖那就删

配置完成以后可以点击package进行打包

image-20231130235838323

打包完成以后可以在target默认文件夹下查看刚刚打包好的jar文件

image-20231130235915102

解决办法二

如果自己的pom文件和上面的文件类似的,可以查看一下自己的项目入口是否有<skip>标签

image-20231201000211353

我开始的pom文件和解决方法一其实很相似,但是就是多了这一个跳过编译的标签,所以直接跳过了项目入口的编译过程。导致找不到入口函数。去掉以后可以轻松进行编译。

似,但是就是多了这一个跳过编译的标签,所以直接跳过了项目入口的编译过程。导致找不到入口函数。去掉以后可以轻松进行编译。

Logo

鸿蒙生态一站式服务平台。

更多推荐