maven项目可以运行但是打包后执行报错

发布时间:2023年12月18日

背景

一直依赖做的maven项目几乎都是spring项目,无脑导入个spring-boot-maven-plugin就能打包到处跑了。最近做了一个java脚本程序,懒得找包一个个导入library了,直接使用了maven工程,编译运行都没问题,打包后执行报错提示:java.lang.NoClassDefFoundError
在这里插入图片描述

问题分析

根据上面的报错原因,是找不到我导入的maven的依赖,我很确定我在dependencies中是有导入了的,不然我开发的时候怎么执行的呢。那它还是找不到的原因,只可能是打包的时候真的没有把依赖的文件打包进去

我们来求证一下这个推理,找到打好的包,使用压缩文件工具打开检查文件
在这里插入图片描述

真的除了我代码中的文件,maven依赖的包它是一个都没给我放进去,难怪会找不到文件呢

解决方案

导入maven插件工具shade即可解决该问题,在开发工具中,下面的goals -> goal中的shade会变红色,我也不知道为什么,但是我可以很确定告诉你,就是这么配置的。

还需要注意的是,这个插件与maven-jar-plugin是要共存的,否则会无法打包。而且如果执行的时候提示没有主清单属性,则需要在maven-jar-plugin中补充mainClass属性。

<build>
    <plugins>
        <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.example.YourMainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.3.0</version> <!-- 使用最新版本 -->
            <configuration>
                <createDependencyReducedPom>false</createDependencyReducedPom>
                <shadedArtifactAttached>true</shadedArtifactAttached>
                <shadedClassifierName>jar-with-dependencies</shadedClassifierName>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

加了这段配置之后,打包会生成两个 jar包,其中后缀为jar-with-dependencies就是你要拿去执行的包。

或者使用maven-assembly-plugin也可以,不过这个通常会在线上拉包,我个人不太喜欢,不过也给出示范了

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.3.0</version> <!-- 使用最新版本 -->
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <archive>
                    <manifest>
                        <mainClass>your.main.Class</mainClass>
                    </manifest>
                </archive>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

文章来源:https://blog.csdn.net/interestANd/article/details/135064694
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。