maven jar包冲突导致java mail报空指针异常问题的解决过程

简介:

   目前手头在做一个采用邮件回复的方式对工作流进行审批的项目。之前一篇博文对思路做了简单描述。项目开发完成在本地进行测试的时候完成没有问题。但在进入待发布环境交测试组测试时,却一直报错。远程调试发现如下代码报空指针异常:

1
2
3
4
5
   try {
             IMAPStore store = (IMAPStore) session.getStore( "imap" );  // 使用imap会话机制,连接服务器  
             store.connect(user, password);  
             IMAPFolder folder = (IMAPFolder) store.getFolder( "INBOX" );  // 收件箱  error
             folder.open(Folder.READ_WRITE);

   标记error的行报空指针,打印异常栈:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Exception in thread "main" java.lang.NullPointerException
at javax.mail.internet.ParameterList.set(ParameterList.java:165)
at com.sun.mail.imap.protocol.BODYSTRUCTURE.parseParameters(BODYSTRUCTURE.java:404)
at com.sun.mail.imap.protocol.BODYSTRUCTURE.< init >(BODYSTRUCTURE.java:224)
at com.sun.mail.imap.protocol.BODYSTRUCTURE.< init >(BODYSTRUCTURE.java:109)
at com.sun.mail.imap.protocol.FetchResponse.parse(FetchResponse.java:158)
at com.sun.mail.imap.protocol.FetchResponse.< init >(FetchResponse.java:67)
at com.sun.mail.imap.protocol.IMAPResponse.readResponse(IMAPResponse.java:136)
at com.sun.mail.imap.protocol.IMAPProtocol.readResponse(IMAPProtocol.java:270)
at com.sun.mail.iap.Protocol.command(Protocol.java:313)
at com.sun.mail.imap.protocol.IMAPProtocol.fetch(IMAPProtocol.java:1529)
at com.sun.mail.imap.protocol.IMAPProtocol.fetch(IMAPProtocol.java:1521)
at com.sun.mail.imap.protocol.IMAPProtocol.fetchBodyStructure(IMAPProtocol.java:1221)
at com.sun.mail.imap.IMAPMessage.loadBODYSTRUCTURE(IMAPMessage.java:1307)
at com.sun.mail.imap.IMAPMessage.getDataHandler(IMAPMessage.java:623)
at javax.mail.internet.MimeMessage.getContent(MimeMessage.java:927)
at a.Email3.main(Email3.java:71)

   反复远程和本地调试,未发现问题。

   网上对相关错误进行搜索,发现有几例相似:

tomcat使用javamail发送邮件失败解决办法

javamail报空指针异常

javaMail在Tomcat下收取邮件时报空指针错误;Jetty和mian运行正常

    针对几种思路,包括缺失jar包和代码不严谨或lib包冲突均作了尝试,未有效解决

    因怀疑lib包冲突可能性更大,在本地main进行测试,正常通过。将tomcat下所有lib全部导入本地test依赖,发现报错,巡查lib包,发现有geronimo-javamail_1.4_spec-1.3.jar包,嫌疑较大。删除该包,代码正常。由此,基本可判定系该包与javamail发生冲突,可能有同名class被先加载。

网上有对该冲突的解决方法的描述:

geronimo-javamail_1.4_spec-1.3.jar与mail.jar 冲突解决办法

   方法简单明了,即删除冲突的jar包。因本项目的管理使用maven,如不将根本问题解决,只删除jar包是徒劳的。所以以下尝试从根本上将依赖冲突解决。

   IDE中pom.xml全文检索该包,未发现有项目的直接依赖。因maven存在传递依赖,所以可判定是由项目的间接依赖导致。通过maven命令查看依赖树,方法如下:

        选中项目,右键->run as ,选择maven build ...,然后在对话框中的Goals项填入" dependency:tree",再在"debug output"打上勾,并将此项启动的名字改为"showDependency-tree",然后点击“Debug"/Run按钮, console里面会很详细地显示每个pom里面配置的依赖它们会带来哪些jar文件。

   因output巨长,下面仅作节选:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
[INFO] com.fx.oa:per-evaluation:jar:0.0.1-SNAPSHOT
[INFO] +- com.fx.fxplatform:fxplatform-shared:jar:1.0.0-SNAPSHOT:compile
[INFO] |  +- org.springframework:spring-beans:jar:3.1.2.RELEASE:compile
[INFO] |  |  \- org.springframework:spring-core:jar:3.1.2.RELEASE:compile
[INFO] |  +- org.springframework:spring-web:jar:3.1.2.RELEASE:compile
[INFO] |  |  +- aopalliance:aopalliance:jar:1.0:compile
[INFO] |  |  \- org.springframework:spring-context:jar:3.1.2.RELEASE:compile
[INFO] |  |     \- org.springframework:spring-aop:jar:3.1.2.RELEASE:compile
[INFO] |  +- org.springframework:spring-webmvc:jar:3.1.2.RELEASE:compile
[INFO] |  |  +- org.springframework:spring-asm:jar:3.1.2.RELEASE:compile
[INFO] |  |  +- org.springframework:spring-context-support:jar:3.1.2.RELEASE:compile
[INFO] |  |  \- org.springframework:spring-expression:jar:3.1.2.RELEASE:compile
[INFO] |  +- org.springframework:spring-test:jar:3.1.2.RELEASE:test (scope managed from compile)
[INFO] |  +- org.codehaus.jackson:jackson-mapper-asl:jar:1.9.12:compile
[INFO] |  |  \- org.codehaus.jackson:jackson-core-asl:jar:1.9.12:compile
[INFO] |  +- ognl:ognl:jar:3.0.6:compile
[INFO] |  +- javassist:javassist:jar:3.12.1.GA:compile
[INFO] |  +- log4j:log4j:jar:1.2.16:compile
[INFO] |  +- org.slf4j:slf4j-log4j12:jar:1.6.1:compile
[INFO] |  +- org.slf4j:slf4j-api:jar:1.6.1:compile
[INFO] |  +- org.apache.poi:poi:jar:3.8:compile
[INFO] |  |  \- commons-codec:commons-codec:jar:1.5:compile
[INFO] |  +- org.apache.poi:poi-ooxml:jar:3.8:compile
[INFO] |  |  \- dom4j:dom4j:jar:1.6.1:compile
[INFO] |  +- org.apache.poi:poi-ooxml-schemas:jar:3.8:compile
[INFO] |  |  \- org.apache.xmlbeans:xmlbeans:jar:2.3.0:compile
[INFO] |  |     \- stax:stax-api:jar:1.0.1:compile
[INFO] |  +- commons-beanutils:commons-beanutils:jar:1.8.3:compile
[INFO] |  |  \- commons-logging:commons-logging:jar:1.1.1:compile
[INFO] |  +- com.thoughtworks.xstream:xstream:jar:1.3.1:compile
[INFO] |  |  \- xpp3:xpp3_min:jar:1.1.4c:compile
[INFO] |  +- org.jasig.cas.client:cas-client-core:jar:3.2.1:compile
[INFO] |  +- com.caucho:hessian:jar:4.0.33:compile
[INFO] |  +- net.sourceforge.pinyin4j:pinyin4j:jar:2.5.0:compile
[INFO] |  +- org.freemarker:freemarker:jar:2.3.20:compile
[INFO] |  +- commons-lang:commons-lang:jar:2.5:compile
[INFO] |  +- javax.mail:mail:jar:1.4.1:compile
[INFO] |  \- velocity:velocity:jar:1.5:compile
[INFO] |     +- commons-collections:commons-collections:jar:3.1:compile
[INFO] |     \- oro:oro:jar:2.0.8:compile
[INFO] +- com.fx.fxplatform:fxplatform-server:jar:1.0.0-SNAPSHOT:compile
[INFO] |  +- com.fx.fxplatform:fxplatform-cache:jar:1.0.0-SNAPSHOT:compile
[INFO] |  |  +- com.fx.fxplatform:fxplatform-redis:jar:1.0.0-SNAPSHOT:compile
[INFO] |  |  |  \- com.alibaba:fastjson:jar:1.1.23:compile
[INFO] |  |  +- org.springframework.data:spring-data-mongodb:jar:1.1.0.RELEASE:compile
[INFO] |  |  |  +- org.springframework.data:spring-data-commons-core:jar:1.4.0.RELEASE:compile
[INFO] |  |  |  \- org.mongodb:mongo-java-driver:jar:2.9.1:compile
[INFO] |  |  +- jdom:jdom:jar:1.0:compile
[INFO] |  |  \- cglib:cglib-nodep:jar:2.2:compile
[INFO] |  +- org.mybatis:mybatis:jar:3.0.5:compile
[INFO] |  +- org.mybatis:mybatis-spring:jar:1.0.1:compile
[INFO] |  |  +- org.springframework:spring-tx:jar:3.0.5.RELEASE:compile
[INFO] |  |  \- org.springframework:spring-jdbc:jar:3.1.2.RELEASE:compile (version managed from 3.0.5.RELEASE)
[INFO] |  +- commons-fileupload:commons-fileupload:jar:1.2.1:compile
[INFO] |  +- javax.activation:activation:jar:1.1.1:compile
[INFO] |  +- org.apache.struts:struts2-core:jar:2.3.15.1:compile
[INFO] |  |  +- org.apache.struts.xwork:xwork-core:jar:2.3.15.1:compile
[INFO] |  |  |  +- asm:asm:jar:3.3:compile
[INFO] |  |  |  \- asm:asm-commons:jar:3.3:compile
[INFO] |  |  |     \- asm:asm-tree:jar:3.3:compile
[INFO] |  |  +- commons-io:commons-io:jar:2.0.1:compile
[INFO] |  |  \- com.sun:tools:jar:1.5.0:system
[INFO] |  +- org.apache.struts:struts2-spring-plugin:jar:2.3.15.1:compile
[INFO] |  |  \- org.apache.commons:commons-lang3:jar:3.1:compile
[INFO] |  +- org.apache.struts:struts2-convention-plugin:jar:2.3.15.1:compile
[INFO] |  +- org.apache.struts:struts2-json-plugin:jar:2.3.15.1:compile
[INFO] |  +- redis.clients:jedis:jar:2.1.0:compile
[INFO] |  |  \- commons-pool:commons-pool:jar:1.5.5:compile
[INFO] |  +- org.codehaus.groovy:groovy-all:jar:2.2.1:compile
[INFO] |  +- com.itextpdf:itextpdf:jar:5.4.5:compile
[INFO] |  +- com.itextpdf:itext-asian:jar:5.2.0:compile
[INFO] |  +- net.sf.json-lib:json-lib:jar:2.4:compile
[INFO] |  |  \- net.sf.ezmorph:ezmorph:jar:1.0.6:compile
[INFO] |  +- org.csource:org-csource:jar:1.24:compile
[INFO] |  +- org.quartz-scheduler:quartz:jar:1.8.6:compile
[INFO] |  +- org.springframework.data:spring-data-redis:jar:1.0.2.RELEASE:compile
[INFO] |  |  \- org.slf4j:jcl-over-slf4j:jar:1.6.6:compile
[INFO] |  \- org.apache.ant:ant:jar:1.7.0:compile
[INFO] |     \- org.apache.ant:ant-launcher:jar:1.7.0:compile
[INFO] +- com.fx.oa:sys-settings-api:jar:0.0.1-SNAPSHOT:compile
[INFO] |  \- com.fx.oa:oa-util:jar:0.0.1-SNAPSHOT:compile
[INFO] |     +- org.seleniumhq.selenium:selenium-java:jar:2.39.0:compile
[INFO] |     |  +- org.seleniumhq.selenium:selenium-android-driver:jar:2.39.0:compile
[INFO] |     |  |  \- org.seleniumhq.selenium:selenium-remote-driver:jar:2.39.0:compile
[INFO] |     |  |     +- org.json:json:jar:20080701:compile
[INFO] |     |  |     \- com.google.guava:guava:jar:15.0:compile
[INFO] |     |  +- org.seleniumhq.selenium:selenium-chrome-driver:jar:2.39.0:compile
[INFO] |     |  +- org.seleniumhq.selenium:selenium-htmlunit-driver:jar:2.39.0:compile
[INFO] |     |  |  +- net.sourceforge.htmlunit:htmlunit:jar:2.13:compile
[INFO] |     |  |  |  +- xalan:xalan:jar:2.7.1:compile
[INFO] |     |  |  |  |  \- xalan:serializer:jar:2.7.1:compile
[INFO] |     |  |  |  +- org.apache.httpcomponents:httpmime:jar:4.3.1:compile
[INFO] |     |  |  |  +- net.sourceforge.htmlunit:htmlunit-core-js:jar:2.13:compile
[INFO] |     |  |  |  +- xerces:xercesImpl:jar:2.11.0:compile
[INFO] |     |  |  |  +- net.sourceforge.nekohtml:nekohtml:jar:1.9.19:compile
[INFO] |     |  |  |  +- net.sourceforge.cssparser:cssparser:jar:0.9.11:compile
[INFO] |     |  |  |  |  \- org.w3c.css:sac:jar:1.3:compile
[INFO] |     |  |  |  \- org.eclipse.jetty:jetty-websocket:jar:8.1.12.v20130726:compile
[INFO] |     |  |  |     +- org.eclipse.jetty:jetty-util:jar:8.1.12.v20130726:compile
[INFO] |     |  |  |     +- org.eclipse.jetty:jetty-io:jar:8.1.12.v20130726:compile
[INFO] |     |  |  |     \- org.eclipse.jetty:jetty-http:jar:8.1.12.v20130726:compile
[INFO] |     |  |  \- org.apache.httpcomponents:httpclient:jar:4.3.1:compile
[INFO] |     |  |     \- org.apache.httpcomponents:httpcore:jar:4.3:compile
[INFO] |     |  +- org.seleniumhq.selenium:selenium-firefox-driver:jar:2.39.0:compile
[INFO] |     |  |  \- org.apache.commons:commons-exec:jar:1.1:compile
[INFO] |     |  +- org.seleniumhq.selenium:selenium-ie-driver:jar:2.39.0:compile
[INFO] |     |  |  +- net.java.dev.jna:jna:jar:3.4.0:compile
[INFO] |     |  |  \- net.java.dev.jna:platform:jar:3.4.0:compile
[INFO] |     |  +- org.seleniumhq.selenium:selenium-iphone-driver:jar:2.39.0:compile
[INFO] |     |  +- org.seleniumhq.selenium:selenium-safari-driver:jar:2.39.0:compile
[INFO] |     |  +- org.seleniumhq.selenium:selenium-support:jar:2.39.0:compile
[INFO] |     |  |  \- org.seleniumhq.selenium:selenium-api:jar:2.39.0:compile
[INFO] |     |  \- org.webbitserver:webbit:jar:0.4.14:compile
[INFO] |     |     \- io.netty:netty:jar:3.5.2.Final:compile
[INFO] |     \- xml-apis:xml-apis:jar:1.4.01:compile
[INFO] +- javax.servlet:servlet-api:jar:2.5:provided
[INFO] +- javax.servlet:jsp-api:jar:2.0:provided
[INFO] +- com.fx.oa:per-evaluation-api:jar:0.0.1-SNAPSHOT:compile
[INFO] |  \- com.fx.oa:com-dependence-api:jar:0.0.1-SNAPSHOT:compile
[INFO] |     +- com.fx.oa:oa-ldap:jar:0.0.1-SNAPSHOT:compile
[INFO] |     |  +- org.springframework:spring-aspects:jar:3.1.2.RELEASE:compile
[INFO] |     |  +- org.springframework:spring-instrument:jar:3.1.2.RELEASE:compile
[INFO] |     |  +- org.springframework.ldap:spring-ldap-core:jar:1.3.1.RELEASE:compile
[INFO] |     |  +- org.springframework.ldap:spring-ldap-core-tiger:jar:1.3.1.RELEASE:compile
[INFO] |     |  +- org.springframework.ldap:spring-ldap-odm:jar:1.3.1.RELEASE:compile
[INFO] |     |  |  \- commons-cli:commons-cli:jar:1.2:compile
[INFO] |     |  +- org.springframework.ldap:spring-ldap-ldif-core:jar:1.3.1.RELEASE:compile
[INFO] |     |  \- org.springframework.ldap:spring-ldap-ldif-batch:jar:1.3.1.RELEASE:compile
[INFO] |     |     +- org.springframework.batch:spring-batch-core:jar:2.0.3.RELEASE:compile
[INFO] |     |     |  \- org.codehaus.jettison:jettison:jar:1.0:compile
[INFO] |     |     \- org.springframework.batch:spring-batch-infrastructure:jar:2.0.3.RELEASE:compile
[INFO] |     +- com.fx.oa:sys-settings:jar:0.0.1-SNAPSHOT:compile
[INFO] |     \- com.fx.oa:per-jobgrade:jar:0.0.1-SNAPSHOT:compile
[INFO] |        \- com.fx.oa:per-jobgrade-api:jar:0.0.1-SNAPSHOT:compile
[INFO] +- c3p0:c3p0:jar:0.9.1.2:compile
[INFO] \- mysql:mysql-connector-java:jar:5.1.13:compile
[INFO]

   经对依赖树进行检索,发现有oa-workflow-interface下cxf-rt-frontend-jaxws的依赖eronimo-javamail_1.4_spec,於是根据maven的exclusion,排除传递依赖如下:

1
2
3
4
5
6
7
8
9
10
11
< dependency >
< groupId >org.apache.cxf</ groupId >
< artifactId >cxf-rt-frontend-jaxws</ artifactId >
< version >2.7.14</ version >
< exclusions >
< exclusion >
< groupId >org.apache.geronimo.specs</ groupId >
< artifactId >geronimo-javamail_1.4_spec</ artifactId >
</ exclusion >
</ exclusions >
</ dependency >

    打包后经测试不再出现上述问题


     本文转自 gaochaojs 51CTO博客,原文链接:http://blog.51cto.com/jncumter/1831183,如需转载请自行联系原作者


相关文章
|
1月前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
59 1
|
1月前
|
Java API 调度
如何避免 Java 中的 TimeoutException 异常
在Java中,`TimeoutException`通常发生在执行操作超过预设时间时。要避免此异常,可以优化代码逻辑,减少不必要的等待;合理设置超时时间,确保其足够完成正常操作;使用异步处理或线程池管理任务,提高程序响应性。
62 12
|
1月前
|
Java
在 Java 中,如何自定义`NumberFormatException`异常
在Java中,自定义`NumberFormatException`异常可以通过继承`IllegalArgumentException`类并重写其构造方法来实现。自定义异常类可以添加额外的错误信息或行为,以便更精确地处理特定的数字格式转换错误。
35 1
|
23天前
|
XML Java 测试技术
从零开始学 Maven:简化 Java 项目的构建与管理
Maven 是一个由 Apache 软件基金会开发的项目管理和构建自动化工具。它主要用在 Java 项目中,但也可以用于其他类型的项目。
36 1
从零开始学 Maven:简化 Java 项目的构建与管理
|
1月前
|
Java 测试技术 Maven
Maven clean 提示文件 java.io.IOException
在使用Maven进行项目打包时,遇到了`Failed to delete`错误,尝试手动删除目标文件也失败,提示`java.io.IOException`。经过分析,发现问题是由于`sys-info.log`文件被其他进程占用。解决方法是关闭IDEA和相关Java进程,清理隐藏的Java进程后重新尝试Maven clean操作。最终问题得以解决。总结:遇到此类问题时,可以通过任务管理器清理相关进程或重启电脑来解决。
|
1月前
|
IDE 前端开发 Java
怎样避免 Java 中的 NoSuchFieldError 异常
在Java中避免NoSuchFieldError异常的关键在于确保类路径下没有不同版本的类文件冲突,避免反射时使用不存在的字段,以及确保所有依赖库版本兼容。编译和运行时使用的类版本应保持一致。
66 7
|
1月前
|
Java 编译器
如何避免在 Java 中出现 NoSuchElementException 异常
在Java中,`NoSuchElementException`通常发生在使用迭代器、枚举或流等遍历集合时,尝试访问不存在的元素。为了避免该异常,可以在访问前检查是否有下一个元素(如使用`hasNext()`方法),或者使用`Optional`类处理可能为空的情况。正确管理集合边界和条件判断是关键。
71 6
|
1月前
|
Java 应用服务中间件 Maven
Maven的三种项目打包方式——pom,jar,war的区别
Maven 提供了多种打包方式,分别适用于不同类型的项目。pom 用于父项目或聚合项目,便于项目的结构和依赖管理;jar 用于Java类库或可执行的Java应用程序;war 则专用于Java Web应用程序的部署。理解这些打包方式的用途和特点,可以帮助开发者更好地配置和管理Maven项目,确保构建和部署过程的顺利进行。无论是单模块项目还是多模块项目,选择合适的打包方式对于项目的成功至关重要。
88 3
|
1月前
|
Java
Java异常捕捉处理和错误处理
Java异常捕捉处理和错误处理
64 1
|
1月前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
60 2
下一篇
DataWorks