5

我正在使用 Redhat 的 OpenJDK 11 与 Windows 上的智能卡进行通信。但是我在编译时遇到了问题。它说找不到 javax.smartcardio 库。

环境:Redhat OpenJDK 11、Intellij、Kotlin、Gradle

> Task :compileKotlin
e: ~\util\SmartCard.kt: (7, 14): Unresolved reference: smartcardio
e: ~\util\SmartCard.kt: (13, 25): Unresolved reference: CardTerminal
e: ~\util\SmartCard.kt: (13, 41): Unresolved reference: TerminalFactory
e: ~\util\SmartCard.kt: (19, 51): Unresolved reference: CardTerminal
e: ~\util\SmartCard.kt: (25, 43): Unresolved reference: CardTerminal
e: ~\util\SmartCard.kt: (35, 23): Unresolved reference: Card
e: ~\util\SmartCard.kt: (36, 30): Unresolved reference: CardChannel
e: ~\util\SmartCard.kt: (44, 52): Unresolved reference: CardException
e: ~\util\SmartCard.kt: (51, 19): Unresolved reference: CardException
e: ~\util\SmartCard.kt: (54, 27): Unresolved reference: CommandAPDU

另外,我已经查看了类路径,并且有一个“java.smartcardio”,我在下面附上了一个屏幕截图。

类路径

我应该怎么办?

添加 - - - - - - - -

有线的东西在 Java 代码中,它在同一个项目上工作。我认为 Kotllin 环境设置有问题。

4

2 回答 2

6

我认为您需要将 java.smartcard 模块包含到使用您列出的未解析类的代码所在的模块中。我在 se.ivankrizsan 包中创建了一个名为 kotlinsmartcard 的小型 Kotlin 项目,代码如下:

fun main() {
    val theCardTerminal: CardTerminal;
    println("Hello World!")
}

在源根目录中,即不在任何包中,我有一个名为 module-info.java 的文件,其内容如下:

module kotlinsmartcard {
    requires kotlin.stdlib;
    requires java.smartcardio;
}

我可以使用 JDK 11.0.3-zulu 运行上述程序(使用它是因为我手头没有 RedHat JDK)。这样我的整个 kotlinsmartcard 项目就是一个单独的模块,为了尽量减少对 Java 模块系统的暴露,但我仍然需要“需要 java.smartcardio”,以免代码中的变量声明出现错误.

于 2019-09-11T06:10:01.103 回答
0

这是另一种方法。我只是放弃了使用 JDK 的 SmartCard 类,因为在 JDK 11 版本上很难使用 JDK one。取而代之的是,我使用了 Github 的一个库。

这里是。

https://github.com/intarsys/smartcard-io

于 2020-01-29T19:36:09.397 回答