[英]Gradle NoClassDefFoundError when running jar
我正在嘗試建立一個 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();
}
}
構建.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 assemble
和gradle 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(Native Method)
在 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有點奇怪
你們中有人知道解決方案嗎?
如果您希望能夠運行它,則需要創建一個可運行的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文件並同步類路徑。 或者,如果您使用智能支持(尚不理想),請嘗試在那里進行刷新。 我認為在2017.1.3版中,gradle集成要好一些。
將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) }
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.