@ledsun blog

無味の味は佳境に入らざればすなわち知れず

Javaのスクリプティング機能のimportPackage文の書き方

f:id:ledsun:20130123234805j:plain

Java スクリプティング機能とはJavaからJavaScriptを実行したり、JavaScriptからJavaのクラスを参照したりする機能。 詳しくはJava SE 6 じゃじゃ馬ならし Scriptingを見てもらうとして JavaScriptからJavaで定義されたクラスを参照する際にパッケージをimportします。

java.ioパッケージを読み込むときは次のように書きます。

importPackage(java.io);

これをOpenCSVを使うためにau.com.bytecode.opencsvを取り込もうと次のように書くと

importPackage(au.com.bytecode.opencsv);

これはエラーになります。

手軽に試すならこんな感じ

C:\temp\opencsv-2.3\deploy>jrunscript
js> importPackage(au.com.bytecode.opencsv)
script error: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "au" is not defined. (<STDIN>#1) in <STDIN> at line number 1

auが見えないということはクラスパスの指定がおかしいのか?とか、そのくせ存在しないパッケージ名を指定してもエラーが出ないのはなんなんだ!?散々悩んだのですが、大丈夫。世の中の大半の謎はstackoverflowで解決されているッ!Import a class in Scripting java (javax.script)を見ると、次のように頭にPackagesを付ければOK。

importPackage(Packages.au.com.bytecode.opencsv);

要点だけ訳すと

Please note that "java" is a shortcut for "Packages.java". There are equivalent shortcuts for javax, org, edu, com, net prefixes
「java」は「"Packages.java」へのショートカットであることに注意してください。javax、org、edu、com、netにも同様のショートカットがあります。

importPackageを使うときはパッケージ名の前に「Packages.」を付けること、ただしjava、javax、org、edu、com、netで始まるパッケージの場合は省略できる。