JavaでCOMポートを開きたい
解決したいこと
Java8でシリアル通信を使い機械に対して指示を送信したいです。
COMポートを開く際にエラーが発生しました。
解決方法を教えて下さい。
発生している問題・エラー
java.lang.NoClassDefFoundError: no rxtxSerial in java.library.path thrown while loading gnu.io.RXTXCommDriver
該当するソースコード
// RS232Cポートをオープンする。
CommPortIdentifier RSport = CommPortIdentifier.getPortIdentifier("COM1");
環境
- OS / Windows Server 2016
- 開発言語 / Java8
- Apache Tomcat / 8.5.20
- ライブラリ / RXTX-2.1-7
自分で試したこと
- クラスローダーを疑って
webapps/<app>/WEB-INF/lib/RXTXcomm.jar
をtomcat/lib/RXTXcomm.jar
に移したがダメだった
解決?
RXTXcomm.jarをデコンパイルして、CommPortIdentifier.getPortIdentifier("COM1");
が何をしているのかを見てみた。
まずコンストラクターのCommPortIdentifier()
が呼ばれて、gnu.io.RXTXCommDriver
のInstanceを生成してinitializeして・・・
それ以前に随所にあるSystem.loadLibrary("rxtxSerial");
が解決されますね。なにこれ(´・ω・`)?
↑のライブラリをググるとrxtxSerial.dll
がHitした。
dll入れるところってどうせsystem32
でしょ?
ってことで既存の環境を起動してみるとrxtxParallel.dll
とrxtxSerial.dll
があった。
じゃあ既存環境に合わせましょってことでsystem32
にrxtxParallel.dll
とrxtxSerial.dll
を配置。
Javaアプリを再起動すると今度は別のエラー↓が出る。
java.lang.UnsatisfiedLinkError: C:\Windows\System32\rxtxSerial.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform thrown while loading gnu.io.RXTXCommDriver
64bit版Javaでは32bit版のdllはロードできないって書いてあるね
確かにインストールしたJavaは64bit版だ
32bit版をインストールしなおすのはめんどくさいのでjvmを32bitで起動できないか探す。
rem これで32bitとして起動できる?試してみよ
%java_home%\bin > java -d32
Error: This Java instance does not support a 32-bit JVM.
Please install the desired version.
あきらめて32bit版Javaをインストールしてアプリ再実行したら↓のエラーになった(まさかの振り出し)
java.lang.NoClassDefFoundError: no rxtxSerial in java.library.path thrown while loading gnu.io.RXTXCommDriver
32bitアプリがC:\Windows\System32
を参照したとき、C:\Windows\SysWOW64
にリダイレクトされるからや
ということでrxtxParallel.dll
とrxtxSerial.dll
をC:\Windows\SysWOW64
へ配置
でも動かねぇ(´・ω・`)なんで?
めんどくさいからC:\Windows
に配置した。
うごいたよ。※ただしeclipseでデバック起動したときだけね。バッチから実行したらまたパスが通らんって怒られた
細かいところはおいおい調べて加筆する
とりあえず動いてよかった
解決編はこちらに↓