2016-02-17 13 views
4

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

$ 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_2_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.

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

+2

Вы должны использовать 'Java 1.3' для компиляции файлов' .java' в файлы '.class'. Поскольку конвертер JCDK2.2.2 поддерживает только файлы класса «class» Java 1.3. – Abraham

+0

@Abraham, спасибо. Я попробую. – cmanning

ответ

4

Конвертер 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' 
+0

Спасибо, я уже пробовал это, и я до сих пор сталкиваюсь с тем же результатом. Результат команды javac с указанным исходным и целевым объектами генерирует файл класса с форматом версии 50.0. Я проверил с помощью следующей команды: javap -verbose src.com.sun.javacard.samples.wallet.Wallet | grep version' – cmanning

+0

@cmanning Это странно. Это отлично подходит для меня с Oracle JDK 8 (1.8.0_60) на Windows 7, а также с Oracle JDK 6 (1.6.0_30) на Ubuntu 14.04.3 LTS. –

+1

Я думаю, что что-то не так с моей Ubuntu VM. Я создал новую виртуальную машину и смог контролировать основную версию через исходные и целевые теги javac. Думаю, я сейчас на правильном пути. Спасибо за вашу помощь. – cmanning

2

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