2016-07-21 3 views
2

は、SSPテンプレートですが、私は次の例外を持っている:スケーラテンプレートサイズは64kに制限されていますか? HTMLの束を含めるようにしようと

Caused by: java.lang.IllegalArgumentException: null 
at scala.tools.asm.ByteVector.putUTF8(ByteVector.java:213) 
at scala.tools.asm.ClassWriter.newUTF8(ClassWriter.java:1092) 
at scala.tools.asm.ClassWriter.newString(ClassWriter.java:1525) 
at scala.tools.asm.ClassWriter.newConstItem(ClassWriter.java:1042) 
at scala.tools.asm.MethodWriter.visitLdcInsn(MethodWriter.java:1134) 
at scala.tools.nsc.backend.jvm.GenASM$JPlainBuilder.genConstant(GenASM.scala:1582) 
at scala.tools.nsc.backend.jvm.GenASM$JPlainBuilder.scala$tools$nsc$backend$jvm$GenASM$JPlainBuilder$$genInstr$1(GenASM.scala:2296) 
at scala.tools.nsc.backend.jvm.GenASM$JPlainBuilder$$anonfun$genBlock$1$2.apply(GenASM.scala:2227) 
at scala.tools.nsc.backend.jvm.GenASM$JPlainBuilder$$anonfun$genBlock$1$2.apply(GenASM.scala:2213) 
at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33) 
at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:186) 
at scala.tools.nsc.backend.icode.BasicBlocks$BasicBlock.foreach(BasicBlocks.scala:195) 
at scala.tools.nsc.backend.jvm.GenASM$JPlainBuilder.genBlock$1(GenASM.scala:2213) 
at scala.tools.nsc.backend.jvm.GenASM$JPlainBuilder.genBlocks$1(GenASM.scala:2151) 
at scala.tools.nsc.backend.jvm.GenASM$JPlainBuilder.genCode(GenASM.scala:2746) 
at scala.tools.nsc.backend.jvm.GenASM$JPlainBuilder.genMethod(GenASM.scala:1471) 
at scala.tools.nsc.backend.jvm.GenASM$JPlainBuilder.genClass(GenASM.scala:1341) 
at scala.tools.nsc.backend.jvm.GenASM$AsmPhase.emitFor$1(GenASM.scala:198) 
at scala.tools.nsc.backend.jvm.GenASM$AsmPhase.run(GenASM.scala:204) 
at scala.tools.nsc.Global$Run.compileUnitsInternal(Global.scala:1501) 
at scala.tools.nsc.Global$Run.compileUnits(Global.scala:1486) 
at scala.tools.nsc.Global$Run.compileSources(Global.scala:1481) 
at scala.tools.nsc.Global$Run.compile(Global.scala:1582) 
at org.fusesource.scalate.support.ScalaCompiler.compile(ScalaCompiler.scala:100) 
at org.fusesource.scalate.TemplateEngine.compileAndLoad(TemplateEngine.scala:757) 

私は次のことを見つけたscala.tools.asm.ByteVectorを見る:

public ByteVector putUTF8(String s) { 
    int charLength = s.length(); 
    if(charLength > '\uffff') { 
     throw new IllegalArgumentException(); 
    } else { .... 

テンプレートサイズがもっとあれば65536バイトより大きい場合、このテンプレートをコンパイルできません。 大きなのプレーンHTMLをSSPテンプレートに含めるにはどうすればよいですか? Includeはテンプレートファイルでのみ動作するようです。手動でテンプレートにhtmlファイルをロードして出力する必要がありますか?より良い方法はありますか?

+0

:手動でテンプレート (はい、それは醜いですが、動作します)にファイルと出力にそれを読みますか? –

+0

@FatihDonmez下記の私の答えを参照してください –

答えて

1

本来の制限であるようです。

回避策:あなたは解決策を見つけた

<% include("header.ssp") %> 

<%@ val book:Integer %> 

<% val bookHtml = "./public/books/" + "book_" + book + ".html"%> 
<% val source = scala.io.Source.fromFile(bookHtml) 
val lines = try source.mkString finally source.close() 
%> 

${unescape(lines)} 

<% include("footer.ssp") %> 
+0

イェップ、いくつかのデバッグと私はそれがjvmの制限です。 Scalateテンプレートは、生成されたクラスのほとんどが文字列リテラルです。制限は、 CONSTANT_Utf8_info { u1タグ;u2の長さ。 u1バイト[長さ]; }。結果として、私たちはそれをScalateではなくFreemarkerに変更しました:) –

関連する問題