后端项目打包相关问题解决

在对项目进行打包后,我运行jar包发现出现下面错误:

no main manifest attribute, in "app.jar" 在“ app.jar”中没有主清单属性

说明jar包里面的META-INF/MANIFEST.MF文件中没有Main-Class这个属性

于是我解压jar包,到META-INF/MANIFEST.MF文件中手动添加了Main-Class: com.xxx.xxxApplication

 

jar xf your-app.jar 

 

修改后,重新生成jar包,并进行运行

jar -cfm your-app.jar META-INF/MANIFEST.MF -C . .
java -jar your-app.jar

运行之后报错

复制代码
Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/boot/SpringApplication
        at com.st.voucher.VoucherApplication.main(VoucherApplication.java:15)
Caused by: java.lang.ClassNotFoundException: org.springframework.boot.SpringApplication
        at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 1 more
复制代码

但是通过jar -tf 查看jar包的结构,确定所有的类和依赖项都包含在 JAR 文件中。

最后!!!问题解决!!!

 

通过修改项目的pom文件得到解决
这是未修改的pom文件

复制代码
<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.xxx.xxxApplication</mainClass>
            </plugin>
        </plugins>
    </build>
复制代码

这是修改后的pom文件

 

复制代码
<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.xiaohao.ManageApplication</mainClass>
                    <!--<skip>true</skip>-->
                    <!--<includeSystemScope>true</includeSystemScope>-->
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
复制代码

 

<skip>设置true会跳过主启动类,打包运行会提示没有主清单属性,服务启动失败;

<includeSystemScope>此选项在构建可执行JAR时包含具有“system”范围的依赖关系。具有“system”范围的依赖关系通常由操作系统或运行时环境提供。代表maven打包时会将外部引入的jar包(比如在根目录下或resource文件下新加外部jar包)打包到项目jar,在服务器上项目才能运行,不加此配置,本地可以运行,因为本地可以再lib下找到外部包,但是服务器上jar中是没有的。

<executions>此部分定义了插件的执行。在这种情况下,有一个ID为“repackage”且目标为“repackage”的执行。此执行负责重新打包JAR,使其可执行。重新打包涉及将所有依赖项和主JAR组合到一个单独的可执行JAR中。

 

 

posted @   xiaogh  阅读(248)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示