Mac运行Maven项目遇java.lang.NoClassDefFoundError及跨平台实现问询
问题分析与解决方案
错误原因与平台关联性
这个java.lang.NoClassDefFoundError错误并非macOS专属。你在Windows上能正常运行,大概率是因为运行环境自动包含了json-simple依赖(比如在IDE中运行时,IDE会自动加载Maven依赖库;或者手动将依赖jar添加到了类路径中)。而在Mac终端直接执行java -jar命令时,生成的jar包仅包含你自己的代码,没有打包依赖的json-simple类文件,导致JVM找不到对应的类。
实现跨平台运行的方法
要让项目在Windows、Mac等平台都能直接运行,需要将依赖的jar包打包进可执行jar中,或者确保运行时依赖能被正确加载。推荐以下两种Maven插件方案:
方案1:使用maven-assembly-plugin打包包含依赖的可执行jar
修改pom.xml的<build>部分,添加assembly插件配置:
<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>com.helloworld.Countries</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
执行mvn clean package后,target目录会生成一个后缀为-jar-with-dependencies.jar的文件,运行这个文件即可:
java -jar target/HelloWorld-1.0-jar-with-dependencies.jar
方案2:使用maven-shade-plugin打包可执行jar
shade插件可以将依赖合并到主jar中,还能处理类冲突问题,配置如下:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.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.helloworld.Countries</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build>
执行mvn clean package后,target目录下的主jar包(HelloWorld-1.0.jar)就已经包含了所有依赖,直接运行原命令即可:
java -jar target/HelloWorld-1.0.jar
以上两种方案打包后的jar都能在Windows、Mac等平台直接运行,实现跨平台需求。
内容的提问来源于stack exchange,提问作者NewBond007
相关产品推荐
相关产品推荐

