GVKun编程网logo

Groovy 2.5.0给出了noclassdeffounderror用于方法调用转换(groovy调用java类方法)

13

对于想了解Groovy2.5.0给出了noclassdeffounderror用于方法调用转换的读者,本文将提供新的信息,我们将详细介绍groovy调用java类方法,并且为您提供关于CachePro

对于想了解Groovy 2.5.0给出了noclassdeffounderror用于方法调用转换的读者,本文将提供新的信息,我们将详细介绍groovy调用java类方法,并且为您提供关于CacheProvider的异常NoClassDefFoundError、ClassNotFoundException 和 NoClassDefFoundError、ClassNotFoundException 和 NoClassDefFoundError 区别、ClassNotFoundException 和 NoClassDefFoundError 有什么区别?的有价值信息。

本文目录一览:

Groovy 2.5.0给出了noclassdeffounderror用于方法调用转换(groovy调用java类方法)

Groovy 2.5.0给出了noclassdeffounderror用于方法调用转换(groovy调用java类方法)

当我将项目从Groovy 2.4。*升级到Groovy 2.5.0时,使用Gradle进行编译时,它不会为org / codehaus / groovy /
ast / methodcalltransformation提供noclassdeffounderror。

在Groovy 2.4中工作正常。

在此处发布整个异常:

org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':compileGroovy'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:100)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:70)
        at org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:60)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:97)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:87)
        at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:52)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
        at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.run(DefaultTaskGraphExecuter.java:248)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:241)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:230)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:123)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:79)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:104)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:98)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:626)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:581)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:98)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: java.lang.NoClassDefFoundError: org/codehaus/groovy/ast/MethodCallTransformation
        at org.gradle.api.internal.tasks.compile.ApiGroovyCompiler$1.<init>(ApiGroovyCompiler.java:117)
        at org.gradle.api.internal.tasks.compile.ApiGroovyCompiler.execute(ApiGroovyCompiler.java:117)
        at org.gradle.api.internal.tasks.compile.ApiGroovyCompiler.execute(ApiGroovyCompiler.java:56)
        at org.gradle.api.internal.tasks.compile.daemon.AbstractDaemonCompiler$CompilerRunnable.run(AbstractDaemonCompiler.java:87)
        at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:36)
        at org.gradle.workers.internal.WorkerDaemonServer.execute(WorkerDaemonServer.java:46)
        at org.gradle.workers.internal.WorkerDaemonServer.execute(WorkerDaemonServer.java:30)
        at org.gradle.process.internal.worker.request.WorkerAction.run(WorkerAction.java:100)
        at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
        at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
        at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:146)
        at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:128)
        at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404)
        ... 3 more
Caused by: java.lang.ClassNotFoundException: org.codehaus.groovy.ast.MethodCallTransformation
        ... 16 more

CacheProvider的异常NoClassDefFoundError

CacheProvider的异常NoClassDefFoundError

我在Spring和Hibernate中是新手,所以我尝试基于Spring 3 + Hibernate 4来实现一些简单的Web应用程序,而当我启动tomcat时,我有以下异常:

java.lang.NoClassDefFoundError: org/hibernate/cache/CacheProviderat java.lang.Class.getDeclaredMethods0(Native Method)at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)at java.lang.Class.getDeclaredMethods(Class.java:1791)    ...Caused by: java.lang.ClassNotFoundException: org.hibernate.cache.CacheProviderat org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1678)at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1523)

我发现该类在hibernate 3的hibernate-core中,但是在hibernate 4中却找不到它。

我的context.xml中用于持久性的部分:

<bean id="dataSource">    <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>    <property name="url" value="jdbc:oracle:thin:@IP_Address:SID"/>    <property name="username" value="xxx"/>    <property name="password" value="xxx"/>    <property name="initialSize" value="5"/>    <property name="maxActive" value="20"/></bean><bean id="sessionFactory">    <property name="dataSource" ref="dataSource" />    <property name="packagesToScan" value="com.huawei.vms.user"/>    <property name="hibernateProperties">        <props>            <prop key="dialect">org.hibernate.dialect.Oracle10gDialect</prop>        </props>    </property></bean>

