【问题标题】:How to solve NoClassDefFoundError in Grails Compile?如何解决 Grails 编译中的 NoClassDefFoundError?
【发布时间】:2017-05-31 12:39:06
【问题描述】:

我正在将一个项目从 Grails 1.3.7 升级到 3.2.6。我有导入 IMAPFolder 和 IMAPProtocol 之类的类。我相信这需要我将 com.sun.mail:imap 作为编译时依赖项包含在内。我的 build.gradle 中有这个:

compile group: 'com.sun.mail', name: 'imap', version: '1.5.6'

但是,当我添加它并尝试编译时,我收到了 Java 编译错误。

General error during conversion: java.lang.NoClassDefFoundError: com/sun/mail/util/ReadableMime

java.lang.RuntimeException: java.lang.NoClassDefFoundError: com/sun/mail/util/ReadableMime
        at org.codehaus.groovy.control.CompilationUnit.convertUncaughtExceptionToCompilationError(CompilationUnit.java:1089)
        at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1067)
        at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:591)
        at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:569)
        at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:546)
        at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:525)
        at org.gradle.api.internal.tasks.compile.ApiGroovyCompiler.execute(ApiGroovyCompiler.java:173)
        at org.gradle.api.internal.tasks.compile.ApiGroovyCompiler.execute(ApiGroovyCompiler.java:59)
        at org.gradle.api.internal.tasks.compile.daemon.CompilerDaemonServer.execute(CompilerDaemonServer.java:31)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.gradle.process.internal.worker.request.WorkerAction.run(WorkerAction.java:87)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        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.MessageHub$Handler.run(MessageHub.java:377)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
        at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.NoClassDefFoundError: com/sun/mail/util/ReadableMime
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:411)
        at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:677)
        at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:545)
        at org.codehaus.groovy.control.ClassNodeResolver.tryAsLoaderClassOrScript(ClassNodeResolver.java:185)
        at org.codehaus.groovy.control.ClassNodeResolver.findClassNode(ClassNodeResolver.java:170)
        at org.codehaus.groovy.control.ClassNodeResolver.resolveName(ClassNodeResolver.java:126)
        at org.codehaus.groovy.control.ResolveVisitor.resolveToOuter(ResolveVisitor.java:676)
        at org.codehaus.groovy.control.ResolveVisitor.resolve(ResolveVisitor.java:308)
        at org.codehaus.groovy.control.ResolveVisitor.visitClass(ResolveVisitor.java:1218)
        at org.codehaus.groovy.control.ResolveVisitor.startResolving(ResolveVisitor.java:176)
        at org.codehaus.groovy.tools.javac.JavaAwareCompilationUnit$1.call(JavaAwareCompilationUnit.java:71)
        at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1053)
    ... 24 more Caused by: java.lang.ClassNotFoundException: com.sun.mail.util.ReadableMime
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 46 more

我该如何克服这个问题? imap 库没有显示任何其他编译依赖项,所以我不确定该怎么做。

【问题讨论】:

    标签: java grails gradle imap


    【解决方案1】:

    IMAPFolderIMAPProtocol 是 JavaMail API 的一部分。

    你应该添加

    compile group: 'javax.mail', name: 'mail', version: '1.4.7'
    

    而不是

    compile group: 'com.sun.mail', name: 'imap', version: '1.5.6'
    

    可能你需要另一个版本see here

    【讨论】:

      【解决方案2】:

      感谢您的建议。我在那里有 javax.mail 的依赖项,但版本更高。

      实际上,我今天早上早些时候刚刚解决了这个问题。事实证明,我需要 javax.mail 版本 1.4.3(或差不多,但至少 1.4.3 有效)和 Sun imap 1.4.3 jar。 Gradle一直无法从任何地方拉取imap-1.4.3.jar,所以我在本地下载了它,终于满意了。

      因此,使用 javax.mail 的建议和不同版本的建议都是正确的。

      compile files('lib/imap-1.4.3.jar')
      compile group: 'javax.mail', name: 'mail', version: '1.4.3'
      

      【讨论】:

        猜你喜欢
        • 2021-11-06
        • 2018-07-09
        • 1970-01-01
        • 2019-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-21
        相关资源
        最近更新 更多