no main manifest attribute, in /app/app.jar

Docker中解决Spring Boot应用缺少主清单属性问题
本文介绍了在Docker环境下部署Spring Boot应用时遇到的‘No main manifest attribute’错误的解决方案。通过在pom.xml中添加spring-boot-maven-plugin和dockerfile-maven-plugin的配置,并指明主类,以及在Dockerfile中正确设置ENTRYPOINT,成功解决了项目启动问题。同时,强调了项目名称信息的重要性。

一 概述

        今天在发布项目到docker容器中的时候,项目启动没有报错,但是日志提示:

no main manifest attribute, in /app/app.jar

二 修复

        增加配置:

 <build>
        <finalName>${project.name}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <includeSystemScope>true</includeSystemScope>
                    <--指定主类-->
                    <mainClass>com.**.**.xxxApplication</mainClass>
                </configuration>
            </plugin>

            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>dockerfile-maven-plugin</artifactId>
                <dependencies>
                    <dependency>
                        <groupId>javax.activation</groupId>
                        <artifactId>activation</artifactId>
                        <version>1.1.1</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <repository>${project.artifactId}</repository>
                    <buildArgs>
                        <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
                    </buildArgs>
                </configuration>
            </plugin>
        </plugins>
    </build>

        注意增加项目名称信息

<name>api-thirdparty</name>

        补充dockerfile配置:

FROM openjdk:8-jdk-alpine
COPY ./target/*.jar /app/app.jar
# ENTRYPOINT ["java","-Xmx500m","-jar","/app/app.jar"]
ENTRYPOINT ["java","-Xmx500m","-jar","-Dspring.profiles.active=dev","/app/app.jar"]
EXPOSE 端口号如:8168

        如有更多细节后续补充。。。

当运行一个 JAR 文件时出现 `no main manifest attribute` 错误,表示 JAR 文件的 `MANIFEST.MF` 文件中没有定义 `Main-Class` 属性,导致 Java 无法确定程序的入口类。 ### 解决方法 #### 1. 使用 `jar` 命令手动添加 `Main-Class` 属性 可以手动编辑 JAR 文件的 `MANIFEST.MF` 文件,添加 `Main-Class` 属性,指定程序的主类。 ```bash jar cfe your-app.jar com.example.Main -C classes/ . ``` 此命令会创建一个 JAR 文件,并在 `MANIFEST.MF` 中自动添加 `Main-Class: com.example.Main` 属性。 #### 2. 使用 Maven 插件配置主类 如果项目使用 Maven 构建,可以通过配置 `maven-jar-plugin` 或 `maven-shade-plugin` 来指定主类。 ##### 使用 `maven-jar-plugin` 配置主类 ```xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.5.0</version> <configuration> <archive> <manifest> <mainClass>com.example.Main</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> ``` ##### 使用 `maven-shade-plugin` 配置主类(适用于包含依赖的可执行 JAR) ```xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.1.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.example.Main</mainClass> </transformer> </transformers> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> </configuration> </execution> </executions> </plugin> </plugins> </build> ``` #### 3. 使用 `ManifestResourceTransformer` 合并多个 JAR 文件时指定主类 在合并多个 JAR 文件时,如果 `Main-Class` 被覆盖或丢失,可以在 `maven-shade-plugin` 中使用 `ManifestResourceTransformer` 来显式指定主类 [^4]。 #### 4. 检查 JAR 文件内容 可以通过以下命令查看 JAR 文件的 `MANIFEST.MF` 内容: ```bash jar xf your-app.jar META-INF/MANIFEST.MF cat META-INF/MANIFEST.MF ``` 确认 `Main-Class` 是否正确设置。 #### 5. 使用 `java -cp` 指定主类运行 JAR 如果无法修改 JAR 文件的 `MANIFEST.MF`,也可以通过命令行手动指定主类运行: ```bash java -cp your-app.jar com.example.Main ``` 这种方式无需修改 JAR 文件即可运行程序。 --- ### 总结 `no main manifest attribute` 错误的根本原因是 JAR 文件中缺少 `Main-Class` 属性。可以通过手动编辑 `MANIFEST.MF`、配置构建工具插件(如 Maven 插件)或在运行时显式指定主类来解决该问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值