在这里,我们将给大家分享关于当我的JAR位于类路径上时,为什么Ant会说“NoClassDefFound”?的知识,同时也会涉及到如何更有效地Class.java:-2处的java.lang.NoCl
在这里,我们将给大家分享关于当我的JAR位于类路径上时,为什么Ant会说“ NoClassDefFound”?的知识,同时也会涉及到如何更有效地Class.java:-2处的java.lang.NoClassDefFoundError、ClassNotFoundException 和 NoClassDefFoundError 有什么区别?、java – NoClassDefFoundError和ClassNotFoundException、java – Spring – 从类路径资源[Beans.xml]加载XML bean定义 – NoClassDefFoundError的内容。
本文目录一览:- 当我的JAR位于类路径上时,为什么Ant会说“ NoClassDefFound”?
- Class.java:-2处的java.lang.NoClassDefFoundError
- ClassNotFoundException 和 NoClassDefFoundError 有什么区别?
- java – NoClassDefFoundError和ClassNotFoundException
- java – Spring – 从类路径资源[Beans.xml]加载XML bean定义 – NoClassDefFoundError
当我的JAR位于类路径上时,为什么Ant会说“ NoClassDefFound”?
我正在使用Java 1.6,Eclipse和Ant。
以下是我创建和运行jar文件的目标:
<!-- Settings --> <property file="build.properties" /> <path id="classpath"> <fileset dir="${lib.dir}" includes="**/*.jar" /> </path> <!-- Compile --> <target name="compile"> <mkdir dir="${classes.dir}" /> <javac srcdir="${src.dir}" destdir="${classes.dir}" includeantruntime="false"> <classpath refid="classpath" /> </javac> </target> <!-- Package .jar --> <target name="jar"> <mkdir dir="${jar.dir}" /> <jar destfile="${jar.dir}/App.jar" basedir="${classes.dir}"> <manifest> <attribute name="Main-Class" value="main.App" /> </manifest> </jar> </target> <!-- Run .jar --> <target name="run"> <java jar="${jar.dir}/App.jar" fork="true" /> </target>
问题是,当我(通过Ant或命令行)运行此jar时,收到错误消息:
Exception in thread "main" java.lang.NoClassDefFoundError: net/xeoh/plugins/base/impl/PluginManagerFactory [java] at plugins.PluginLoader.<clinit>(Unknown Source)
一些可能有用的知识:
当我打印我的类路径时,它表明所有必需的JAR都在其中。它还显示了类路径的Eclipse GUI版本。
我尝试清理项目(通过Eclipse和Ant)都无济于事。
似乎缺少的库.jar 不是 .jar中的.jar(这似乎是一个常见问题)。
这是唯一的错误。其他班级似乎都觉得图书馆不错…
答案1
小编典典您已经设置了编译类路径,但是App.jar不包括您的库(仅包含您编译的类)或清单类路径。
您需要执行以下操作:
<target name="jar"> <mkdir dir="${jar.dir}" /> <manifestclasspath property="manifest.classpath" jarfile="${jar.dir}/App.jar"> <classpath refid="classpath" /> </manifestclasspath> <jar destfile="${jar.dir}/App.jar" basedir="${classes.dir}"> <manifest> <attribute name="Main-Class" value="main.App" /> <attribute name="Class-Path" value="${manifest.classpath}" />. </manifest> </jar></target>
另请参见ant
manifestclasspath任务
Class.java:-2处的java.lang.NoClassDefFoundError
现在可以了(但是您的测试失败了):
- 添加到非Spring引导项目的build.gradle(我的意思是您的存储库项目的build.gradle)
bootJar
{
enabled = false
}
jar
{
enabled = true
}
-
./gradlew clean build
ClassNotFoundException 和 NoClassDefFoundError 有什么区别?
身处险境的人总在谋求安稳,活于规则的人又在追逐自由。
在写Java程序的时候,当一个类找不到的时候,JVM有时候会抛出ClassNotFoundException异常,而有时候又会抛出NoClassDefFoundError。看两个异常的字面意思,好像都是类找不到,但是JVM为什么要用两个异常去区分类找不到的情况呢?这个两个异常有什么不同的地方呢?
ClassNotFoundException
ClassNotFoundException是一个运行时异常。从类继承层次上来看,ClassNotFoundException是从Exception继承的,所以ClassNotFoundException是一个检查异常。
当应用程序运行的过程中尝试使用类加载器去加载Class文件的时候,如果没有在classpath中查找到指定的类,就会抛出ClassNotFoundException。一般情况下,当我们使用Class.forName()或者ClassLoader.loadClass以及使用ClassLoader.findSystemClass()在运行时加载类的时候,如果类没有被找到,那么就会导致JVM抛出ClassNotFoundException。
最简单的,当我们使用JDBC去连接数据库的时候,我们一般会使用Class.forName()的方式去加载JDBC的驱动,如果我们没有将驱动放到应用的classpath下,那么会导致运行时找不到类,所以运行Class.forName()会抛出ClassNotFoundException。
public class MainClass {
public static void main(String[] args) {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
输出:
java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at MainClass.main(MainClass.java:7)
NoClassDefFoundError
NoClassDefFoundError异常,看命名后缀是一个Error。从类继承层次上看,NoClassDefFoundError是从Error继承的。和ClassNotFoundException相比,明显的一个区别是,NoClassDefFoundError并不需要应用程序去关心catch的问题。
当JVM在加载一个类的时候,如果这个类在编译时是可用的,但是在运行时找不到这个类的定义的时候,JVM就会抛出一个NoClassDefFoundError错误。比如当我们在new一个类的实例的时候,如果在运行是类找不到,则会抛出一个NoClassDefFoundError的错误。
public class TempClass {
}
public class MainClass {
public static void main(String[] args) {
TempClass t = new TempClass();
}
}
首先这里我们先创建一个TempClass,然后编译以后,将TempClass生产的TempClass.class文件删除,然后执行程序,输出:
Exception in thread "main" java.lang.NoClassDefFoundError: TempClass
at MainClass.main(MainClass.java:6)
Caused by: java.lang.ClassNotFoundException: TempClass
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more
总结
java – NoClassDefFoundError和ClassNotFoundException
我收到这些错误:
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/gson/stream/JsonReader;
Caused by: java.lang.classNotFoundException: Didn't find class "com.google.gson.stream.JsonReader" on path: DexPathList[[zip file "/data/app/project.1stApp.youtubeplayer-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available
当我尝试运行我的应用程序时,这个’com.google.gson’库是我添加到项目中的jar文件,当我遇到这个问题时无法理解.
没有添加代码,因为我发现它没有与错误相关…
解决方法:
将jar复制到libs文件夹中,并将其添加到build.gradle依赖项中
compile filetree(dir: 'libs', include: ['*.jar'])
compile 'com.google.code.gson:gson:2.3.1'
(交换2.3.1为您的json版本,或使用2.3.*)
别忘了同步
java – Spring – 从类路径资源[Beans.xml]加载XML bean定义 – NoClassDefFoundError
May 26,2015 11:42:45 AM org.springframework.context.support.ClasspathXmlApplicationContext prepareRefresh INFO: Refreshing org.springframework.context.support.ClasspathXmlApplicationContext@31221be2: startup date [Tue May 26 11:42:45 CST 2015]; root of context hierarchy May 26,2015 11:42:45 AM org.springframework.beans.factory.xml.XmlBeanDeFinitionReader loadBeanDeFinitions INFO: Loading XML bean deFinitions from class path resource [Beans.xml] Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/expression/ParserContext at org.springframework.context.support.AbstractApplicationContext.preparebeanfactory(AbstractApplicationContext.java:553) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:455) at org.springframework.context.support.ClasspathXmlApplicationContext.<init>(ClasspathXmlApplicationContext.java:139) at org.springframework.context.support.ClasspathXmlApplicationContext.<init>(ClasspathXmlApplicationContext.java:83) at com.tutorialspoint.MainApp.main(MainApp.java:9) Caused by: java.lang.classNotFoundException: org.springframework.expression.ParserContext at java.net.urlclassloader$1.run(UnkNown Source) at java.net.urlclassloader$1.run(UnkNown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.urlclassloader.findClass(UnkNown Source) at java.lang.classLoader.loadClass(UnkNown Source) at sun.misc.Launcher$AppClassLoader.loadClass(UnkNown Source) at java.lang.classLoader.loadClass(UnkNown Source) ... 5 more
知道我哪里做错了.据我所知,我正在正确地学习本教程.
码
package com.tutorialspoint; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClasspathXmlApplicationContext; public class MainApp { public static void main(String[] args) { ApplicationContext context = new ClasspathXmlApplicationContext("Beans.xml"); HelloWorld obj = (HelloWorld) context.getBean("helloWorld"); obj.getMessage(); } }
beans.xml中
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="helloWorld"> <property name="message" value="Hello World!"/> </bean> </beans>
解决方法
org.springframework.expression.ParserContext类位于spring-expresssion-YOUR_SPRING_VERSION.jar中.检查是否在类路径中添加了此jar.
今天关于当我的JAR位于类路径上时,为什么Ant会说“ NoClassDefFound”?的讲解已经结束,谢谢您的阅读,如果想了解更多关于Class.java:-2处的java.lang.NoClassDefFoundError、ClassNotFoundException 和 NoClassDefFoundError 有什么区别?、java – NoClassDefFoundError和ClassNotFoundException、java – Spring – 从类路径资源[Beans.xml]加载XML bean定义 – NoClassDefFoundError的相关知识,请在本站搜索。
本文标签: