java - Oracle 12.2 数据库上的 JavaMail 无法加载提供程序
问题描述
我在安装 Oracle Database 12.2 后尝试安装最新的 JavaMail。JavaMail 在以前的数据库服务器上运行良好。它不起作用,我无能为力。这是错误跟踪:
DEBUG: not loading system providers in <java.home>/lib
DEBUG: not loading optional custom providers file: /META-INF/javamail.providers
DEBUG: can't load default providers file/META-INF/javamail.default.providers
DEBUG: Tables of loaded providers
DEBUG: Providers Listed By Class Name: {}
DEBUG: Providers Listed By Protocol: {}
DEBUG: not loading optional address map file: /META-INF/javamail.address.map
Exception in thread "Root Thread" javax.mail.NoSuchProviderException: No
provider for imap
at javax.mail.Session.getProvider(Session.java:289)
at javax.mail.Session.getStore(Session.java:363)
at javax.mail.Session.getStore(Session.java:343)
at javax.mail.Session.getStore(Session.java:329)
at MailHandlerImpl.connectToServerSSL(MailHandler:453)
如您所见,它无法加载提供程序。我已经确定 JavaMail 文件夹中的 javax.mail.jar 文件实际上包含提供程序文件。
这是我所做的(我将公司名称更改为 CUSTOMER,将 Oracle 用户名更改为 OracleUser,否则这些是确切的陈述):
第 1 步:安装软件
安装的 Oracle 数据库 12.2
爪哇:
- 在 C:\Program Files\Java\jdk1.8.0_181 中安装 jdk1.8.0_181
- 已下载 Javamail 1.6.1
- 将 Javax.mail.jar 复制到 c:\JavaMail
- 下载了jaf-1.1.1
- 安装在 c:\jaf-1.1.1
环境变量:
- CLASSPATH .;C:\JavaMail\javax.mail.jar
- JAVA_HOME C:\Progra~1\Java\jdk1.8.0_181
- JAVAMAIL_JAR C:\JavaMail\javax.mail.jar
- LD_LIBRARY_PATH %JAVA_HOME%\lib
- ORACLE_HOME D:\app\Oracle\product\12.2.0\dbhome_1
- PATH .;C:\JavaMail;C:\Progra~1\Java\jdk1.8.0_181\bin;D:\app\Oracle\product\12.2.0\dbhome_1\bin;D:\app\Oracle\product\ 12.2.0\dbhome_1\opatch;D:\app\Oracle\product\12.2.0\dbhome_1\perl\bin;%SystemRoot%\system32;... 加上路径的其余部分
第 2 步:创建 ACL
为 SMTP 创建 ACL:
BEGIN DBMS_NETWORK_ACL_ADMIN.create_acl ( acl => 'mail_for_oracleuser.xml', description => 'Oracle User access to Customer email', principal => 'ORACLEUSER', is_grant => TRUE, privilege => 'connect', start_date => SYSTIMESTAMP, end_date => NULL); END; BEGIN DBMS_NETWORK_ACL_ADMIN.assign_acl ( acl => 'mail_for_oracleuser.xml', host => 'MAILSERVER.CUSTOMER.LOCAL', lower_port => 25, upper_port => NULL); END;
为 IMAP 创建 ACL
BEGIN DBMS_NETWORK_ACL_ADMIN.CREATE_ACL( acl => 'mail.xml', description => 'MAIL ACL', principal => 'ORACLEUSER', is_grant => true, privilege => 'connect'); DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE( acl => 'mail.xml', principal => 'ORACLEUSER', is_grant => true, privilege => 'resolve'); DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL( acl => 'mail.xml', host => 'mail.customer.org'); END; BEGIN DBMS_NETWORK_ACL_ADMIN.DROP_ACL( acl => '/sys/acls/customer_email_server_wallet.xml'); END; BEGIN dbms_network_acl_admin.create_acl( 'customer_email_server_wallet.xml', 'Customer Email Server SSL Wallet ACL', 'ORACLEUSER', TRUE, 'use-client-certificates'); dbms_network_acl_admin.assign_wallet_acl( 'customer_email_server_wallet.xml', 'file:d:/wallet'); END;
第 3 步:授予权限
call dbms_java.grant_permission('ORACLEUSER', 'SYS:java.net.SocketPermission', '10.10.80.10:143', 'connect,resolve' );
call dbms_java.grant_permission('ORACLEUSER', 'SYS:java.net.SocketPermission', '10.10.80.10:993', 'connect,resolve' );
call dbms_java.grant_permission('ORACLEUSER', 'SYS:java.net.SocketPermission', '10.10.80.21:143', 'connect,resolve');
call dbms_java.grant_permission('ORACLEUSER', 'SYS:java.net.SocketPermission', '10.10.80.21:993', 'connect,resolve');
call dbms_java.grant_permission('ORACLEUSER', 'SYS:java.net.SocketPermission', 'mail.customer.org', 'connect,resolve,send');
call dbms_java.grant_permission('ORACLEUSER', 'SYS:java.net.SocketPermission', 'MAIL.CUSTOMER.ORG', 'connect,resolve,send');
call dbms_java.grant_permission('ORACLEUSER', 'SYS:java.net.SocketPermission', 'mail.customer.org', 'resolve');
call dbms_java.grant_permission('ORACLEUSER', 'SYS:java.net.SocketPermission', '[https://mail.customer.org]', 'connect, resolve');
call dbms_java.grant_permission('ORACLEUSER', 'SYS:java.net.SocketPermission', '*', 'connect,resolve,send');
call dbms_java.grant_permission('ORACLEUSER', 'SYS:java.util.PropertyPermission', '*', 'read,write');
call dbms_java.grant_permission('ORACLEUSER', 'SYS:java.lang.RuntimePermission', 'getClassLoader','');
call dbms_java.grant_permission('ORACLEUSER', 'SYS:java.io.FilePermission', '*', 'read,write');
call dbms_java.grant_permission('ORACLEUSER', 'SYS:java.io.FilePermission', '*', 'execute');
call dbms_java.grant_permission('ORACLEUSER', 'SYS:java.io.FilePermission', 'c:\javamail\javax.mail.jar', 'read');
call dbms_java.grant_permission('ORACLEUSER', 'SYS:java.io.FilePermission', 'D:\app\Oracle\product\12.2.0\dbhome_1\lib\activation.jar', 'read');
call dbms_java.grant_permission('ORACLEUSER', 'SYS:java.io.FilePermission', 'C:\jaf-1.1.1\activation.jar', 'read');
call dbms_java.grant_permission('PUBLIC', 'SYS:java.io.FilePermission', 'c:\javamail\javax.mail.jar', 'read');
call dbms_java.grant_permission('PUBLIC', 'SYS:java.io.FilePermission', 'D:\app\Oracle\product\12.2.0\dbhome_1\lib\activation.jar', 'read');
call dbms_java.grant_permission('PUBLIC', 'SYS:java.io.FilePermission', 'C:\jaf-1.1.1\activation.jar', 'read');
编辑:我注意到activation.jar 没有在类路径中列出。我补充说,重新启动服务器并收到完全相同的结果。
解决方案
推荐阅读
- xml - 将 XML 转换为 CSV tensorflow 对象检测 api
- php - 通过将变量名作为字符串传递来调用变量
- javascript - 如何向我的 sequelize 模型添加一个约束,该模型需要匹配我的 postrgres 数据库中的现有表?
- r - 如何使 scale_fill_manual 使用十进制值?
- c# - 是否可以自动检测 Specflow 表中的类型?
- python - 如何从两个不同的列表中打印索引?即 [1, 2, 3] 和 [a, b, c] 变为 [(1, a), (2, b), (3, c)]
- c# - 如何在混合字符串中添加数字C#
- php - Wordpress DB 连接错误“该站点遇到技术问题。”
- ruby - 如何对带有集合的多个对象使用rails更新方法
- algorithm - 寻找线性递归(递归算法的)