请帮我弄清楚为什么要尝试加载CacheProvider,因为在context.xml中没有任何设置,我必须在项目中添加哪个jar。谢谢!

答案1

小编典典

将你的AnnotationSessionFactoryBean更改为org.springframework.orm.hibernate4.LocalSessionFactoryBean(Hibernate 4),就可以了。AnnotationSessionFactoryBean被LocalSessionFactoryBean取代,因为它现在进行类路径扫描。

ClassNotFoundException 和 NoClassDefFoundError

ClassNotFoundException 和 NoClassDefFoundError

1. 概述
java.lang.NoClassDefFoundError 和 java.lang.ClassNotFoundException 都是 Java 语言层面的异常

NoClassDefFoundError :Thrown if the Java Virtual Machine or a ClassLoader instance tries to load in the definition of a class and no definition of the class could be found. 在 ClassLoader.loadClass () 方法中抛出 ClassNotFoundException : Thrown when an application tries to load in a class through its string name using:forName、findSystemClass、loadClas but no definition for the class with the specified name could be found.;在 ClassLoader.defineClass () 中抛出

本质性区别: 
NoClassDefFoundError 是程序在编译时候可以顺利找到所需要依赖的类的,但是在运行时依赖的类找不到或者可以找到多个,就会抛出这个 Error。ClassNotFoundException 在类路径错误,或者类名称发生更改,都会导致这个 Exception,这两个异常的出现在生产环境中,通常是由于依赖 jar 包多版本存在,jar 包升级中类或者方法不再提供引起的

2. 测试代码

package com.vip.vcp.ryan.zhaunzheng.ToLeExcep.ClassNotFoundAndNoClassDef;

import com.vip.vcp.ryan.zhaunzheng.map.PHashMap426.PLinkedHashMap;

import java.util.LinkedHashMap;
import java.util.Scanner;

/**
 * 模拟ClassNotFoundException和 NoClassDefFoundError两个异常
 * Created by ryan01.peng on 2017/5/8.
 */
public class TestClassAboutException {

    public static void main(String[] args) {
        System.out.println("---》》》TestClassAboutException编译已经通过啦!!!");
        toShowClassNotFoundException();
        toShowNoClassDefErr();
        toShowNoClassDefErr2();

    }

    public static  void  toShowClassNotFoundException(){
        try {
            //"com.vip.vcp.ryan.zhaunzheng.ToLeExcep.ClassNotFoundAndNoClassDef.TestClassAboutException"
            // 模拟jar包路劲改变或者,类名称改变引起的ClassNotFoundException
            Class cl = Class.forName("vip.vcp.ryan.zhaunzheng.ToLeExcep.ClassNotFoundAndNoClassDef.TestClassAboutException");// TestClassAboutException.class.getName()

            System.out.println("---》》》toShowClassNotFoundException ::: "+cl.getName());
        } catch (ClassNotFoundException e) {
            System.out.println("---》》》ClassNotFoundException 被捕捉到啦!!!");
            e.printStackTrace();
        }
    }

    public static  void toShowNoClassDefErr(){

        Scanner scanner = new Scanner(System.in);
        System.out.println("/n"+"是否进入NoClassDefErr复现环节: 输入1/0   ");
        //阻塞,删去类文件
        if (scanner.nextInt() == 1)
        {
            try {
                //com.vip.vcp.ryan.zhaunzheng.map.PHashMap426.PLinkedHashMap
                // 模拟在运行时,类文件丢失,则会产生NoClassDefFoundError
                Class c = Class.forName(PLinkedHashMap.class.getName());

                System.out.println("---》》》toShowNoClassDefErr :::" +c.getName());
            } catch (ClassNotFoundException e) {
                System.out.println("---》》》NoClassDefErr 被捕捉啦!!!");
                e.printStackTrace();
            }
        }
        else
            return;
    }

    public static  void toShowNoClassDefErr2(){
        Scanner scanner = new Scanner(System.in);
        System.out.println("/n"+"是否进入NoClassDefErr复现环节: 输入1/0   ");
        if (scanner.nextInt() == 1)
        {
            try {
                B bS = new B();
            } catch (Throwable e) {
                e.printStackTrace();
            }
            B b = new B();
        }
    }
}

