GVKun编程网logo

当我的JAR位于类路径上时,为什么Ant会说“ NoClassDefFound”?

28

在这里,我们将给大家分享关于当我的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”?

当我的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

Class.java:-2处的java.lang.NoClassDefFoundError

现在可以了(但是您的测试失败了):

  1. 添加到非Spring引导项目的build.gradle(我的意思是您的存储库项目的build.gradle)

    bootJar 
    {
        enabled = false
    }

    jar 
    {
        enabled = true
    }
  1. ./gradlew clean build

ClassNotFoundException 和 NoClassDefFoundError 有什么区别?

ClassNotFoundException 和 NoClassDefFoundError 有什么区别?

身处险境的人总在谋求安稳,活于规则的人又在追逐自由。

在写Java程序的时候,当一个类找不到的时候,JVM有时候会抛出ClassNotFoundException异常,而有时候又会抛出NoClassDefFoundError。看两个异常的字面意思,好像都是类找不到,但是JVM为什么要用两个异常去区分类找不到的情况呢?这个两个异常有什么不同的地方呢?

ClassNotFoundException

ClassNotFoundException是一个运行时异常。从类继承层次上来看,ClassNotFoundException是从Exception继承的,所以ClassNotFoundException是一个检查异常。
image
当应用程序运行的过程中尝试使用类加载器去加载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的问题。
image
当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

总结

image

java – NoClassDefFoundError和ClassNotFoundException

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

java – Spring – 从类路径资源[Beans.xml]加载XML bean定义 – NoClassDefFoundError

我是 Spring的新手,我指的是我的第一个Spring项目 this tutorial.按照所有指令,我尝试运行程序,但我有这个错误.
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>

解决方法

检查是否在类路径中添加了所有必需的jar.

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的相关知识,请在本站搜索。

本文标签: