使用Ant构建项目时出现java.lang.NoClassDefFoundError的解决方法
问题:Ant构建Spring Boot项目运行时抛出NoClassDefFoundError
Jar文件已成功生成,但运行阶段抛出如下错误:
[java] Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/boot/SpringApplication [java] at com.example.DemoApplication.main(Unknown Source) [java] Caused by: java.lang.ClassNotFoundException: org.springframework.boot.SpringApplication [java] at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) [java] at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) [java] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) [java] ... 1 more [java] Java Result: 1
对应的build.xml内容:
<path id="classpath"> <fileset dir="lib" includes="**/*.jar" /> </path> <target name="clean"> <delete dir="build"/> <delete dir="lib"/> </target> <target name="compile"> <mkdir dir="build/classes"/> <javac srcdir="src" destdir="build/classes" classpathref="classpath"/> </target> <target name="jar"> <mkdir dir="build/jar"/> <jar destfile="build/jar/HelloWorld.jar" basedir="build/classes"> <manifest> <attribute name="Main-Class" value="com.example.DemoApplication"/> </manifest> </jar> </target> <target name="run" depends="jar"> <java jar="build/jar/HelloWorld.jar" fork="true" /> </target> <target name="all" depends="clean,resolve, compile, jar, run"/> <target name="resolve"> <ivy:retrieve /> </target> </project>
解决方法
方法1:运行时指定完整类路径
当前run目标仅执行自己生成的Jar,但未加载lib目录下的依赖包。修改run目标,明确指定主类并包含完整类路径:
<target name="run" depends="jar"> <java classname="com.example.DemoApplication" fork="true"> <classpath> <path refid="classpath"/> <pathelement location="build/jar/HelloWorld.jar"/> </classpath> </java> </target>
方法2:构建包含依赖的可执行胖Jar
如果希望生成独立可执行的Jar,可修改jar目标,将lib目录下的所有依赖包内容合并到生成的Jar中:
<target name="jar"> <mkdir dir="build/jar"/> <jar destfile="build/jar/HelloWorld.jar" basedir="build/classes"> <manifest> <attribute name="Main-Class" value="com.example.DemoApplication"/> </manifest> <!-- 引入lib目录下的所有依赖Jar内容 --> <zipgroupfileset dir="lib" includes="**/*.jar"/> </jar> </target>
两种方法任选其一即可解决类找不到的问题。注意all目标的执行顺序clean→resolve→compile→jar→run是正确的,能确保每次构建都重新下载依赖并编译打包。
内容的提问来源于stack exchange,提问作者Regina
相关产品推荐
相关产品推荐

