【问题标题】:Java Card Converter: unsupported class file format of version 50.0Java Card Converter:50.0 版本不支持的类文件格式
【发布时间】:2016-02-17 15:45:51
【问题描述】:

我正在尝试从示例目录下的 Java Card SDK 中标准的 Wallet.java 生成一个 CAP 文件和一个导出文件。我编译类,使用转换器并遇到以下情况:

$ 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

我在 Ubuntu 14.04 上使用 JC SDK 2.2.2。转换器的版本是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 版,我对为什么会遇到此错误感到有些困惑。

有没有其他人遇到过同样的问题?

【问题讨论】:

  • 您必须使用Java 1.3 将您的.java 文件编译为.class 文件。因为 JCDK2.2.2 转换器仅支持 Java 1.3 生成的class 文件。
  • @Abraham,谢谢。我会试试看。

标签: java applet converter javacard java-6


【解决方案1】:

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'

【讨论】:

  • 谢谢,我已经尝试过了,但我仍然遇到相同的结果。指定了源和目标的 javac 命令的结果仍然会生成一个 50.0 版格式的类文件。我使用以下命令检查了javap -verbose src.com.sun.javacard.samples.wallet.Wallet | grep version
  • @cmanning 这很奇怪。这对我来说适用于 Windows 7 上的 Oracle JDK 8 (1.8.0_60) 以及 Ubuntu 14.04.3 LTS 上的 Oracle JDK 6 (1.6.0_30)。
  • 我认为我的 Ubuntu 虚拟机有问题。我创建了一个新的 VM,并且能够通过 javac 源和目标标签控制主要版本。我想我现在走在正确的轨道上。感谢您的帮助。
  • 亲爱的迈克尔,我收到javac: invalid source release: 1.1 错误,-source 1.1 -target 1.1 。为什么? (其他版本运行良好)。
  • @Abraham 似乎折旧的 1.1 在 Java 7 和 Java 8 中不再可用。我没有对此进行测试,但在这种情况下使用 -source 1.2 -target 1.1 应该可以正常工作。
【解决方案2】:

您可能想查看自动执行此类操作的ant-javacard(作为编译器标志,取决于 JC SDK 版本)。 (免责声明:我做到了)

【讨论】:

    猜你喜欢
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 2022-11-08
    相关资源
    最近更新 更多