- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个独立的库(jar 文件),它被添加到应用程序服务器类路径以监控 JVM 中所有正在运行的应用程序并在出现问题时发送电子邮件。
jar 文件将所有依赖项捆绑在 jar 中(使用 maven-shade-plugin),包括 javamail jar 文件。
当 appserver 中的其他 web 应用程序之一将 javamail 作为依赖项时,我的 jar 文件中的 javamail 会发生一些依赖项冲突,我得到一个异常
MessagingException :javax.mail.NoSuchProviderException: No provider for smtp
知道我无法修改正在运行的应用程序,我该如何解决这个冲突。我只能控制我的 jar 文件。
编辑:
我通过 javamail API 进行了调试。我发现 javax.mail.Session 使用反射构造一个 com.sun.mail.smtp.SMTPTransport 类型的新对象并将两个参数传递给构造函数,而不是使用位于同一 jar 文件中的 SMTPTransport 它试图使用位于已部署应用程序之一中的其他 mail.jar 中的 SMTPTransport。
最佳答案
在 tomcat 7 中,默认情况下 web 应用程序将首先按以下顺序查找类:
来自其他 WAR 的类版本(在类/WEB-INF/lib 上)在另一个 WAR 中是不可见的。
能否让我们知道更多信息以帮助追踪问题:
独立库更详细地做了什么,它如何监控其他应用程序?
如何将独立库添加到服务器类路径?它是复制到 YOUR_SERVER_HOME/lib 上,还是通过 catalina.properties 的 shared.loader 或 common.loader 属性添加到服务器类路径的文件夹
每个 WAR 应用程序是否在 WEB-INF/lib 上提供它自己的邮件 jar,或者库是否作为 JNDI 资源在服务器级别发布,如提到的 here在安装 JavaMail 库
服务器中是否有任何应用程序未在我上面提到的默认类加载模式下运行,并且正在使用 delegate = true(这意味着它将首先在服务器上查看,然后才在 WAR 上查看)? here这是如何配置的,检查 context.xml 或 server.xml 中的 Resource 元素
一些可能的解决方案建议:
按照安装说明将 JavaMail 作为 JNDI 资源安装在 tomcat 7 上 here在 安装 JavaMail 库 部分。让所有应用程序都像 tomcat 文档中那样使用 JNDI 资源,并使用 shade 插件排除从独立库中删除 java 邮件。这将始终有效,并且是最受推荐的解决方案。
如果您使用的是 Java 7,请尝试使用 JHades对不同应用程序的类路径进行故障排除。您可以对重复类的 WAR 进行静态分析,或者查看给定类在运行时使用的版本是什么,还有哪些版本可用。
由于无法控制其他应用程序或其内容的部署设置、JNDI 的使用等,因此在所有环境和任何应用程序中都可以确保有效的解决方案是重构该工具,以便它不需要在服务器上安装 mail.jar。该工具可以将电子邮件请求写入文件或数据库表,部署在服务器上的另一个 WAR 将轮询表文件并发送邮件。或者调用 bash/bat 脚本,它本身在单独的 java 进程上发送电子邮件。
Dynatrace 等性能分析工具基于 JVM 代理并使用类似的机制,不需要在服务器级别引入库,代理收集数据并将其发送到收集进程,该收集进程将其存储在某处以供进一步分析, 处理如通过邮件发送告警等。
希望这会有所帮助,一般来说,我看不到有任何方法可以将库部署到 EE 服务器,并确保它们永远不会对不同服务器类型和不同应用程序类加载设置上的任何应用程序造成问题。
最好的办法可能是调整该工具,使其依赖于部署在服务器上的最少库,将其分解为单独的模块,仅在服务器上运行收集模块,或者研究替代方案,例如 Dynatrace。
关于java - 多个版本的 javamail jar 导致 NoSuchProviderException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19778327/
我正在尝试使用 Bouncy CaSTLe 作为 Maven 项目中的安全提供程序。它似乎在代码库的某些地方工作得很好,而且对某些人来说在任何地方都工作得很好。但是,如果我尝试这样的事情: publi
以下是我发送电子邮件的代码: Properties props = new Properties(); props.put("mail.smtp.host", host); p
我正在尝试使用log4j发送我的GWT项目的错误,但是我遇到了问题。 这是我添加到log4j.xml文件中的内容: 很简单,但是在尝试发送电
我已经对异常进行了研究并尝试了所有建议,但仍然不起作用!这是我的 pom.xml : 4.0.0 com.ambre pta pta war 1.0
我正在将一个旧的遗留应用程序从一台服务器迁移到另一台服务器,并重新安装 Java。我们有一个电子邮件应用程序,它从本地电子邮件目录读取电子邮件并进行处理。当我尝试运行该应用程序时,出现以下错误: su
我正在尝试编写一个 ECDSA java 算法来在 Android 手机中实现。使用 NFC 解析数据。这就是 write(id+"?"+nama+"?"+signature+"?"+saldo, m
我已经在我的机器上成功安装了加密库,所以安装后我在 jre\lib\security\java.security 中看到了这些行: security.provider.11=ru.CryptoPro.
我已经使用二维码实现了双重身份验证。我已经使用 GoogleAuth 完成了它图书馆。在我的本地环境中运行起来非常棒,但是当我在 WebSphere 8.5.5 上部署应用程序时,它会抛出此错误: j
我正在尝试设置我的 Java 项目以便能够发送电子邮件(通过 g-mail,如果它重要的话)并且每次我尝试时都收到“javax.mail.NoSuchProviderException:没有 smtp
我正在使用 AdvancedInstaller 9.8 将我的 javacode(网络应用程序)构建到安装程序。通常我的应用程序运行良好。使用 Advanced Installer 9.8 创建安装程
我有几个程序使用 SunMSCAPI 来读取需要 SSL 证书的网页。我的代码在 Windows XP(32 位)下工作,但在我全新安装的 Windows 7(64 位)下不起作用。这是一段代码: S
我在我的 Android 应用程序中使用以下代码发送电子邮件: m_properties = new Properties(); m_properties.put("mail.smtp
我有一个非常大的项目,有大量的依赖项,并且在尝试发送邮件时遇到以下异常: javax.mail.NoSuchProviderException: smtp 我知道代码有效,因为它是其他项目中使用的库的
我们有套接字应用程序,它会发送大量电子邮件。因此,我们决定向其中发送大量消息,这将触发电子邮件。最终我们看到电子邮件需要几个小时才能到达任何收件箱(gmail、hotmail 或 yahoo 等)。我
我正在尝试使用 Wildfly Swarm 构建一个现有的 JavaEE 项目,但我一直在我的一个库中遇到问题。它应该从服务器加载 PEM 格式的公钥并使用它来验证签名。但是,我不断得到这个: 201
当出现异常时,我使用 log4j 发送电子邮件。下面是我的 log4j 属性文件配置。 log4j.rootLogger=WARN, R, email log4j.appender.R=org.apa
我有一个独立的库(jar 文件),它被添加到应用程序服务器类路径以监控 JVM 中所有正在运行的应用程序并在出现问题时发送电子邮件。 jar 文件将所有依赖项捆绑在 jar 中(使用 maven-sh
我最近在我的公司接手了一项任务,该任务涉及实现目前在员工的 Windows 桌面上运行的应用程序,并将该代码迁移到办公室使用的 Unix 服务器。 该服务器还运行 IBM 的 websphere,其中
我正在尝试使用带有此代码的 apache james 发送电子邮件 public static void main(String[] args) { String user = "sumit"
我想发送邮件为用户重置密码,如果他忘记了密码,我会收到此错误: org.springframework.mail.MailSendException: Mail server connection f
我是一名优秀的程序员,十分优秀!