首页 > 解决方案 > 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 步:安装软件

  1. 安装的 Oracle 数据库 12.2

  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
  3. 环境变量:

    • 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

  1. 为 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;
    
  2. 为 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 没有在类路径中列出。我补充说,重新启动服务器并收到完全相同的结果。

标签: javawindowsoraclejakarta-mailtls1.2

解决方案


推荐阅读