java - Big Sur 11.0.1 和 PC/SC 库的问题
问题描述
我对最新版本的 macOS (BigSur 11.0.1) 和库 PC/SC 有疑问;在 BigSur 程序使用该库之前工作正常,但更新后不再工作。我正在使用 java 版本 1.8.0_271
在代码中,我使用方法TerminalFactory.getDefaultType()
来获取终端工厂的默认类型。在更新之前我收到“PC/SC”,但在更新之后我没有收到。
如果我想用这条线强制连接到一个实例
TerminalFactory factory = TerminalFactory.getInstance("PC/SC", null);
它将返回以下错误:
java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: PC/SC, provider: SunPCSC, class: sun.security.smartcardio.SunPCSC$Factory)
at java.security.Provider$Service.newInstance(Provider.java:1711)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:243)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:190)
at javax.smartcardio.TerminalFactory.getInstance(TerminalFactory.java:245)
at prueba.Prueba.isConnected(Prueba.java:165)
at prueba.Prueba.main(Prueba.java:63)
Caused by: java.lang.UnsupportedOperationException: PC/SC not available on this platform
at sun.security.smartcardio.PCSC.checkAvailable(PCSC.java:46)
at sun.security.smartcardio.SunPCSC$Factory.<init>(SunPCSC.java:59)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.security.Provider$Service.newInstance(Provider.java:1703)
... 5 more
Caused by: java.io.IOException: No PC/SC library found on this system
at sun.security.smartcardio.PlatformPCSC.getLibraryName(PlatformPCSC.java:122)
at sun.security.smartcardio.PlatformPCSC.access$000(PlatformPCSC.java:43)
at sun.security.smartcardio.PlatformPCSC$1.run(PlatformPCSC.java:64)
at sun.security.smartcardio.PlatformPCSC$1.run(PlatformPCSC.java:60)
at java.security.AccessController.doPrivileged(Native Method)
at sun.security.smartcardio.PlatformPCSC.<clinit>(PlatformPCSC.java:60)
at sun.security.smartcardio.SunPCSC$Factory.<init>(SunPCSC.java:59)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.security.Provider$Service.newInstance(Provider.java:1703)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:243)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:190)
at javax.smartcardio.TerminalFactory.getInstance(TerminalFactory.java:245)
at javax.smartcardio.TerminalFactory.<clinit>(TerminalFactory.java:106)
at prueba.Prueba.isConnected(Prueba.java:164)
... 1 more
entro isConnected--2
Exception in thread "main" java.lang.NullPointerException
at prueba.Prueba.isConnected(Prueba.java:173)
at prueba.Prueba.main(Prueba.java:63)
我发现 Big Sur 去掉了库 PC/SC 并且无法安装它。
我不知道是否有人有同样的错误或已经修复它的人。
谢谢您的帮助。
解决方案
由于 macOS Big Sur 的变化,Java PC/SC 实现不再正常工作: https ://bugs.openjdk.java.net/browse/JDK-8255877
解决方法是设置系统属性:
sun.security.smartcardio.library=/System/Library/Frameworks/PCSC.framework/Versions/Current/PCSC
在尝试使用之前TerminalFactory
。
推荐阅读
- node.js - 如何解决 npm deprecation 安装错误
- python - 如何从现有表创建 django 类
- sql-server - 使用 Pivot 或 Unpivot 将值分配给特定列
- java - 将数据保存在 SQL 或服务器上
- c++ - 在 Objective 项目中混合使用 Swift 和 C++
- angularjs - 返回页面后将值设置为默认值
- c# - 在 C# 中创建类后,您必须做什么才能在代码中使用它?
- jquery-plugins - 我正在尝试将 Jquery Combo-Tree 插件集成到 Angular 6 应用程序中
- pentaho - Pentaho 报表设计器 - 区域设置日期格式的参数化(~环境设计时间 - 区域设置)
- gcc - gcc 中是否有一个编译标志来克服“错误:无效的存储类”?