Конвертер Java Card: неподдерживаемый формат файла класса версии 50.0

Я пытаюсь создать файл CAP и файл экспорта из Wallet.java, который входит в стандартную комплектацию Java Card SDK в каталоге примеров. Я компилирую класс, использую конвертер и сталкиваюсь со следующим:

$ javac -g -d classes/ src/com/sun/javacard/samples/wallet/Wallet.java
$ converter -debug -verbose -classdir "$JC_HOME/samples/src" com.sun.javacard.samples.wallet 0xa0:0x0:0x0:0x0:0x62:0x3:0x1:0xc:0x6:0x1 1.0

Java Card 2.2.2 Class File Converter, Version 1.3
Copyright 2005 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms.

parsing /home/user/javacard/java_card_kit-2
$ java -version
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)
$ javac -version
javac 1.6.0_45
2/samples/src/com/sun/javacard/samples/wallet/Wallet.class error: com.sun.javacard.samples.wallet.Wallet: unsupported class file format of version 50.0. conversion completed with 1 errors and 0 warnings.

Моя версия Java и версии javac одинаковы, Java 1.6:

$ java -version
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)
$ javac -version
javac 1.6.0_45

Я использую JC SDK 2.2.2 в Ubuntu 14.04. Версия конвертера 1.3:

$ converter -version
Java Card 2.2.2 Class File Converter, Version 1.3
Copyright 2005 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms.

Кажется, я не могу решить эту ошибку «неподдерживаемый формат файла класса версии 50.0». Я немного озадачен тем, почему я сталкиваюсь с этой ошибкой, учитывая, что Java 1.6 имеет версию 50.0.

Кто-нибудь еще сталкивался с такой же проблемой?


person cmanning    schedule 17.02.2016    source источник
comment
Вы должны использовать Java 1.3 для компиляции ваших .java файлов в .class файлов. Поскольку преобразователь JCDK2.2.2 поддерживает только файлы class, сгенерированные Java 1.3.   -  person Ebrahim Ghasemi    schedule 17.02.2016
comment
@ Авраам, спасибо. Я попробую.   -  person cmanning    schedule 17.02.2016


Ответы (2)


Конвертер Java Card 2.2.2 поддерживает не более формата файла класса Java 5 (поэтому сообщается, что Java 6/версия 50.0 не поддерживается). Таким образом, вам необходимо указать версию исходного файла совместимости/класса при компиляции исходного кода с использованием более новых версий JDK:

javac -g -source 1.5 -target 1.5 -d classes/ src/com/sun/javacard/samples/wallet/Wallet.java

Точно так же для Java Card 2.2.1 вы должны использовать версию 1.2:

javac -g -source 1.2 -target 1.2 -d classes/ src/com/sun/javacard/samples/wallet/Wallet.java

А для Java Card 2.1.1 (JC SDK 2.1.2) вы должны использовать версию 1.1:

javac -g -source 1.1 -target 1.1 -d classes/ src/com/sun/javacard/samples/wallet/Wallet.java

Вы можете проверить версию файла класса с помощью дизассемблера файлов классов Java (спасибо @cmanning за упоминание об этом):

javap -v -cp classes/ com.sun.javacard.samples.wallet.Wallet |grep 'version'
person Michael Roland    schedule 18.02.2016
comment
Спасибо, я уже пробовал это, и я все еще сталкиваюсь с тем же результатом. В результате выполнения команды javac с указанным источником и целью по-прежнему создается файл класса в формате версии 50.0. Я проверил с помощью следующей команды javap -verbose src.com.sun.javacard.samples.wallet.Wallet | grep version - person cmanning; 18.02.2016
comment
@cmanning Это странно. У меня это отлично работает с Oracle JDK 8 (1.8.0_60) в Windows 7, а также с Oracle JDK 6 (1.6.0_30) в Ubuntu 14.04.3 LTS. - person Michael Roland; 18.02.2016
comment
Я думаю, что что-то не так с моей виртуальной машиной Ubuntu. Я создал новую виртуальную машину и смог управлять основной версией с помощью исходных и целевых тегов javac. Думаю, сейчас я на правильном пути. Спасибо за вашу помощь. - person cmanning; 18.02.2016
comment
Уважаемый Михаил, я получаю ошибку javac: invalid source release: 1.1 за -source 1.1 -target 1.1 . Почему? (Другие версии работали нормально). - person Ebrahim Ghasemi; 29.02.2016
comment
@Abraham Похоже, устаревшая версия 1.1 больше не доступна в Java 7 и Java 8. Я не проверял это, но в этом случае использование -source 1.2 -target 1.1 должно работать нормально. - person Michael Roland; 08.03.2016

Возможно, вы захотите изучить ant-javacard, который делает такие вещи (как флаги компилятора в зависимости от JC SDK версия) автоматически. (отказ от ответственности: я сделал это)

person Martin Paljak    schedule 05.03.2016