1

Google Closure は、IKVM を使用することで、Java ランタイム環境なしで素晴らしい動作をします

それがなくなった場合に備えて、それをexeに変換する簡単な手順は次のとおりです。

  1. Closure CompilerIKVMをダウンロードして抽出します (ただし、インストールするものはありません) 。
  2. compiler.jar を IKVM bin フォルダーに移動します。
  3. ikvmc -target:exe -fileversion:2012.09.17 .\compiler.jar(jarのリリース日とともに)。注: ANT ライブラリに関するいくつかの警告が表示されます。
  4. これらの依存関係を ikvm bin ディレクトリからクロージャー ディレクトリにコピーします。
    • IKVM.OpenJDK.Core.dll
    • IKVM.OpenJDK.Jdbc.dll
    • IKVM.OpenJDK.Misc.dll
    • IKVM.OpenJDK.SwingAWT.dll
    • IKVM.OpenJDK.Text.dll
    • IKVM.OpenJDK.Util.dll
    • XML.API.dll
    • IKVM.Runtime.dll

次に、compiler.jar と新しい compiler.exe をクロージャー ディレクトリに戻すことができます。Fredrikは、Unicode をオーバーライドする ascii エンコーディングを指定できるため (半分のバイト)、このPowerShellバージョンの実行を推奨しています。

.\compiler.exe --js .\jquery-1.4.2.js --warning_level QUIET | out-file -encoding ascii .\jquery.min.js

==============================

ただし、Closure Templates のSoyToJsSrcCompiler.jar. ikvmc -target:exe -fileversion:2011.12.22 .\SoyToJsSrcCompiler.jarと同様にから警告が表示されcompiler.jarます。

warning IKVMC0105: Unable to compile class "com.google.template.soy.jssrc.internal.GenerateSoyUtilsEscapingDirectiveCode"
    (missing class "org.apache.tools.ant.Task")
warning IKVMC0100: Class "com.google.inject.internal.asm.util.$TraceClassVisitor" not found
warning IKVMC0111: Emitted java.lang.NoClassDefFoundError in "com.google.inject.internal.cglib.core.$DebuggingClassWriter$1.run()Ljava.lang.Object;"
    ("com.google.inject.internal.asm.util.$TraceClassVisitor")
warning IKVMC0100: Class "com.google.template.soy.jssrc.internal.GenerateSoyUtilsEscapingDirectiveCode" not found

コマンドライン引数なしの結果SoyToJsSrcCompiler.exeはヘルプページを表示するように機能しますが、.soy ファイルを指定すると次のようになります。

Exception in thread "main" cli.System.MethodAccessException: 
com.google.inject.assistedinject.FactoryProvider2.getBindingFromNewInjector(java.lang.reflect.Method, System.Object[], AssistData) at 
com.google.inject.assistedinject.FactoryProvider2$$FastClassByGuice$$9dcdf6d7.invoke() at 
com.google.inject.internal.cglib.reflect.$FastMethod.invoke(FastMethod.java:53) at 
com.google.inject.internal.SingleMethodInjector$1.invoke(SingleMethodInjector.java:56) at 
com.google.inject.internal.SingleMethodInjector.inject(SingleMethodInjector.java:90) at 
com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:107) at 
com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:76) at 
com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:73) at 
com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1031) at 
com.google.inject.internal.MembersInjectorImpl.injectAndNotify(MembersInjectorImpl.java:88) at
com.google.inject.internal.Initializer$InjectableReference.get(Initializer.java:150) at 
com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40) at 
com.google.inject.internal.SingleFieldInjector.inject(SingleFieldInjector.java:53) at 
com.google.inject.internal.InjectionRequestProcessor$StaticInjection$1.call(InjectionRequestProcessor.java:11 6) at 
com.google.inject.internal.InjectionRequestProcessor$StaticInjection$1.call(InjectionRequestProcessor.java:11 0) at 
com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1024) at 
com.google.inject.internal.InjectionRequestProcessor$StaticInjection.injectMembers(InjectionRequestProcessor. java:110) at 
com.google.inject.internal.InjectionRequestProcessor.injectMembers(InjectionRequestProcessor.java:78) at 
com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:171) at 
com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:111) at 
com.google.inject.Guice.createInjector(Guice.java:95) at 
com.google.inject.Guice.createInjector(Guice.java:72) at 
com.google.template.soy.MainClassUtils.createInjector(MainClassUtils.java:212) at 
com.google.template.soy.SoyToJsSrcCompiler.execMain(SoyToJsSrcCompiler.java:223) at 
com.google.template.soy.SoyToJsSrcCompiler.main(SoyToJsSrcCompiler.java:205)

これを機能させる方法を知っている人はいますか?

4

1 に答える 1

1

例外は、IKVM のバグである可能性があります。どのバージョンを使用していますか? 最新バージョンをテストします。

警告 IKVMC0100: クラス "com.google.template.soy.jssrc.internal.GenerateSoyUtilsEscapingDirectiveCode" が見つかりません

もう 1 つの問題は、SoyToJsSrcCompiler.jar に必要なすべての jar ファイルをコンパイルしていないことです。この不足しているクラス ファイルはどの jar ファイルにありますか? wikiを見て、複数の jar ファイルをコンパイルする方法を確認してください。

次の問題は、異なる jar ファイルに同じパッケージが存在することです。一部の方法でパッケージのみが表示される場合、これは .NET では機能しません。共有クラスローダーをテストできます。詳細についてはウィキを参照してください。

于 2012-10-11T17:19:57.887 に答える