Java 9环境下javax.smartcardio包获取及ClassPath兼容问题咨询
首先得明确:javax.smartcardio并没有像其他Java EE相关包那样被迁移到外部Java EE仓库,它其实一直是JDK的组成部分,只是Java 9之后被封装成了java.smartcardio模块。针对你依赖ClassPath的项目场景,这里有几个实用方案:
方案一:从JDK中提取对应jar包
你可以从OpenJDK或Oracle JDK的jre/lib/ext/sunpkcs11.jar(不同JDK版本路径可能略有差异)里找到javax.smartcardio相关类,把这个jar复制出来添加到项目ClassPath即可。需要注意的是,这个jar属于JDK内部组件,不同版本的兼容性需要自行验证。方案二:引入第三方兼容依赖
有开源项目专门做了该包的独立分发,适配ClassPath场景。你可以在Maven仓库中搜索org.glavo.smartcardio这个依赖,直接添加到项目的依赖管理中,不用处理任何模块相关配置,就能像之前一样使用javax.smartcardio下的类。方案三:通过JVM参数开启模块的ClassPath兼容
如果你不想额外引入依赖,也可以在启动JVM时添加参数:--add-modules java.smartcardio,同时配合--class-path指定项目的ClassPath。这样JVM会把java.smartcardio模块里的类暴露到ClassPath中,项目就能直接调用相关API了。
补充说明:你在Java EE仓库找不到这个包,是因为它本质不属于Java EE规范范畴,而是JDK原生提供的智能卡交互工具包,所以没有被迁移到外部Java EE仓库中。
内容的提问来源于stack exchange,提问作者spellsleeper




