Peter____ Ответов: 1

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

Попробуйте обратиться к человеку, написавшему этот код.

1 Ответов

Рейтинг:
12

Peter____

It usually happens when using jar files compiled with different versions of jdk

e.g. included file.jar compiled in 1.7 then jdk 9 is use to compile myapp.jar which imported class from file.jar


Изменение версии Java JRE на
java-11-openjdk-amd64
решить проблему.