初始化失败类 B

import java.util.HashMap;
import java.util.Map;

/**
 * Created by ryan01.peng on 2017/5/8.
 */

public class B {
    static {
           init();
    }
    public B() {
    }

    static void init(){
        System.out.println("B initializing and then Exception occurred");
        int re = 5/0;
        System.out.println(re);
    }
}

测试输出

"C:\Program Filcom.vip.vcp.ryan.zhaunzheng.ToLeExcep.ClassNotFoundAndNoClassDef.TestClassAboutException
java.lang.ClassNotFoundException: vip.vcp.ryan.zhaunzheng.ToLeExcep.ClassNotFoundAndNoClassDef.TestClassAboutException
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:191)
    at com.vip.vcp.ryan.zhaunzheng.ToLeExcep.ClassNotFoundAndNoClassDef.TestClassAboutException.toShowClassNotFoundException(TestClassAboutException.java:23)
    at com.vip.vcp.ryan.zhaunzheng.ToLeExcep.ClassNotFoundAndNoClassDef.TestClassAboutException.main(TestClassAboutException.java:15)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
---》》》TestClassAboutException编译已经通过啦!!!
---》》》ClassNotFoundException 被捕捉到啦!!!
null
/n是否进入NoClassDefErr复现环节: 输入1/0   
1
Exception in thread "main" java.lang.NoClassDefFoundError: com/vip/vcp/ryan/zhaunzheng/map/PHashMap426/PLinkedHashMap
    at com.vip.vcp.ryan.zhaunzheng.ToLeExcep.ClassNotFoundAndNoClassDef.TestClassAboutException.toShowNoClassDefErr(TestClassAboutException.java:41)
    at com.vip.vcp.ryan.zhaunzheng.ToLeExcep.ClassNotFoundAndNoClassDef.TestClassAboutException.main(TestClassAboutException.java:16)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: java.lang.ClassNotFoundException: com.vip.vcp.ryan.zhaunzheng.map.PHashMap426.PLinkedHashMap
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    ... 7 more

Process finished with exit code 1

由于静态代码块初始化失败引起的 NoClassDefFoundError

---》》》TestClassAboutException编译已经通过啦!!!
/n是否进入NoClassDefErr复现环节: 输入1/0   
1
B initializing and then Exception occurred
java.lang.ExceptionInInitializerError
    at com.vip.vcp.ryan.zhaunzheng.ToLeExcep.ClassNotFoundAndNoClassDef.TestClassAboutException.toShowNoClassDefErr2(TestClassAboutException.java:63)
    at com.vip.vcp.ryan.zhaunzheng.ToLeExcep.ClassNotFoundAndNoClassDef.TestClassAboutException.main(TestClassAboutException.java:18)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: java.lang.ArithmeticException: / by zero
    at com.vip.vcp.ryan.zhaunzheng.ToLeExcep.ClassNotFoundAndNoClassDef.B.init(B.java:24)
    at com.vip.vcp.ryan.zhaunzheng.ToLeExcep.ClassNotFoundAndNoClassDef.B.<clinit>(B.java:16)
    ... 7 more
Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class com.vip.vcp.ryan.zhaunzheng.ToLeExcep.ClassNotFoundAndNoClassDef.B
    at com.vip.vcp.ryan.zhaunzheng.ToLeExcep.ClassNotFoundAndNoClassDef.TestClassAboutException.toShowNoClassDefErr2(TestClassAboutException.java:67)
    at com.vip.vcp.ryan.zhaunzheng.ToLeExcep.ClassNotFoundAndNoClassDef.TestClassAboutException.main(TestClassAboutException.java:18)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

Process finished with exit code 1

在日常 Java 开发中,我们经常碰到 java.lang.NoClassDefFoundError 这样的错误,需要花费很多时间去找错误的原因,具体是哪个类不见了?类明明还在,为什么找不到?而且我们很容易把 java.lang.NoClassDefFoundError 和 java.lang.ClassNotfoundException 这两个错误搞混,事实上这两个错误是完全不同的。我们往往花费时间去不断尝试一些其他的方法去解决这个问题,而没有真正去理解这个错误的原因。这篇文章就是通过解决 NoClassDefFoundError 错误处理的经验分享来揭开 NoClassDefFoundError 的一些秘密。NoClassDefFoundError 的错误并非不能解决或者说很难解决,只是这种错误的表现形式很容易迷惑其他的 Java 开发者。下面我们来分析下为什么会发生 NoClassDefFoundError 这样的错误,以及怎样去解决这个错误。

