質問: engine.eval("sqrt(a)"); System.out.println(result.asDouble()); engine.end(); } } ``` Build PathとRun Configulationは以下のようになっています。 ![Build Path](https://i.stack.imgur.com/5ROve.png) ![Run Config.](https://i.stack.imgur.com/yve7c.png) ![Error](https://i.stack.imgur.com/zZ0CN.png) これをとりあえず自分のパソコンのCMDでやってみたが、上記のように起動しなかったので別質問にて聞いたところ環境変数をいじるように言われたのでPATHに以下を追加 `C:\R\R-4.0.0\library\rJava\jri\x64` すると6.0という値が出ました。 質問したい内容はこのPATHを設定せずに済むようなエクスポートする方法があるかどうかです。エクスポート時にプロジェクトにPATHの情報も全部入れることは可能なのでしょうか?それと受け取り側がrJavaとJRIのインストールをしてない場合でも使えるようにするにはどうすればいいのでしょうか?教えていただけると幸いです。
回答: rJavaはRからJavaを利用するためのものであり、質問にあるコードを実行する上ではインストールは必須ではないと思います。 JRIはJavaからRを利用するためのものであり、こちらは必要です。 JRIはJNIで実装されており、実行にはネイティブライブラリ(JRIでは`jri.dll`(Windowsの場合))を必要とします。 ネイティブライブラリは(jar内のリソースとしてではなく)ファイルシステム上に置かれている必要があり、またシステムプロパティ`java.library.path`や環境変数`PATH`(Windowsの場合)で指定したディレクトリに置くことで、プログラムから検索できるようにしておく必要があります。 つまり、質問文のコードを実行するためには(Java実行環境、R実行環境がセットアップされた上で) * `jri.dll` をどこかに置く * 置いた場所をプログラムに教えてやる は必須です。 (正確には、既定のライブラリパス(Windowsの場合、例えば `C:\Windows\System32`)に `jri.dll` を置くことで後者の作業は省略できますが、ほかのアプリケーションにも影響を与え得るのでやめておくのが無難かと考えます) ですので、問題を解決する方向性としては、受け取り側が上記を明示的に行わずに済むように自動化する(隠蔽する)、ということになります。 古典的な解決策として、今回のプログラム用に自前でインストーラを作ることが思い浮かびます。 そうすれば、インストーラがファイルを配備、設定することになるので、プログラムを受け取った側が`jri.dll`などについて気にする必要が無くなります。 次の解決策として考えられるのは、`jri.dll` もjarファイルの中に含めておき、実行時にjarからファイルシステムへ展開する方式です。 これについては先人もおり、次のリンクが参考になりそうです: * How to bundle a native library and a JNI library inside a JAR? - Stack Overflow jarの中の `jri.dll` を展開するだけなので、自前で実装するのもさほど難しくないですし、この方向の解決策が最も現実的かと思います。 3つめの解決策としては、構築済みの実行環境自体を仮想環境として提供することが挙げられます。 まるっと一式提供するのでJRIのみならずRやJavaについても受け取り側は考慮が不要になります。 ただし受け取り側はJRIについての考慮が不要になる代わりに、仮想環境についての知識が求められますので今回についてはオーバーキルかもしれません。 参考として、前回少し実行環境に興味が湧いたので、そのとき作ってみたDockerfileを示します: *