2017-06-01 19 views
0


いくつかのVelocity関数を含むGradleプロジェクトを設定しようとしています。

のsrc /メイン/ javaの/ COM/veltes/velotest.java:
jradを実行しているときにGradle NoClassDefFoundError

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 assembleとを実行するとすべてが正常であるが、私は(ビルド/ libsの中で構築されたjarファイルを実行するための/とのIntelliJでvelotestクラスを実行するために同じ)プロジェクトを実行しようとすると、私は次のエラーを取得する:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/collections/ExtendedProperties
at org.apache.velocity.runtime.RuntimeInstance.< init >(RuntimeInstance.java:183)
at org.apache.velocity.app.VelocityEngine.(VelocityEngine.java:60) at com.veltes.velotest.main(velotest.java:23)
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:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.ExtendedProperties
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)
... 8 more

ビルド/ tmp/jmpに瓶がないのはちょっと奇妙です

ソリューションを知っている人はいますか?

答えて

1

実行可能にするには、実行可能なjarを作成する必要があります。

shadojarプラグインを使用するか、jarタスクを拡張してランタイムdepsをアーティファクトにパックすることができます。 IntelliJの問題については

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タスクを実行し、これはあなたのプロジェクトに.IMLファイル.ipr .iwsを更新し、クラスパスを同期します。または、intelliJサポートを使用している場合(これはまだ理想的ではありません)、そこでリフレッシュしてください。私は、バージョン2017.1.3では、gradleの統合が少し良いと思います。

+0

ありがとうございます。これは瓶のために働く。 IntelliJでクラスを実行するためのソリューションもありますか?私はまだ同じエラーが発生します。 –

+1

はおそらく同期していません。プラグインを適用しようとします。「アイデア」を実行してからgradle ideaを実行すると、.ipr .iwsが更新されます。 .imlファイルとクラスパス。 – LazerBanana

+1

IntelliJ 2017.1.3に更新されました。今それは動作します。ありがとうございました。 :) –

関連する問題