NoClassDefFoundError 错误发生的原因

NoClassDefFoundError 错误的发生,是因为 Java 虚拟机在编译时能找到合适的类,而在运行时不能找到合适的类导致的错误。例如在运行时我们想调用某个类的方法或者访问这个类的静态成员的时候,发现这个类不可用,此时 Java 虚拟机就会抛出 NoClassDefFoundError 错误。与 ClassNotFoundException 的不同在于,这个错误发生只在运行时需要加载对应的类不成功,而不是编译时发生。很多 Java 开发者很容易在这里把这两个错误搞混。

简单总结就是,NoClassDefFoundError 发生在编译时对应的类可用,而运行时在 Java 的 classpath 路径中,对应的类不可用导致的错误。发生 NoClassDefFoundError 错误时,你能看到如下的错误日志:

Exception in thread "main" java.lang.NoClassDefFoundError

错误的信息很明显地指明 main 线程无法找到指定的类,而这个 main 线程可能时主线程或者其他子线程。如果是主线程发生错误,程序将崩溃或停止,而如果是子线程,则子线程停止,其他线程继续运行。

NoClassDefFoundError 和 ClassNotFoundException 区别

我们经常被 java.lang.ClassNotFoundException 和 java.lang.NoClassDefFoundError 这两个错误迷惑不清,尽管他们都与 Java classpath 有关,但是他们完全不同。NoClassDefFoundError 发生在 JVM 在动态运行时,根据你提供的类名,在 classpath 中找到对应的类进行加载,但当它找不到这个类时,就发生了 java.lang.NoClassDefFoundError 的错误,而 ClassNotFoundException 是在编译的时候在 classpath 中找不到对应的类而发生的错误。ClassNotFoundException 比 NoClassDefFoundError 容易解决,是因为在编译时我们就知道错误发生,并且完全是由于环境的问题导致。而如果你在 J2EE 的环境下工作,并且得到 NoClassDefFoundError 的异常,而且对应的错误的类是确实存在的,这说明这个类对于类加载器来说,可能是不可见的。

怎么解决 NoClassDefFoundError 错误

根据前文,很明显 NoClassDefFoundError 的错误是因为在运行时类加载器在 classpath 下找不到需要加载的类,所以我们需要把对应的类加载到 classpath 中,或者检查为什么类在 classpath 中是不可用的,这个发生可能的原因如下:

  1. 对应的 Class 在 java 的 classpath 中不可用
  2. 你可能用 jar 命令运行你的程序,但类并没有在 jar 文件的 manifest 文件中的 classpath 属性中定义
  3. 可能程序的启动脚本覆盖了原来的 classpath 环境变量
  4. 因为 NoClassDefFoundError 是 java.lang.LinkageError 的一个子类,所以可能由于程序依赖的原生的类库不可用而导致
  5. 检查日志文件中是否有 java.lang.ExceptionInInitializerError 这样的错误,NoClassDefFoundError 有可能是由于静态初始化失败导致的
  6. 如果你工作在 J2EE 的环境,有多个不同的类加载器,也可能导致 NoClassDefFoundError

下面我们看一些当发生 NoClassDefFoundError 时,我们该如何解决的样例。

NoClassDefFoundError 解决示例

当发生由于缺少 jar 文件,或者 jar 文件没有添加到 classpath,或者 jar 的文件名发生变更会导致 java.lang.NoClassDefFoundError 的错误。当类不在 classpath 中时,这种情况很难确切的知道,但如果在程序中打印出 System.getproperty (“java.classpath”),可以得到程序实际运行的 classpath 运行时明确指定你认为程序能正常运行的 -classpath 参数,如果增加之后程序能正常运行,说明原来程序的 classpath 被其他人覆盖了。
NoClassDefFoundError 也可能由于类的静态初始化模块错误导致,当你的类执行一些静态初始化模块操作,如果初始化模块抛出异常,哪些依赖这个类的其他类会抛出 NoClassDefFoundError 的错误。如果你查看程序日志,会发现一些 java.lang.ExceptionInInitializerError 的错误日志,ExceptionInInitializerError 的错误会导致 java.lang.NoClassDefFoundError: Could not initialize class,如下面的代码示例:

