You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mule ESB 3.9通过IMAP读取Azure托管Outlook邮件时遇StreamProvider错误

访问Azure托管Outlook邮件时出现StreamProvider缺失错误

错误日志

2023-10-24 20:58:30,087 [INFO] mail.test | Cron Job TokenValidityPoll Called
->-> Not provider of jakarta.mail.util.StreamProvider was found
     java.lang.IllegalStateException: Not provider of jakarta.mail.util.StreamProvider was found
            at jakarta.mail.util.FactoryFinder.find(FactoryFinder.java:61)
            at jakarta.mail.util.StreamProvider.provider(StreamProvider.java:199)
            at jakarta.mail.Session.<init>(Session.java:256)
        at jakarta.mail.Session.getInstance(Session.java:326)
        at com.test.AzureMailFetcher.imapAuthenticationAttempt(AzureMailFetcher.java:143)

出错代码(第143行标记)

private static Store imapAuthenticationAttempt(IAuthenticationResult result) throws MessagingException {
    String accessToken = result.accessToken();
    Properties props = new Properties();
    props.put("mail.imap.sasl.enable", "true");
    props.put("mail.imap.sasl.mechanisms", "XOAUTH2");
    props.put("mail.imap.auth.login.disable", "true");
    props.put("mail.imap.auth.plain.disable", "true");
    props.put("mail.imap.ssl.enable", "true");
    Session session = Session.getInstance(props); // This is line number 143 ***
    Store store = session.getStore("imap");

关键背景

  • 代码在普通Java程序中运行正常,仅作为Mule组件时触发错误,确认是库兼容性冲突导致,但无法定位具体冲突依赖。
  • 尝试过添加/移除部分依赖无效,曾试用Eclipse Angus库解决,但引发新问题已回退。
  • 使用JDK 1.8。

当前项目依赖

<dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>msal4j</artifactId>
            <version>1.13.8</version>
        </dependency>
    
    <dependency>
        <groupId>jakarta.mail</groupId>
        <artifactId>jakarta.mail-api</artifactId>
        <version>2.1.2</version>
        <exclusions>
            <exclusion>
                <artifactId>activation</artifactId>
                <groupId>jakarta.activation</groupId>
            </exclusion>
        </exclusions>           
    </dependency>
    <dependency>
       <groupId>com.sun.mail</groupId>
       <artifactId>jakarta.mail</artifactId>
       <version>2.0.1</version>
        <exclusions>
            <exclusion>
                <artifactId>activation</artifactId>
                <groupId>jakarta.activation</groupId>
            </exclusion>
        </exclusions>          
    </dependency>

解决方案建议

1. 统一Jakarta Mail版本并修复依赖缺失

当前jakarta.mail-api(2.1.2)与实现包com.sun.mail:jakarta.mail(2.0.1)版本不匹配,导致API与实现脱节,这是核心问题之一。JDK 1.8下建议使用兼容的版本组合:

  • 将API和实现包统一为2.0.1版本,避免版本不一致。
  • 移除对jakarta.activation的排除,显式添加对应版本的实现包,因为Jakarta Mail 2.x依赖该组件,Mule环境可能缺少此依赖导致类加载异常。

调整后的依赖:

<dependency>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>msal4j</artifactId>
    <version>1.13.8</version>
</dependency>

<dependency>
    <groupId>jakarta.mail</groupId>
    <artifactId>jakarta.mail-api</artifactId>
    <version>2.0.1</version>
</dependency>
<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>jakarta.mail</artifactId>
    <version>2.0.1</version>
</dependency>
<!-- 显式添加Jakarta Activation实现 -->
<dependency>
    <groupId>com.sun.activation</groupId>
    <artifactId>jakarta.activation</artifactId>
    <version>2.0.1</version>
</dependency>

2. 排查Mule容器类加载冲突

Mule自带类库可能与项目依赖的Jakarta Mail类发生冲突,需强制项目优先加载自身依赖:

  • 在Mule应用的pom.xml中添加Maven插件配置,确保依赖的Jakarta Mail包被优先加载:
<build>
    <plugins>
        <plugin>
            <groupId>org.mule.tools.maven</groupId>
            <artifactId>mule-maven-plugin</artifactId>
            <version>3.8.1</version> <!-- 匹配你的Mule版本 -->
            <configuration>
                <classifier>mule-application</classifier>
                <excludeMuleDependencies>false</excludeMuleDependencies>
                <additionalDependencies>
                    <dependency>
                        <groupId>com.sun.mail</groupId>
                        <artifactId>jakarta.mail</artifactId>
                        <version>2.0.1</version>
                        <scope>compile</scope>
                    </dependency>
                    <dependency>
                        <groupId>com.sun.activation</groupId>
                        <artifactId>jakarta.activation</artifactId>
                        <version>2.0.1</version>
                        <scope>compile</scope>
                    </dependency>
                </additionalDependencies>
            </configuration>
        </plugin>
    </plugins>
</build>
  • 检查Mule容器的lib目录,若存在旧版本的javax.mail或jakarta.mail相关jar包,需移除或替换为项目使用的版本。

3. 显式指定StreamProvider实现

如果类加载问题仍存在,可在代码中显式指定StreamProvider的实现类,绕过FactoryFinder的自动查找:

// 在创建Session前添加以下代码
System.setProperty("jakarta.mail.util.StreamProvider", "com.sun.mail.util.StreamProviderImpl");

Session session = Session.getInstance(props);

内容的提问来源于stack exchange,提问作者Mahesh A R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 20:25:37