Maven構造に基づくシンプルなVelocityスタンドアロンアプリです。 Scalaでテンプレートをレンダリングするためのhelloworld.vm
in ${basedir}/src/main/resources
フォルダー:
com.ggd543.velocitydemo
import org.Apache.velocity.app.VelocityEngine
import org.Apache.velocity.VelocityContext
import Java.io.StringWriter
/**
* @author ${user.name}
*/
object App {
def main(args: Array[String]) {
//First , get and initialize an engine
val ve = new VelocityEngine();
ve.init();
//Second, get the template
val resUrl = getClass.getResource("/helloworld.vm")
val t = ve.getTemplate("helloworld.vm"); // not work
// val t = ve.getTemplate("/helloworld.vm"); // not work
// val t = ve.getTemplate(resUrl.toString); // not work yet
//Third, create a context and add data
val context = new VelocityContext();
context.put("name", "Archer")
context.put("site", "http://www.baidu.com")
//Finally , render the template into a StringWriter
val sw = new StringWriter
t.merge(context, sw)
println(sw.toString);
}
}
プログラムをコンパイルして実行するときに、次のエラーが発生しました。
2012-1-29 14:03:59 org.Apache.velocity.runtime.log.JdkLogChute log
严重: ResourceManager : unable to find resource '/helloworld.vm' in any resource loader.
Exception in thread "main" org.Apache.velocity.exception.ResourceNotFoundException: Unable to find resource '/helloworld.vm'
at org.Apache.velocity.runtime.resource.ResourceManagerImpl.loadResource(ResourceManagerImpl.Java:474)
at org.Apache.velocity.runtime.resource.ResourceManagerImpl.getResource(ResourceManagerImpl.Java:352)
at org.Apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.Java:1533)
at org.Apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.Java:1514)
at org.Apache.velocity.app.VelocityEngine.getTemplate(VelocityEngine.Java:373)
at com.ggd543.velocitydemo.App$.main(App.scala:20)
at com.ggd543.velocitydemo.App.main(App.scala)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:39)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
at Java.lang.reflect.Method.invoke(Method.Java:597)
at com.intellij.rt.execution.application.AppMain.main(AppMain.Java:120)
Process finished with exit code 1
すばらしい質問-今日、Ecilpseを使用して次のように問題を解決しました。
次のように、テンプレートをソースコードと同じフォルダー階層に配置します(ビルドパスに含めても、別のフォルダー階層には配置しません)。
コードでは、次のコード行を使用するだけです(日付をデータとして渡すだけの場合)。
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("date", getMyTimestampFunction());
Template t = ve.getTemplate( "templates/email_html_new.vm" );
StringWriter writer = new StringWriter();
t.merge( context, writer );
最初にVelocityEngineにクラスパスを調べるよう指示する方法をご覧ください。これがなければ、どこを見ればいいのかわかりません。
.vmをsrc/main/resources/templates
の下に配置すると、コードは次のようになります。
Properties p = new Properties();
p.setProperty("resource.loader", "class");
p.setProperty("class.resource.loader.class", "org.Apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
Velocity.init( p );
VelocityContext context = new VelocityContext();
Template template = Velocity.getTemplate("templates/my.vm");
これはWebプロジェクトで機能します。
EclipseではVelocity.getTemplate( "my.vm")が機能します。これは、velocityがsrc/main/resources /またはsrc/main/resources/templatesで.vmファイルを検索するためですが、WebプロジェクトではVelocity.getTemplateを使用する必要があります( "templates/my.vm");
次のように使用できます。
Template t = ve.getTemplate("./src/main/resources/templates/email_html_new.vm");
できます。
Intellij IDEAでも同様の問題に直面しました。これを使用できます
VelocityEngine ve = new VelocityEngine();
Properties props = new Properties();
props.put("file.resource.loader.path", "/Users/Projects/Comparator/src/main/resources/");
ve.init(props);
Template t = ve.getTemplate("helloworld.vm");
VelocityContext context = new VelocityContext();
リソースローダーが適切に構成されていることを確認してください。リソースローダーの選択と構成のヘルプについては、Velocityのドキュメントを参照してください。 http://velocity.Apache.org/engine/releases/velocity-1.7/developer-guide.html#resourceloaders
これらのコードを追加しようとすることができます:
VelocityEngine ve = new VelocityEngine();
String vmPath = request.getSession().getServletContext().getRealPath("${your dir}");
Properties p = new Properties();
p.setProperty("file.resource.loader.path", vmPath+"//");
ve.init(p);
これをして合格!
VelocityEngine velocityEngin = new VelocityEngine();
velocityEngin.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
velocityEngin.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
velocityEngin.init();
Template template = velocityEngin.getTemplate("nameOfTheTemplateFile.vtl");
上記のコードを使用して、速度テンプレートのプロパティを設定できます。テンプレートを初期化するときにテンプレートの名前を指定すると、テンプレートがクラスパスに存在するかどうかがわかります。
上記のクラスはすべてパッケージorg.Apache.velocity *からのものです
将来の参考のために、この作業コードスニペットを配置しました。コードサンプルは、Apache Velocityバージョン1.7とJettyを組み込んで作成されました。
Velocityテンプレートのパスは、リソースフォルダーemail_templatesサブフォルダーにあります。
Javaのコードスニペット(スニペットは、EclipseとJarの両方で実行されます)
...
templateName = "/email_templates/byoa.tpl.vm"
VelocityEngine ve = new VelocityEngine();
ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
ve.init();
Template t = ve.getTemplate(this.templateName);
VelocityContext velocityContext = new VelocityContext();
velocityContext.put("","") // put your template values here
StringWriter writer = new StringWriter();
t.merge(this.velocityContext, writer);
System.out.println(writer.toString()); // print the updated template as string
OSGIプラグコードスニペットの場合。
final String TEMPLATE = "resources/template.vm // located in the resource folder
Thread current = Thread.currentThread();
ClassLoader oldLoader = current.getContextClassLoader();
try {
current.setContextClassLoader(TemplateHelper.class.getClassLoader()); // TemplateHelper is a class inside your jar file
Properties p = new Properties();
p.setProperty("resource.loader", "class");
p.setProperty("class.resource.loader.class", "org.Apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
Velocity.init( p );
VelocityEngine ve = new VelocityEngine();
Template template = Velocity.getTemplate( TEMPLATE );
VelocityContext context = new VelocityContext();
context.put("tc", obj);
StringWriter writer = new StringWriter();
template.merge( context, writer );
return writer.toString() ;
} catch(Exception e){
e.printStackTrace();
} finally {
current.setContextClassLoader(oldLoader);
}
Src/main/Javaの代わりにsrc/main/resourcesの下にテンプレートフォルダを置くこともできます。私にとってはうまくいきます。テンプレートはJavaソースではありません。
同様の問題に直面しました。速度エンジンメールテンプレートを間違ったフォルダーにコピーしていました。 JavaMailSenderおよびVelocityEngineはMailServiceでリソースとして宣言されているため、プロジェクト用に宣言されたリソースフォルダーにテンプレートを追加する必要があります。
変更を加えたところ、うまくいきました。テンプレートを次のように配置します
src/main/resources/templates/<package>/sampleMail.vm
埋め込みJettyを使用している間、プロパティwebapp.resource.loader.pathはスラッシュで始まる必要があります。
webapp.resource.loader.path=/templates
そうでない場合、テンプレートは../webapp/templatesに見つかりません。