Rmecan
@Rmecan (ごとう)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

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.jartomcat/lib/RXTXcomm.jarに移したがダメだった

解決?

RXTXcomm.jarをデコンパイルして、CommPortIdentifier.getPortIdentifier("COM1");が何をしているのかを見てみた。
まずコンストラクターのCommPortIdentifier()が呼ばれて、gnu.io.RXTXCommDriverのInstanceを生成してinitializeして・・・
それ以前に随所にあるSystem.loadLibrary("rxtxSerial");が解決されますね。なにこれ(´・ω・`)?
↑のライブラリをググるとrxtxSerial.dllがHitした。
dll入れるところってどうせsystem32でしょ?
ってことで既存の環境を起動してみるとrxtxParallel.dllrxtxSerial.dllがあった。
じゃあ既存環境に合わせましょってことでsystem32rxtxParallel.dllrxtxSerial.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.dllrxtxSerial.dllC:\Windows\SysWOW64へ配置

でも動かねぇ(´・ω・`)なんで?

めんどくさいからC:\Windowsに配置した。

うごいたよ。※ただしeclipseでデバック起動したときだけね。バッチから実行したらまたパスが通らんって怒られた

細かいところはおいおい調べて加筆する
とりあえず動いてよかった

解決編はこちらに↓

0

No Answers yet.

Your answer might help someone💌