代码之家  ›  专栏  ›  技术社区  ›  Ted Spradley

TomEE Plus 9.1-雅加达EE平台Maven项目-如何排除geronimo邮件jar

  •  0
  • Ted Spradley  · 技术社区  · 2 年前

    我有一个电子邮件类,它使用以下导入:

    import jakarta.activation.DataHandler;
    import jakarta.activation.DataSource;
    import jakarta.activation.FileDataSource;
    import jakarta.faces.context.FacesContext;
    import jakarta.mail.BodyPart;
    import jakarta.mail.Message;
    import jakarta.mail.MessagingException;
    import jakarta.mail.Multipart;
    import jakarta.mail.PasswordAuthentication;
    import jakarta.mail.Session;
    import jakarta.mail.Transport;
    import jakarta.mail.internet.AddressException;
    import jakarta.mail.internet.InternetAddress;
    import jakarta.mail.internet.MimeBodyPart;
    import jakarta.mail.internet.MimeMessage;
    import jakarta.mail.internet.MimeMultipart;
    

    这个类是在另一个项目的包中构建和测试的,我用它来构建和维护实用程序类。然后将包导出到一个jar中,以便在其他项目中使用。使用导出包的项目是在TomEE 9.1 Plus中运行的web项目。

    构建类的项目和使用类的TomEE web项目都使用相同的maven依赖项[如下]。

    <dependency>
        <groupId>jakarta.platform</groupId>
        <artifactId>jakarta.jakartaee-api</artifactId>
        <version>9.1.0</version>
    </dependency>   
    
    <dependency>
        <groupId>jakarta.mail</groupId>
        <artifactId>jakarta.mail-api</artifactId>
        <version>2.1.2</version>
    </dependency>
    
    <dependency>
        <groupId>org.eclipse.angus</groupId>
        <artifactId>angus-mail</artifactId>
        <version>2.0.1</version>
    </dependency>   
    
    <dependency>
        <groupId>jakarta.activation</groupId>
        <artifactId>jakarta.activation-api</artifactId>
        <version>2.1.2</version>
    </dependency>
    

    Email类的单元测试正确地执行了MimeMessages的构建和发送,所有选项(如附件)都按预期运行。

    问题是当在web项目中使用电子邮件类时。它不是编译或运行时异常。导出类中的方法在web项目中执行时不会出错。然而,当在web项目中执行这些方法时,TomEE指向一个jar geronimo-mail_2.1_spec-1.0.0-M1.jar,该jar包含jakarta.mail.internet.*类的实现。

    geronimo jar中的jakarta.mail.internet.MimeBodyPart.class使用一个DataHandler对象来构建一个电子邮件正文没有内容的MimeMessage。收到电子邮件时,正文为空白。

    有没有办法防止Tomcat使用geronimo邮件jar?我尝试过通过以下操作排除罐子,但没有成功:

    <dependency>
        <groupId>jakarta.activation</groupId>
        <artifactId>jakarta.activation-api</artifactId>
        <version>2.1.2</version>
        <exclusions>
            <exclusion>
                <groupId>org.apache.geronimo.mail</groupId>
                <artifactId>geronimo-mail_2.1_mail</artifactId>             
            </exclusion>
            <exclusion>
                <groupId>org.apache.geronimo.specs</groupId>
                <artifactId>geronimo-activation_2.0_spec</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.apache.geronimo.mail</groupId>
                <artifactId>geronimo-mail_2.1_provider</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.apache.geronimo.specs</groupId>
                <artifactId>geronimo-mail_2.1_spec</artifactId>             
            </exclusion>
        </exclusions>
    </dependency>
    

    并将jar作为依赖项包括在内,然后将作用域设置为“provided”。

    <dependency>
        <groupId>org.apache.geronimo.specs</groupId>
        <artifactId>geronimo-mail_2.1_spec</artifactId>
        <version>1.0.0-M1</version>
            <scope>provided</scope>
    </dependency>
    

    我还尝试将jakarta和angus邮件jar直接放在WEB项目的WEB-INF/lib文件夹中。

    我还尝试使用Eclipse的“配置构建路径”,浏览到Tomcatv10.0运行时,定位geronimo邮件规范和提供者jar,并输入**/*.class的排除模式。

    一切都没有成功。TomEE项目中的Email类仍然使用geronimo邮件jar中的类。

    有没有建议如何强制Tomcat打开正确的jar,其中包含来自maven依赖项的正确jakarta.mail实现?

    非常感谢。

    0 回复  |  直到 2 年前
        1
  •  2
  •   Eric    2 年前

    在这个问题上也有同样的问题。。。 我们使用的是“SimpleJavaMail”,它有一个在运行时通过geronimo覆盖的电子邮件依赖项(特别是在包含INLINE嵌入图像时)。

    简单的解决方案就是在TomEE-lib目录中破解与geronimo邮件相关的jar。SimpleJavaMail将带来Activation&雅加达邮件实施。 ***可能不是最优雅的解决方案,但它只是电子邮件。 https://www.simplejavamail.org/

    挖掘实现MimeMessage/DataHandler的重叠不值得花时间。