【问题标题】:Gradle NoClassDefFoundError when running jar运行jar时的Gradle NoClassDefFoundError
【发布时间】:2017-06-01 10:54:50
【问题描述】:


我正在尝试建立一个 Gradle 项目,其中包含一些 Velocity 函数。

到目前为止,我有以下文件:

src/main/java/com/veltes/velotest.java:

package com.veltes;

import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.exception.MethodInvocationException;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.runtime.RuntimeConstants;
import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;

import java.io.*;

public class velotest {
    public static void main(String[] args) {

        try {
            VelocityEngine ve = new VelocityEngine();
            ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
            ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
            ve.init();
            VelocityContext context = new VelocityContext();
            context.put("name", "World");
            Template t = ve.getTemplate("com/veltes/velotest.vm");
            StringWriter writer = new StringWriter();
            t.merge(context, writer);
            System.out.println(writer.toString());

            File logFile = new File("C:/users/xxxx/Desktop/velotest.html");

            try {
                writeFile(logFile, t, context);
            }
            catch (IOException io) {
            }
        } catch (Exception e) {
        }

    }

    private static void writeFile(File logFile, Template t, VelocityContext context) throws IOException {
        Writer logWriter;

        logWriter = new BufferedWriter(new FileWriter(logFile));
        try {
            t.merge(context, logWriter);
        }
        catch (ResourceNotFoundException rnfe) {
        }
        catch (ParseErrorException pee) {
        }
        catch (MethodInvocationException mie) {
        }
        catch (Exception e) {
        }
        logWriter.flush();
        logWriter.close();
    }

}

build.gradle:

group 'velocitytest'
version '1.0-SNAPSHOT'

apply plugin: 'groovy'
apply plugin: 'java'

sourceCompatibility = 1.5

repositories {
    mavenCentral()
    mavenLocal()
}

dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.3.11'
    testCompile group: 'junit', name: 'junit', version: '4.11'

    compile 'velocity:velocity:1.4'
}


现在,当我运行 gradle assemblegradle build 时,一切都很好,但是当我尝试运行项目时(对于在 build/libs/ 中运行构建的 jar 和在 IntelliJ 中运行 velotest 类也是如此),我得到以下信息错误:

线程“主”java.lang.NoClassDefFoundError 中的异常:org/apache/commons/collections/ExtendedProperties
在 org.apache.velocity.runtime.RuntimeInstance.(RuntimeInstance.java:183)
在 org.apache.velocity.app.VelocityEngine.(VelocityEngine.java:60) 在 com.veltes.velotest.main(velotest.java:23)
在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
在 java.lang.reflect.Method.invoke(Method.java:497)
在 com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
引起:java.lang.ClassNotFoundException:org.apache.commons.collections.ExtendedProperties
在 java.net.URLClassLoader.findClass(URLClassLoader.java:381)
在 java.lang.ClassLoader.loadClass(ClassLoader.java:424)
在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
在 java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 8 更多

build/tmp/里面没有jar有点奇怪

有谁知道解决办法吗?

【问题讨论】:

    标签: java intellij-idea gradle velocity noclassdeffounderror


    【解决方案1】:

    如果你想运行它,你需要创建一个可运行的 jar。

    您可以使用 shadojar 插件或扩展 jar 任务将运行时 deps 打包到工件中。

    jar {
        archiveName = 'Name.jar'
    
        manifest {
            attributes 'Main-Class': 'your.main.class',
                    'Class-Path': configurations.runtime.files.collect { "lib/$it.name" }.join(' '),
                    'Implementation-Version': project.version
        }
    
        from(configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }) {}
    }
    

    对于智能问题:

    apply plugin: 'idea'
    

    然后运行gradle idea 任务,这将刷新您项目中的 .iws .ipr .iml 文件并同步类路径。或者,如果您使用 IntelliJ 支持(这还不理想),请尝试在那里刷新它。我认为在 2017.1.3 版本中,gradle 集成要好一些。

    【讨论】:

    • 谢谢。这适用于罐子。您是否还有在 IntelliJ 中运行课程的解决方案?那里我仍然得到同样的错误。
    • 可能不同步,尝试应用 plugin: 'idea' 然后运行 ​​gradle idea,这将刷新 .ipr .iws。 .iml 文件和类路径。
    • 更新到 IntelliJ 2017.1.3。现在它起作用了。谢谢你。 :)
    【解决方案2】:

    添加 from(configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }) {}build.gradle 文件为我修复了它,如下所示:

    jar {
        manifest {
            attributes(
                'Main-Class': 'gradle22.Library'
            )
        }
        from {
            configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-06
      • 2010-11-28
      • 1970-01-01
      • 2015-04-01
      • 2015-11-29
      • 2013-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多