大家晚上好
我正在做一个 jakarta ee 项目几天,但我陷入困境。
确实,我创建了一个 JavaMail Session,在我的项目中使用它在 Web 应用程序的启动和停止时发送邮件,但我想创建一个类来测试它是否可以工作,首先这里是代码:
package sn.edu.ugb.ipsl.appventevelo;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import jakarta.ejb.Singleton;
import jakarta.ejb.Startup;
import jakarta.mail.Message;
import jakarta.mail.MessagingException;
import jakarta.mail.Session;
import jakarta.mail.Transport;
import jakarta.mail.internet.InternetAddress;
import jakarta.mail.internet.MimeMessage;
@Singleton
@Startup
public class EmailSender {
@PostConstruct
public void init() {
EnvoyerEmail("[email protected]", "Mail de Test", "Eh bien! Suis le meilleur");
}
@Resource(lookup = "mail/AppVenteVeloMailSession")
private Session session;
public void EnvoyerEmail(String to, String objet, String contenu) {
Message message = new MimeMessage(session);
try {
message.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject(objet);
message.setText(contenu);
Transport.send(message);
System.out.println("###### Message envoyé avec succés");
} catch (MessagingException e) {
throw new RuntimeException("######## Erreur d'envoi!");
}
}
}
但是当我启动应用程序服务器时,它会生成错误。这是日志详细信息
Caused by: java.util.ServiceConfigurationError: jakarta.mail.Provider: com.sun.mail.imap.IMAPProvider not a subtype
at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:593)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1244)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1273)
at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1309)
at java.base/java.util.ServiceLoader$3.hasNext(ServiceLoader.java:1393)
at jakarta.mail.Session.loadProviders(Session.java:987)
at jakarta.mail.Session.<init>(Session.java:273)
at jakarta.mail.Session.getInstance(Session.java:309)
at org.glassfish.resources.mail.naming.MailNamingObjectFactory.getObjectInstance(MailNamingObjectFactory.java:58)
at java.naming/javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:342)
at com.sun.enterprise.naming.impl.SerialContext.getObjectInstance(SerialContext.java:877)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:834)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:257)
at java.naming/javax.naming.InitialContext.lookup(InitialContext.java:409)
at java.naming/javax.naming.InitialContext.lookup(InitialContext.java:409)
at org.glassfish.resourcebase.resources.naming.ResourceNamingService.lookup(ResourceNamingService.java:189)
at org.glassfish.resourcebase.resources.api.ResourceProxy.create(ResourceProxy.java:66)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:827)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:257)
at java.naming/javax.naming.InitialContext.lookup(InitialContext.java:409)
at java.naming/javax.naming.InitialContext.lookup(InitialContext.java:409)
at com.sun.enterprise.naming.util.JndiNamingObjectFactory.create(JndiNamingObjectFactory.java:74)
at com.sun.enterprise.naming.util.JndiInitializationNamingObjectFactory.create(JndiInitializationNamingObjectFactory.java:90)
at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:603)
at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:573)
at com.sun.enterprise.naming.impl.JavaURLContext.lambda$lookup$0(JavaURLContext.java:153)
at com.sun.enterprise.naming.impl.JavaURLContext.lookupOrCollectException(JavaURLContext.java:550)
at com.sun.enterprise.naming.impl.JavaURLContext.lookup(JavaURLContext.java:153)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:818)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:269)
at java.naming/javax.naming.InitialContext.lookup(InitialContext.java:413)
at java.naming/javax.naming.InitialContext.lookup(InitialContext.java:413)
at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:551)
at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl._inject(InjectionManagerImpl.java:493)
... 56 more
[2023-08-21T23:13:18.527542Z] [GF 7.0.5] [SEVERE] [NCLS-CORE-00026] [jakarta.enterprise.system.core] [tid: _ThreadID=48 _ThreadName=admin-listener(5)] [levelValue: 1000] [[
Exception during lifecycle processing
jakarta.ejb.EJBException: jakarta.ejb.CreateException: Initialization failed for Singleton EmailSender
at com.sun.ejb.containers.AbstractSingletonContainer$SingletonContextFactory.create(AbstractSingletonContainer.java:622)
at com.sun.ejb.containers.AbstractSingletonContainer.instantiateSingletonInstance(AbstractSingletonContainer.java:362)
at org.glassfish.ejb.startup.SingletonLifeCycleManager.initializeSingleton(SingletonLifeCycleManager.java:195)
at org.glassfish.ejb.startup.SingletonLifeCycleManager.initializeSingleton(SingletonLifeCycleManager.java:156)
at org.glassfish.ejb.startup.SingletonLifeCycleManager.doStartup(SingletonLifeCycleManager.java:134)
at org.glassfish.ejb.startup.EjbApplication.start(EjbApplication.java:137)
at org.glassfish.internal.data.EngineRef.start(EngineRef.java:97)
Caused by: java.util.ServiceConfigurationError: jakarta.mail.Provider: com.sun.mail.imap.IMAPProvider not a subtype
at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:593)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1244)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1273)
at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1309)
at java.base/java.util.ServiceLoader$3.hasNext(ServiceLoader.java:1393)
at jakarta.mail.Session.loadProviders(Session.java:987)
at jakarta.mail.Session.<init>(Session.java:273)
at jakarta.mail.Session.getInstance(Session.java:309)
at org.glassfish.resources.mail.naming.MailNamingObjectFactory.getObjectInstance(MailNamingObjectFactory.java:58)
at java.naming/javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:342)
at com.sun.enterprise.naming.impl.SerialContext.getObjectInstance(SerialContext.java:877)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:834)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:257)
at java.naming/javax.naming.InitialContext.lookup(InitialContext.java:409)
at java.naming/javax.naming.InitialContext.lookup(InitialContext.java:409)
at org.glassfish.resourcebase.resources.naming.ResourceNamingService.lookup(ResourceNamingService.java:189)
at org.glassfish.resourcebase.resources.api.ResourceProxy.create(ResourceProxy.java:66)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:827)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:257)
at java.naming/javax.naming.InitialContext.lookup(InitialContext.java:409)
at java.naming/javax.naming.InitialContext.lookup(InitialContext.java:409)
at com.sun.enterprise.naming.util.JndiNamingObjectFactory.create(JndiNamingObjectFactory.java:74)
at com.sun.enterprise.naming.util.JndiInitializationNamingObjectFactory.create(JndiInitializationNamingObjectFactory.java:90)
at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:603)
at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:573)
at com.sun.enterprise.naming.impl.JavaURLContext.lambda$lookup$0(JavaURLContext.java:153)
at com.sun.enterprise.naming.impl.JavaURLContext.lookupOrCollectException(JavaURLContext.java:550)
at com.sun.enterprise.naming.impl.JavaURLContext.lookup(JavaURLContext.java:153)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:818)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:269)
at java.naming/javax.naming.InitialContext.lookup(InitialContext.java:413)
at java.naming/javax.naming.InitialContext.lookup(InitialContext.java:413)
at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:551)
at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl._inject(InjectionManagerImpl.java:493)
... 56 more
[2023-08-21T23:13:18.530532Z] [GF 7.0.5] [SEVERE] [] [jakarta.enterprise.system.core] [tid: _ThreadID=48 _ThreadName=admin-listener(5)] [levelValue: 1000] [[
Exception while loading the app]]
[2023-08-21T23:13:18.648764Z] [GF 7.0.5] [SEVERE] [AS-WEB-GLUE-00192] [jakarta.enterprise.web] [tid: _ThreadID=48 _ThreadName=admin-listener(5)] [levelValue: 1000] [[
Undeployment failed for context /AppVenteVelo-1.0-SNAPSHOT]]
[2023-08-21T23:13:18.699150Z] [GF 7.0.5] [SEVERE] [] [jakarta.enterprise.system.core] [tid: _ThreadID=48 _ThreadName=admin-listener(5)] [levelValue: 1000] [[
Exception while loading the app : jakarta.ejb.CreateException: Initialization failed for Singleton EmailSender
jakarta.ejb.CreateException: Initialization failed for Singleton EmailSender
at com.sun.ejb.containers.AbstractSingletonContainer.createSingletonEJB(AbstractSingletonContainer.java:450)
at com.sun.ejb.containers.AbstractSingletonContainer$SingletonContextFactory.create(AbstractSingletonContainer.java:620)
at com.sun.ejb.containers.AbstractSingletonContainer.instantiateSingletonInstance(AbstractSingletonContainer.java:362)
at org.glassfish.ejb.startup.SingletonLifeCycleManager.initializeSingleton(SingletonLifeCycleManager.java:195)
at org.glassfish.ejb.startup.SingletonLifeCycleManager.initializeSingleton(SingletonLifeCycleManager.java:156)
at org.glassfish.ejb.startup.SingletonLifeCycleManager.doStartup(SingletonLifeCycleManager.java:134)
at org.glassfish.ejb.startup.EjbApplication.start(EjbApplication.java:137)
at org.glassfish.internal.data.EngineRef.start(EngineRef.java:97)
Caused by: java.util.ServiceConfigurationError: jakarta.mail.Provider: com.sun.mail.imap.IMAPProvider not a subtype
at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:593)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1244)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1273)
at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1309)
at java.base/java.util.ServiceLoader$3.hasNext(ServiceLoader.java:1393)
at jakarta.mail.Session.loadProviders(Session.java:987)
at jakarta.mail.Session.<init>(Session.java:273)
at jakarta.mail.Session.getInstance(Session.java:309)
at org.glassfish.resources.mail.naming.MailNamingObjectFactory.getObjectInstance(MailNamingObjectFactory.java:58)
at java.naming/javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:342)
at com.sun.enterprise.naming.impl.SerialContext.getObjectInstance(SerialContext.java:877)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:834)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:257)
at java.naming/javax.naming.InitialContext.lookup(InitialContext.java:409)
at java.naming/javax.naming.InitialContext.lookup(InitialContext.java:409)
at org.glassfish.resourcebase.resources.naming.ResourceNamingService.lookup(ResourceNamingService.java:189)
at org.glassfish.resourcebase.resources.api.ResourceProxy.create(ResourceProxy.java:66)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:827)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:257)
at java.naming/javax.naming.InitialContext.lookup(InitialContext.java:409)
at java.naming/javax.naming.InitialContext.lookup(InitialContext.java:409)
at com.sun.enterprise.naming.util.JndiNamingObjectFactory.create(JndiNamingObjectFactory.java:74)
at com.sun.enterprise.naming.util.JndiInitializationNamingObjectFactory.create(JndiInitializationNamingObjectFactory.java:90)
at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:603)
at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:573)
at com.sun.enterprise.naming.impl.JavaURLContext.lambda$lookup$0(JavaURLContext.java:153)
at com.sun.enterprise.naming.impl.JavaURLContext.lookupOrCollectException(JavaURLContext.java:550)
at com.sun.enterprise.naming.impl.JavaURLContext.lookup(JavaURLContext.java:153)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:818)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:269)
at java.naming/javax.naming.InitialContext.lookup(InitialContext.java:413)
at java.naming/javax.naming.InitialContext.lookup(InitialContext.java:413)
at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:551)
at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl._inject(InjectionManagerImpl.java:493)
... 56 more
我真的需要你的帮助,我尝试过但没有成功!
提前致谢!
您遇到的错误似乎与 Jakarta Mail(以前称为 JavaMail)库及其与 Jakarta EE (Java EE) 环境的兼容性有关。错误消息
jakarta.mail.Provider: com.sun.mail.imap.IMAPProvider not a subtype
表明不同版本的 Jakarta Mail 库之间可能不匹配。
您可以采取以下一些步骤来解决此问题:
查看雅加达邮件版本: 确保您使用的 Jakarta Mail 库版本与 Jakarta EE 兼容。从 Jakarta EE 9 开始,使用 Jakarta Mail 代替 JavaMail。确保您已相应更新您的依赖项。
删除旧版 JavaMail 依赖项: 如果您的项目中有任何旧的 JavaMail 库,请确保将它们从类路径中删除。同时拥有 Jakarta Mail 和 JavaMail 库可能会导致兼容性问题。
更新依赖项: 确保您的 Jakarta Mail 依赖项是最新的。您可以检查 Jakarta Mail 的最新版本并相应地更新您的
pom.xml
或其他依赖管理文件。
清洁和重建: 对依赖项进行更改后,对项目执行全新构建,以确保没有旧的或冲突的库导致问题。
检查资源配置: 错误消息提到邮件会话的资源查找中出现的问题。仔细检查 Jakarta EE 环境中的资源配置。确保资源引用名称 (
mail/AppVenteVeloMailSession
) 定义正确。
服务器配置: 检查您的 Jakarta EE 服务器的配置,以确保它没有提供可能与您的应用程序的依赖项发生冲突的自己版本的 Jakarta Mail 库。
图书馆范围: 确保 Jakarta Mail 依赖项的范围设置正确。例如,如果您的服务器提供实现,则依赖项可能应标记为
provided
或 runtime
范围,而不是 compile
。
尝试显式设置提供程序: 如果您仍然遇到问题,可以尝试在代码中显式指定 Jakarta Mail 提供商。在发送消息之前添加以下行:
Properties props = new Properties();
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.host", "your-smtp-host");
props.put("mail.smtp.port", "your-smtp-port");
session = Session.getInstance(props, null);
将
"your-smtp-host"
和 "your-smtp-port"
替换为 SMTP 服务器的主机和端口信息。
Jakarta EE 版本兼容性: 确保您的 Jakarta EE 版本和 Jakarta Mail (JavaMail) 版本兼容。请参阅 Jakarta EE 和 Jakarta Mail 库的文档和兼容性矩阵。
请记住,兼容性和依赖关系有时可能很棘手,确保您使用能够很好地协同工作的正确版本的库非常重要。