2010-01-06 2 views
5

Ich versuche Velocity-Framework auf Google App-Engine zu verwenden. Ich habe ein kleines Programm mit einer Hauptmethode geschrieben und versucht, es lokal auszuführen. Ich erhalte die folgende Ausnahme:Velocity-Framework auf Google App-Engine

 
Exception in thread "main" org.apache.velocity.exception.VelocityException: Failed to initialize an instance of org.apache.velocity.runtime.log.ServletLogChute with the current runtime configuration. 
    at org.apache.velocity.runtime.log.LogManager.createLogChute(LogManager.java:206) 
    at org.apache.velocity.runtime.log.LogManager.updateLog(LogManager.java:255) 
    at org.apache.velocity.runtime.RuntimeInstance.initializeLog(RuntimeInstance.java:795) 
    at org.apache.velocity.runtime.RuntimeInstance.init(RuntimeInstance.java:250) 
    at org.apache.velocity.app.VelocityEngine.init(VelocityEngine.java:107) 
    at Main.main(Main.java:10) 
Caused by: java.lang.UnsupportedOperationException: Could not retrieve ServletContext from application attributes 
    at org.apache.velocity.runtime.log.ServletLogChute.init(ServletLogChute.java:73) 
    at org.apache.velocity.runtime.log.LogManager.createLogChute(LogManager.java:157) 
    ... 5 more 

Hier ist mein Programm:

import java.io.StringWriter; 
import org.apache.velocity.app.VelocityEngine; 
import org.apache.velocity.Template; 
import org.apache.velocity.VelocityContext; 

public class Main { 
public static void main(String[] args) throws Exception{ 
     /* first, get and initialize an engine */ 
     VelocityEngine ve = new VelocityEngine(); 
     ve.init(); 
     /* next, get the Template */ 
     Template t = ve.getTemplate("helloworld.vm"); 
     /* create a context and add data */ 
     VelocityContext context = new VelocityContext(); 
     context.put("name", "World"); 
     /* now render the template into a StringWriter */ 
     StringWriter writer = new StringWriter(); 
     t.merge(context, writer); 
     /* show the World */ 
     System.out.println(writer.toString());  
} 
} 

das gleiche Programm läuft auf einem normalen Eclipse-Projekt völlig in Ordnung. Was könnte das Problem sein?

Antwort

9

Scheint nur die ServletLogChute Klasse zu sein, die die ServletContext erfordert, Velocity selbst kann völlig eigenständig von einer Servlet-Umgebung arbeiten.

Da Sie offensichtlich keine servelt Protokoll haben, versuchen Sie die folgende Zugabe, bevor Sie ve.init() nennen:

ve.setProperty("runtime.log.logsystem.class", "org.apache.velocity.runtime.log.NullLogChute"); 

... oder check here if you have specific logging requirements.

2

Dies kann nicht das Ende der Welt und Geschichte, aber es ist eine Liste von GAE kompatible Software:

http://groups.google.com/group/google-appengine-java/web/will-it-play-in-app-engine

und ich habe nicht Geschwindigkeit darin finden. Es ist möglich, dass die Leute einfach vergessen haben, es zu testen und in die Liste aufzunehmen, aber es ist auch möglich, dass Velocity einige APIs mitbringt, die nicht gut mit GAE funktionieren.

+2

danke carl..they hatte es gerade verpasst ... es funktioniert perfekt gut auf App-Engine – Aadith

+0

Gut. Musstest du das Protokollierungsproblem lösen, über das ich gelesen habe, oder hast du es gerade geschafft, es so zu machen, wie es war? –

+0

In der Tat würde mich interessieren, was die Lösung als Referenz war. –

2

Die Geschwindigkeit kann definitiv auf GAE/J laufen.

Framework, das Velocity als Template-Engine verwendet, funktioniert problemlos auf GAE/J.

Es braucht natürlich eine different configuration als üblich, da GAE/J ist eine Constraint-Umgebung, aber dennoch funktioniert es.