第part.writeTo(out);
行
引发java.lang.ClassCastException
:
com.sun.mail.handlers.multipart_mixed无法转换为javax.activation.DataContentHandler
private static void getBodyAsRFC822(
MimePart part, boolean ignoreHeaders, ByteArrayOutputStreamout) {
try {
out.reset();
if (ignoreHeaders) {
OutputStream os = MimeUtility.encode(out, part.getEncoding());
part.getDataHandler().writeTo(os);
os.close();
} else {
part.writeTo(out);
out.close();
}
}
catch (Exception e) {
_log.error(e);
}
}
这是我的build.gradle
compileOnly group: 'com.liferay', name: 'com.liferay.portal.instance.lifecycle', version: '2.0.0'
compileOnly group: "com.liferay.portal", name: "com.liferay.portal.kernel", version: "2.46.0"
compileOnly group: "org.osgi", name: "org.osgi.core", version: "6.0.0"
compileOnly group: "org.osgi", name: "org.osgi.service.component.annotations", version: "1.3.0"
compileInclude group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
compileInclude group: 'org.apache.mina', name: 'mina-core', version: '2.0.16'
compileInclude group: 'javax.mail', name: 'mail', version: '1.4'
compileInclude group: "javax.servlet", name: "servlet-api", version: "2.5"
但是multipart_mixed implements DataContentHandler
,因此它应该是可转换的。为什么不呢?
答案 0 :(得分:0)
每当显然无法将子类类型转换为其合法超类时,您就有重复的类,这些类由不同的类加载器加载。找到在何处加载激活(超类)类,消除除一个类(通常需要消除您自己的项目带来的一个类)之外的所有类,并使用框架中提供的一个。
Exception消息为所讨论的类命名,但省略了参与游戏的类加载器,这就是为什么该消息在初次尝试理解时没有多大意义。一旦您了解了多个类加载器,从而知道了javax.activation.DataContentHandler
的多个实例,就会更加有意义。
编辑:使用build.gradle中的compileInclude
语句,您可以将所有依赖项有效地捆绑到自己的jar文件中。但是该框架具有这些类的自己的版本,尽管它们都具有相同的名称,但是它们现在将是不同的版本(不仅是数字版本),并通过不同的类加载器加载。仅当您明显依赖于OSGi运行时中永远找不到的内容时,才应使用compileInclude
。相反,请默认使用compileOnly
或compile
,并将其他依赖项与模块一起部署到运行时。
检查this article,以详细了解您的工作。