/**
 * Java program to demonstrate how failure of static initialization subsequently cause
 * java.lang.NoClassDefFoundError in Java.
 * @author Javin Paul
 */
public class NoClassDefFoundErrorDueToStaticInitFailure {

    public static void main(String args[]){

        List<User> users = new ArrayList<User>(2);

        for(int i=0; i<2; i++){
            try{
            users.add(new User(String.valueOf(i))); //will throw NoClassDefFoundError
            }catch(Throwable t){
                t.printStackTrace();
            }
        }         
    }
}

class User{
    private static String USER_ID = getUserId();

    public User(String id){
        this.USER_ID = id;
    }
    private static String getUserId() {
        throw new RuntimeException("UserId Not found");
    }     
}

Output
java.lang.ExceptionInInitializerError
    at testing.NoClassDefFoundErrorDueToStaticInitFailure.main(NoClassDefFoundErrorDueToStaticInitFailure.java:23)
Caused by: java.lang.RuntimeException: UserId Not found
    at testing.User.getUserId(NoClassDefFoundErrorDueToStaticInitFailure.java:41)
    at testing.User.<clinit>(NoClassDefFoundErrorDueToStaticInitFailure.java:35)
    ... 1 more
java.lang.NoClassDefFoundError: Could not initialize class testing.User
    at testing.NoClassDefFoundErrorDueToStaticInitFailure.main(NoClassDefFoundErrorDueToStaticInitFailure.java:23)


Read more: http://javarevisited.blogspot.com/2011/06/noclassdeffounderror-exception-in.html#ixzz3dqtbvHDy

由于 NoClassDefFoundError 是 LinkageError 的子类,而 LinkageError 的错误在依赖其他的类时会发生,所以如果你的程序依赖原生的类库和需要的 dll 不存在时,有可能出现 java.lang.NoClassDefFoundError。这种错误也可能抛出 java.lang.UnsatisfiedLinkError: no dll in java.library.path Exception Java 这样的异常。解决的办法是把依赖的类库和 dll 跟你的 jar 包放在一起。
如果你使用 Ant 构建脚本来生成 jar 文件和 manifest 文件,要确保 Ant 脚本获取的是正确的 classpath 值写入到 manifest.mf 文件
Jar 文件的权限问题也可能导致 NoClassDefFoundError,如果你的程序运行在像 linux 这样多用户的操作系统种,你需要把你应用相关的资源文件,如 Jar 文件,类库文件,配置文件的权限单独分配给程序所属用户组,如果你使用了多个用户不同程序共享的 jar 包时,很容易出现权限问题。比如其他用户应用所属权限的 jar 包你的程序没有权限访问,会导致 java.lang.NoClassDefFoundError 的错误。
基于 XML 配置的程序也可能导致 NoClassDefFoundError 的错误。比如大多数 Java 的框架像 Spring,Struts 使用 xml 配置获取对应的 bean 信息,如果你输入了错误的名称,程序可能会加载其他错误的类而导致 NoClassDefFoundError 异常。我们在使用 Spring MVC 框架或者 Apache Struts 框架,在部署 War 文件或者 EAR 文件时就经常会出现 Exception in thread “main” java.lang.NoClassDefFoundError。
在有多个 ClassLoader 的 J2EE 的环境中,很容易出现 NoClassDefFoundError 的错误。由于 J2EE 没有指明标准的类加载器,使用的类加载器依赖与不同的容器像 Tomcat、WebLogic,WebSphere 加载 J2EE 的不同组件如 War 包或者 EJB-JAR 包。关于类加载器的相关知识可以参考这篇文章类加载器的工作原理。

