Рейтинг:0

Как исправить java.lang.ClassNotFoundException: gnu.io.CommPortIdentifier с помощью libRXTX в Ubuntu 20.04?

флаг us

У меня есть следующая ошибка:

$ sudo java -jar /home/fadedbee/tc65sh-1.4.0/bin/tc65sh.jar -Djava.library.path=/usr/lib/jni/ -cp /usr/share/java/RXTXcomm.jar -p / dev/ttyUSB0 -b 115200 -f push.txt
тс65ш v1.4.0
обработка командного файла push.txt
подключение /dev/ttyUSB0 со скоростью 115200 бод, flowControl r
Исключение в потоке "основной" java.lang.NoClassDefFoundError: gnu/io/CommPortIdentifier
    на org.tc65sh.device.Device.connect(Device.java:56)
    в org.tc65sh.Main.exec(Main.java:102)
    на org.tc65sh.Main.main(Main.java:59)
Вызвано: java.lang.ClassNotFoundException: gnu.io.CommPortIdentifier
    в java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    в java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    в java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
    ... еще 3

Я установил libRXTX, и все файлы появляются в правильных местах:

$ ls -lA /usr/lib/jni/
всего 148
-rw-r--r-- 1 root root 22696 9 мая 2018 г. librxtxI2C-2.2pre1.so
lrwxrwxrwx 1 root root 21 9 мая 2018 г. librxtxI2C.so -> librxtxI2C-2.2pre1.so
-rw-r--r-- 1 root root 14424 9 мая 2018 г. librxtxParallel-2.2pre1.so
lrwxrwxrwx 1 root root 26 9 мая 2018 г. librxtxParallel.so -> librxtxParallel-2.2pre1.so
-rw-r--r-- 1 root root 22688 9 мая 2018 г. librxtxRaw-2.2pre1.so
lrwxrwxrwx 1 root root 21 9 мая 2018 г. librxtxRaw.so -> librxtxRaw-2.2pre1.so
-rw-r--r-- 1 root root 22704 9 мая 2018 г. librxtxRS485-2.2pre1.so
lrwxrwxrwx 1 root root 23 9 мая 2018 г. librxtxRS485.so -> librxtxRS485-2.2pre1.so
-rw-r--r-- 1 root root 59824 9 мая 2018 г. librxtxSerial-2.2pre1.so
lrwxrwxrwx 1 root root 24 9 мая 2018 г. librxtxSerial.so -> librxtxSerial-2.2pre1.so

$ ls -lA /usr/share/java/ | grep RXTX
-rw-r--r-- 1 root root 63027 9 мая 2018 г. RXTXcomm-2.2pre2.jar
lrwxrwxrwx 1 root root 20 9 мая 2018 г. RXTXcomm.jar -> RXTXcomm-2.2pre2.jar

Я вижу правильный класс внутри файла jar:

$ строки /usr/share/java/RXTXcomm.jar | grep CommPortIdentifier
gnu/io/CommPortIdentifier.класс
gnu/io/CommPortIdentifier.classPK

Как я могу помочь Java найти класс?

(Я уже пытался изменить порядок опций на sudo java -Djava.library.path=/usr/lib/jni/ -cp /usr/share/java/RXTXcomm.jar -jar /home/fadedbee/tc65sh-1.4.0/bin/tc65sh.jar -p /dev /ttyUSB0 -b 115200 -f push.txt а ошибка осталась)

Bodo avatar
флаг pt
Не имеет прямого отношения к вашей проблеме, но запуск программы с правами root может представлять угрозу безопасности. Если у вас нет прав на использование `/dev/ttyUSB0` в качестве обычного пользователя, вы должны добавить пользователя в группу, которой принадлежит tty-устройство. см. https://askubuntu.com/a/133244/1186757
fadedbee avatar
флаг us
@Bodo, Да, ты прав, но сначала я запущу его, а потом разберусь с разрешениями.
Bodo avatar
флаг pt
Вы перекомпилировали исходники или просто запустили бинарный JAR из `tc65sh-1.4.0.zip`? Просто предположение: похоже, это довольно старое программное обеспечение, и в файле README указано: «Для запуска TC65SH на вашем компьютере должна быть установлена ​​Java SE 6». Может ли быть несовместимость между `tc65sh.jar`, скомпилированным, вероятно, с Java 6, и `RXTXcomm.jar`, который может быть скомпилирован с более новой версией или даже может быть изменен.
N0rbert avatar
флаг zw
Запустите сначала `sudo usermod -a -G dialout $USER`, затем перезагрузитесь и повторите попытку без `sudo`.
fadedbee avatar
флаг us
@Bodo Я только что запустил бинарный JAR.
Рейтинг:0
флаг us

Решение заключалось в использовании:

$ sudo java -Djava.library.path=/usr/lib/jni/ -cp /usr/share/java/RXTXcomm.jar:/home/fadedbee/tc65sh-1.4.0/bin/tc65sh.jar org.tc65sh. Основной -p /dev/ttyUSB0 -b 115200 -f push.txt

Это решает первую проблему, но теперь у меня осталось:

$ sudo java -Djava.library.path=/usr/lib/jni/ -cp /usr/share/java/RXTXcomm.jar:/home/fadedbee/tc65sh-1.4.0/bin/tc65sh.jar org.tc65sh. Основной -p /dev/ttyUSB0 -b 115200 -f push.txt
тс65ш v1.4.0
обработка командного файла push.txt
подключение /dev/ttyUSB0 со скоростью 115200 бод, flowControl r
Предупреждение RXTX: удаление устаревшего файла блокировки. /var/блокировка/LCK..ttyUSB0
инициализирующее устройство
форсирование режима obex
java.io.IOException: тайм-аут ответа obex через 5001 мс и 33 байта
    на org.tc65sh.device.Device.receiveObexResponse(Device.java:543)
    на org.tc65sh.device.Device.openObexMode(Device.java:326)
    на org.tc65sh.device.Device.obexOpenObexMode(Device.java:127)
    в org.tc65sh.Main.exec(Main.java:110)
    на org.tc65sh.Main.main(Main.java:59)

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.