1.6.2よりリソースの展開に問題が発生することがあるようです
バグのご報告ありがとうございます。 こちらで確認したところ、exewrap 1.6.1 では動作しました。exewrap 1.6.2、exewrap 1.6.4 では動作しませんでした。 しかし、こちらで確認した際のスタックトレースは以下のようになっておりご報告いただいたものと異なっていました。
Exception in thread "main" java.lang.ExceptionInInitializerError at org.apache.batik.apps.svgbrowser.JAuthenticator.initWindow(JAuthenticator.java:93) at org.apache.batik.apps.svgbrowser.JAuthenticator.<init>(JAuthenticator.java:89) at org.apache.batik.apps.svgbrowser.Main.<init>(Main.java:410) at org.apache.batik.apps.svgbrowser.Main.main(Main.java:164) Caused by: java.security.AccessControlException: access denied ("java.io.FilePermission" "\C:\temp\batik-i18n-1.13.jar" "read") at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) at java.security.AccessController.checkPermission(AccessController.java:886) at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) at java.net.URLClassLoader$4.run(URLClassLoader.java:712) at java.net.URLClassLoader$4.run(URLClassLoader.java:710) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.getPermissions(URLClassLoader.java:710) at java.security.SecureClassLoader.getProtectionDomain(SecureClassLoader.java:206) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:468) at java.net.URLClassLoader.access$100(URLClassLoader.java:74) at java.net.URLClassLoader$1.run(URLClassLoader.java:369) at java.net.URLClassLoader$1.run(URLClassLoader.java:363) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:362) at Loader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) at org.apache.batik.apps.svgbrowser.Resources.<clinit>(Resources.java:49) ... 4 more
リソース参照で問題が発生しているのは同じですが、こちらではパーミッションの問題であることが分かります。 こちらでは exewrap 実行時にオプション等を付けずに batik-squiggle-1.13.jar を batik-squiggle-1.13.exe に変換しました。
また、lib/batik-svgbrowser-1.13.jar に埋め込まれている svgbrowser.policy を書き換えたり batik-squiggle-1.13.policy を配置することで、暫定的に問題を回避しアプリケーションが起動することを確認しました。
ご報告いただいた例外が発生する状況・手順をもう少し具体的に教えていただけないでしょうか?
こちらでは、ポリシーファイルの書き換えなどをせずにそのまま実行可能にできるよう exewrap の修正を検討しています。
org/apache/batik/apps/svgbrowser/resources/svgbrowser.policy に以下の内容を追加することでパーミッションの問題は回避できるようです。
grant codeBase "${app.jar.base}/../batik-squiggle-1.13.exe" { permission java.io.FilePermission "<<ALL FILES>>", "read"; };
batik-svgbrowser-1.13.jar 内の svgbrowser.policy を置き換える方法のほかに、batiki-squiggle-1.13.exe と同じフォルダーにorg/apache/batik/apps/svgbrowser/resources/svgbrowser.policy を作成することでも認識されます。
確認ありがとうございます。 正直JAVAは斜め読みしてコピペ修正できる程度の知識しかなくポリシー周りはまったく分からないのですが、パーミッションで問題が発生するということですとアプリの動作権限が違うのかもしれません。 私の環境ではちょっとした都合でUACを無効にしているためポリシーの制限を受けずに実行できているのかもしれません。 私が試した場合、挙動が変わらなかったので使用していませんがexewrapのオプションでUAC実行レベルをポリシーに即したものにすれば同じ条件になるのかもしれません。 極論でいえば管理者にすれば動く気もしますが、ポリシーの確認は行っていないので管理者の権限が必要なのか分かりませんし、何でも管理者で動かせとかソースからポリシーを確認して適切なものを選べというのも難しいかもしれませんが。 exewarpの実行にはJAVAが複数バージョン導入されている&オプションを使用しないと「jre1.5」が使用されるようなので「-t」オプションで「1.8」を指定して次のようにしています。
exerap.exe -t 1.8 ソース.jar
あまり有益な情報はないですが私の分かる範囲だとこの位です。
追加情報ありがとうございます。
おそらく、UAC(Windowsのセキュリティ機能)は無関係です。
Javaのセキュリティポリシーが影響していると考えています。 私はSVGのこと詳しくないのですが、SVGには任意のスクリプトを組み込むようなこともできるようですね。 それらのスクリプトがコンピューターに害を与えないように batik-squiggle は明確なポリシー定義をしているようです。 各々のJARファイルのみにファイルの読み書き等を明示的に許可しており、 その他の動作(SVGのスクリプト?)では外部アクセスが許可されないように配慮されているように見えます。
C:\Windows\Users\name\.batik に __svgbrowser.policy が作成されていないか確認してみてください。
このファイルは毎回作成されるようなので中身を書き換えても効果はありませんが…。
実行ファイル名が batik-squiggle-1.13.exe のとき、同じフォルダーに batik-squiggle-1.13.policy という名前のテキストファイルを作成して、そのファイルの中身を以下のようにしてみてください。
grant { permission java.security.AllPermission; };
これで状況が変化するか確認してみてください。
確認してみたところpolicyファイルを置くと動作するようです。 そんなに手間でもないのでセキュリティなし運用になる注意があれば暫定的にはこの対処で問題ないと思います。
・exewrap1.6.4でjarから変換したexeは動作しない ・変換したアプリは「Batik JAVA SVG TOOLKIT」の「SQUIGGLE」である 「batik-squiggle-1.13.jar」
https://xmlgraphics.apache.org/batik/
・変換したexeを実行すると以下のエラーが出て実行できない
java.lang.NullPointerException
Exception in thread "main" java.lang.NullPointerException
・変換にはexewrapの64bit版を使用しJREは64bit版の1.8.0_u121を使用した ・非常に古い内容であるが次のURLによるとPack200を不使用の場合リソースが 作られないとの記述がある(本質的には関係ない)
https://www.g200kg.com/archives/2012/05/exewrap.html
・「Batik」のソースを確認すると「batik-squiggle-1.13.jar」はメイン メソッドを起動するだけで実体は「lib\batik-svgbrowser-1.13.jar」であり 「batik-svgbrowser-1.13.jar」の次のメソッドを確認すると 「ICON_BATIK_SPLASH」というリソースの取得に失敗しているものと考えられる
org.apache.batik.apps.svgbrowser.AboutDialog.buildGUI
・網羅的にテストしたところVer.1.6.2より64bit/32bit版ともに正常に動作 しないため、1.6.2で変更されたクラスローダーの変更に問題があると 考えられる