在 Open JDK 11(Redhat)上找不到 javax.smartcardio.*

Posted

技术标签:

【中文标题】在 Open JDK 11(Redhat)上找不到 javax.smartcardio.*【英文标题】:javax.smartcardio.* is not found on Open JDK 11(Redhat) 【发布时间】:2019-09-11 05:50:30 【问题描述】:

我正在使用 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 环境设置有问题。

【问题讨论】:

我不知道 Kotlin,但“未解析的引用”听起来是错误的。对于缺少的命名空间,Java 错误是“包 javax.smartcardio 不存在”,具有完全限定的包名称。你的代码绝对正确?可能还值得检查 javax.smartcardio.jar 的内容,以确保它确实包含您正在寻找的类。 我猜 Kotlin 有问题,当我用 Java 编写代码时它可以工作,但 Kotlin 不行。 【参考方案1】:

我认为您需要将 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”,以免代码中的变量声明出现错误.

【讨论】:

请注意,我在 Java 中展示的模块声明将位于名为 module-info.java 的特殊文件中,因此与 Maven 或 Gradle 等依赖管理系统无关。 还有其他方法可以解决这个问题吗?这种方式使代码到处出错。 我不知道为什么我做了你的解决方案但没有工作,所以我所做的只是将 java 用于 smartcardio。然后它的工作..谢谢! 我有一个模块化项目。它没有找到包。【参考方案2】:

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

在这里。

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

【讨论】:

以上是关于在 Open JDK 11(Redhat)上找不到 javax.smartcardio.*的主要内容,如果未能解决你的问题,请参考以下文章

jenv 在 MacOS 上找不到通过 brew 安装的 java 17

网络上找不到的 Jenkins 集成方案

在 macOS 11.3 上找不到“gl.h”

在 Windows 11 上找不到任何已安装的 .NET Core SDK(Visual Studio 代码)

Xcode 11 beta 上找不到 iPhone 7 模拟器

带有 IE11 的 Selenium 3.0.1 在 Windows 10 上找不到元素(在带有 IE11 的 Windows 7 上运行良好)