总结来说,类加载器基于三个机制:委托、可见性和单一性,委托机制是指将加载一个类的请求交给父类加载器,如果这个父类加载器不能够找到或者加载这个类,那么再加载它。可见性的原理是子类的加载器可以看见所有的父类加载器加载的类,而父类加载器看不到子类加载器加载的类。单一性原理是指仅加载一个类一次,这是由委托机制确保子类加载器不会再次加载父类加载器加载过的类。现在假设一个 User 类在 WAR 文件和 EJB-JAR 文件都存在,并且被 WAR ClassLoader 加载,而 WAR ClassLoader 是加载 EJB-JAR ClassLoader 的子 ClassLoader。当 EJB-JAR 中代码引用这个 User 类时,加载 EJB-JAR 所有 class 的 Classloader 找不到这个类,因为这个类已经被 EJB-JAR classloader 的子加载器 WAR classloader 加载。

这会导致的结果就是对 User 类出现 NoClassDefFoundError 异常,而如果在两个 JAR 包中这个 User 类都存在,如果你使用 equals 方法比较两个类的对象时,会出现 ClassCastException 的异常,因为两个不同类加载器加载的类无法进行比较。
有时候会出现 Exception in thread “main” java.lang.NoClassDefFoundError: com/sun/tools/javac/Main 这样的错误,这个错误说明你的 Classpath, PATH 或者 JAVA_HOME 没有安装配置正确或者 JDK 的安装不正确。这个问题的解决办法时重新安装你的 JDK。
Java 在执行 linking 操作的时候,也可能导致 NoClassDefFoundError。例如在前面的脚本中,如果在编译完成之后,我们删除 User 的编译文件,再运行程序,这个时候你就会直接得到 NoClassDefFoundError,而错误的消息只打印出 User 类的名称。

java.lang.NoClassDefFoundError: testing/User
    at testing.NoClassDefFoundErrorDueToStaticInitFailure.main(NoClassDefFoundErrorDueToStaticInitFailure.java:23

 

 

ClassNotFoundException 和 NoClassDefFoundError 区别

ClassNotFoundException 和 NoClassDefFoundError 区别

要区分这两个异常,先要了解类装载的显式和隐式两种方式

类装入的方式有两种 —— 显式 或 隐式,两者之间有些细微差异。

显式 类装入发生在使用以下方法调用装入的类的时候:
•cl.loadClass()(cl 是 java.lang.ClassLoader 的实例)
•Class.forName()(启动的类装入器是当前类定义的类装入器)

当调用其中一个方法的时候,指定的类(以类名为参数)由类装入器装入。如果类已经装入,那么只是返回一个引用;否则,装入器会通过委托模型装入类。

 

隐式 类装入发生在由于引用、实例化或继承导致装入类的时候(不是通过显式方法调用)。在每种情况下,装入都是在幕后启动的,JVM 会解析必要的引用并装入类。与显式类装入一样,如果类已经装入了,那么只是返回一个引用;否则,装入器会通过委托模型装入类。

类的装入通常组合了显式和隐式类装入。例如,类装入器可能先显式地装入一个类,然后再隐式地装入它引用的所有类。

 

ClassNotFoundException;

当应用程序试图通过类的字符串名称,使用以下三种方法装入类,但却找不到指定名称的类定义时抛出该异常,是显式类装载的抛出的异常。
1.类 Class 中的 forName() 方法。
2.类 ClassLoader 中的 findSystemClass() 方法。
3.类 ClassLoader 中的 loadClass() 方法。

 

NoClassDefFoundError:

如果 Java 虚拟机或 ClassLoader 实例试图装入类定义(作为正常的方法调用的一部分,或者作为使用 new 表达式创建新实例的一部分),但却没有找到类定义时抛出该异常。
    当目前执行的类已经编译,但是找不到它的定义时,会存在 searched-for 类定义。
    实际上,这意味着 NoClassDefFoundError 的抛出,是不成功的隐式类装入的结果。
    简单说来,就是引用的类在类路径中没有找到。

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

关于Groovy 2.5.0给出了noclassdeffounderror用于方法调用转换groovy调用java类方法的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于CacheProvider的异常NoClassDefFoundError、ClassNotFoundException 和 NoClassDefFoundError、ClassNotFoundException 和 NoClassDefFoundError 区别、ClassNotFoundException 和 NoClassDefFoundError 有什么区别?等相关内容,可以在本站寻找。

本文标签: