Java Web Start 版の Groovy アプリはコード署名が必須らしい
暫く中断していた Wake on LAN を JavaFX 1.3 + Groovy 1.7.5 で作成し始めたのだが、いきなり壁にブチあたって泣きそうになった...
なんと!!
Groovy はサンドボックスの制限とは関係なく コード署名がないと Java Web Start で実行できないらしい...
通常 Java Web Start で実行する場合、ローカルファイルやネットワーク等へのアクセスが制限されるサンドボックスという環境でアプリケーションが動く。
この制限から逃れる場合には コード署名が必要になる。
前々回 作成した Java Web Start 版 Groovy Console も ローカルファイルにアクセスするため オレオレ証明書でコード署名した。
ところが『ローカルファイルにアクセスするため』 と言うのは 私自身の勝手な思い込みで実はそうではなかった。
Groovy は ローカルファイルにアクセスするかどうかに関係なく 下記のセキュリティのエラーで サンドボックスではインスタンスすら生成できない...
試していないが もしかしたら Scala でも同様かもしれない。
JavaFX 2.0 からは これらの言語がベースとなるのだが、Java Web Start で (もちろん Appletでも) アプリケーションを配布する場合、Java + JavaFX 2.0 (もしくは Visage + JavaFX 2.0) という選択肢しかないのかもしれない。
う〜ん、なんだかなぁ...
Caused by: groovy.lang.GroovyRuntimeException: Failed to register the DGM methods : java.security.AccessControlException: access denied (java.lang.RuntimePermission accessDeclaredMembers) at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.registerMethods(MetaClassRegistryImpl.java:163) at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.<init>(MetaClassRegistryImpl.java:81) at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.<init>(MetaClassRegistryImpl.java:59) at groovy.lang.GroovySystem.<clinit>(GroovySystem.java:29) at org.codehaus.groovy.reflection.ClassInfo.getMetaClassUnderLock(ClassInfo.java:152) at org.codehaus.groovy.reflection.ClassInfo.getMetaClass(ClassInfo.java:182) at com.bluepapa32.wol.WakeOnLAN.$getStaticMetaClass(WakeOnLAN.groovy) at com.bluepapa32.wol.WakeOnLAN.<init>(WakeOnLAN.groovy) at com.bluepapa32.wol.Main.applyDefaults$(Main.fx:143) at com.sun.javafx.runtime.FXBase.applyDefaults$(Unknown Source) at com.sun.javafx.runtime.FXBase.initialize$(Unknown Source) at com.bluepapa32.wol.Main.<init>(Main.fx) at com.bluepapa32.wol.Main.javafx$run$(Main.fx:201) 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.sun.javafx.runtime.provider.GUIRuntimeProvider$1.run(Unknown Source) at com.sun.javafx.tk.swing.SwingToolkit$StartupRoutine.run(Unknown Source) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) at java.awt.EventQueue.dispatchEvent(EventQueue.java:633) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) Caused by: java.security.AccessControlException: access denied (java.lang.RuntimePermission accessDeclaredMembers) at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323) at java.security.AccessController.checkPermission(AccessController.java:546) at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) at java.lang.SecurityManager.checkMemberAccess(SecurityManager.java:1662) at java.lang.Class.checkMemberAccess(Class.java:2157) at java.lang.Class.getDeclaredMethods(Class.java:1790) at org.codehaus.groovy.reflection.CachedClass$3$1.run(CachedClass.java:83) at java.security.AccessController.doPrivileged(Native Method) at org.codehaus.groovy.reflection.CachedClass$3.initValue(CachedClass.java:80) at org.codehaus.groovy.reflection.CachedClass$3.initValue(CachedClass.java:78) at org.codehaus.groovy.util.LazyReference.getLocked(LazyReference.java:46) at org.codehaus.groovy.util.LazyReference.get(LazyReference.java:33) at org.codehaus.groovy.reflection.CachedClass.getMethods(CachedClass.java:249) at org.codehaus.groovy.reflection.CachedClass$3.initValue(CachedClass.java:115) at org.codehaus.groovy.reflection.CachedClass$3.initValue(CachedClass.java:78) at org.codehaus.groovy.util.LazyReference.getLocked(LazyReference.java:46) at org.codehaus.groovy.util.LazyReference.get(LazyReference.java:33) at org.codehaus.groovy.reflection.CachedClass.getMethods(CachedClass.java:249) at org.codehaus.groovy.reflection.CachedClass$3.initValue(CachedClass.java:115) at org.codehaus.groovy.reflection.CachedClass$3.initValue(CachedClass.java:78) at org.codehaus.groovy.util.LazyReference.getLocked(LazyReference.java:46) at org.codehaus.groovy.util.LazyReference.get(LazyReference.java:33) at org.codehaus.groovy.reflection.CachedClass.getMethods(CachedClass.java:249) at org.codehaus.groovy.reflection.stdclasses.CachedClosureClass.<init>(CachedClosureClass.java:29) at org.codehaus.groovy.reflection.ClassInfo.createCachedClass(ClassInfo.java:259) at org.codehaus.groovy.reflection.ClassInfo.access$400(ClassInfo.java:36) at org.codehaus.groovy.reflection.ClassInfo$LazyCachedClassRef.initValue(ClassInfo.java:425) at org.codehaus.groovy.reflection.ClassInfo$LazyCachedClassRef.initValue(ClassInfo.java:416) at org.codehaus.groovy.util.LazyReference.getLocked(LazyReference.java:46) at org.codehaus.groovy.util.LazyReference.get(LazyReference.java:33) at org.codehaus.groovy.reflection.ClassInfo.getCachedClass(ClassInfo.java:89) at org.codehaus.groovy.reflection.ReflectionCache.getCachedClass(ReflectionCache.java:107) at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.registerMethods(MetaClassRegistryImpl.java:145) ... 26 more