后端项目打包相关问题解决
在对项目进行打包后,我运行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中。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现