在 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
在 Windows 11 上找不到任何已安装的 .NET Core SDK(Visual Studio 代码)
Xcode 11 beta 上找不到 iPhone 7 模拟器
带有 IE11 的 Selenium 3.0.1 在 Windows 10 上找不到元素(在带有 IE11 的 Windows 7 上运行良好)