Nosuchmethoderror в программе .jar
Привет,
Я написал проект maven с netbeans. Когда я запускаю программу в Netbeans, все работает. После сборки проекта и запуска файла Jar с помощью: java -jar filename.jar программа запускается, но когда я сейчас выполню одну следующую функцию, я получу
java.lang.NoSuchMethodError:исключение. Все остальные функции работают.
Что я уже пробовал:
исключение:
Extra Bytebuffer: ByteBuffer length =217 Exception in thread "AWT-EventQueue-0" java.lang.NoSuchMethodError: java.nio.ByteBuffer.position(I)Ljava/nio/ByteBuffer; at humer.kamera.PhraseUvcDescriptor.phraseUvcData(PhraseUvcDescriptor.java:116) at humer.kamera.CameraSearch.listDevice(CameraSearch.java:143) at humer.kamera.CameraSearch.autoSearchTheCamera(CameraSearch.java:85) at humer.kamera.Kam.AutoSearchTheCamerasActionPerformed(Kam.java:385) at humer.kamera.Kam.access$100(Kam.java:45) at humer.kamera.Kam$2.actionPerformed(Kam.java:281) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) at javax.swing.AbstractButton.doClick(AbstractButton.java:376) at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:842) at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:886)
Исключение исходит из этого ByteBuffer:
public PhraseUvcDescriptor (ByteBuffer data) { this.uvcData = ByteBuffer.allocate(data.limit()); this.uvcData = data.duplicate(); }
И когда я устанавливаю положение ByteBuffer:
positionAbsolute += descSize; uvcData.position(positionAbsolute); }
Я сделаю исключение:
uvcData.position(positionAbsolute);= Строка 116
Я не знаю, почему ByteBuffer не работает в файле Jar, потому что в Netbeans все работает.
Спасибо,
Питер
Ссылка на проект на GitHub: GitHub - Peter-St/Linux_Jna_Kamera: поток камеры через Jna.[^]
Richard MacCutchan
Итак, какая же фактическая строка дает ошибку, и на какой метод жалуются?
Peter____
uvcData.position(positionAbsolute); выдает ошибку
uvcData-это ByteBuffer.
Этот метод находится в файле: PhraseUvcDescriptor.java (ссылка)
Peter____
В этом весь метод:
public int phraseUvcData() { try { ArrayList<byte []> frameData = new ArrayList<>(); int formatcnt = 0; byte[] formatData = null; int positionAbsolute = 0; int posStart, posEnd; do { int pos = uvcData.position(); byte descSize = uvcData.get(pos); byte descType = uvcData.get(pos +1); byte descSubType = uvcData.get(pos + 2); if (descSubType == VS_format_uncompressed) { formatData = new byte [descSize]; uvcData.get(formatData, 0 ,descSize); frameData = new ArrayList<>(); printData(formatData); } else if (descSubType == VS_frame_uncompressed) { byte [] uncompressedFrameData = new byte [descSize]; uvcData.get(uncompressedFrameData, 0 ,descSize); frameData.add(uncompressedFrameData); if (uvcData.get(pos + descSize + 2) != VS_frame_uncompressed) { FormatIndex formatUncomprIndex = new FormatIndex(formatData, frameData); formatUncomprIndex.init(); formatIndex.add(formatUncomprIndex); } } if (descSubType == VS_format_mjpeg) { formatData = new byte [descSize]; uvcData.get(formatData, 0 ,descSize); frameData = new ArrayList<>(); printData(formatData); } else if (descSubType == VS_frame_mjpeg) { byte [] mjpegFrameData = new byte [descSize]; uvcData.get(mjpegFrameData, 0 ,descSize); frameData.add(mjpegFrameData); if (uvcData.get(pos + descSize + 2) != VS_frame_mjpeg) { FormatIndex formatUncomprIndex = new FormatIndex(formatData, frameData); formatUncomprIndex.init(); formatIndex.add(formatUncomprIndex); } } positionAbsolute += descSize; uvcData.position(positionAbsolute); } while (uvcData.limit() > positionAbsolute); System.out.println("UvcDescriptor finished."); return 0; } catch ( Exception e ) {e.printStackTrace(); } return -1; }
Richard MacCutchan
Где же метод (uvcData.position
) что дает ошибка?
Peter____
в нижней части метода (конец цикла while).
uvcData = Bytebuffer
а с помощью метода position methode, реализованного в Java Bytebuffer, я должен установить позицию в байтовом буфере, потому что мне нужно считывать не менее 5 байтовых массивов разной длины. Длина ByteBuffer составляет около 200 шестнадцатеричных значений.
По решению можно было бы использовать байтовый массив вместо байтбуффера. Я думаю, что это может быть ошибка.
Richard MacCutchan
Я только что проверил документацию, и там явно нет такого метода. Видеть ByteBuffer (Java Platform SE 7 )[^].
Peter____
Methods inherited from class java.nio.Buffer: capacity, clear, flip, hasRemaining, isReadOnly, limit, limit, mark, position, position, remaining, reset, rewind
Хорошо, значит, мне тоже нужно импортировать буфер класса Java, чтобы заставить его работать? Метод position прост в использовании и экономит мне несколько строк кода.
Пока что,
Richard MacCutchan
Мои извинения, вы правы. Я только что убедился, что он действительно работает правильно. Вам не нужно импортировать родительский класс, так как это происходит автоматически. Извините, но я не могу понять, почему это исключение выбрасывается. Может быть, есть что-то в структуре Maven, что является причиной.
Peter____
Хорошо,
что вы предлагаете, к кому обратиться по этому вопросу сейчас?
Richard MacCutchan
Попробуйте обратиться к человеку, написавшему этот код.