java.lang.ClassCastException: com.sun.mail.handlers.multipart_mixed 无法转换为 javax.activation.DataContentHandler
java.lang.ClassCastException: com.sun.mail.handlers.multipart_mixed cannot be cast to javax.activation.DataContentHandler
行part.writeTo(out);
抛出 java.lang.ClassCastException
:
com.sun.mail.handlers.multipart_mixed cannot be cast to 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
,所以应该是可以施法的。为什么不是?
每当子class 显然不能被类型转换为其合法的超级class,你有重复的classes,由不同的classloader 加载。找到你加载激活的位置(superclass)classes,除掉一个(通常你需要删除你自己的项目带来的那个class)并使用提供的一个来自框架。
Exception 消息命名了有问题的 classes 但忽略了参与游戏的 classloader,这就是为什么消息在第一次尝试理解它时并没有多大意义感觉。一旦您了解多个 class 加载器,即 javax.activation.DataContentHandler
的多个实例,它就更有意义了。
编辑:通过 build.gradle 中的 compileInclude
语句,您有效地将所有依赖项捆绑到您自己的 jar 文件中。但是框架有自己的这些 classes 版本,虽然它们都具有相同的名称,但它们现在将是不同的版本(不仅仅是数字),通过不同的 classloader 加载。如果您明显依赖于您在 OSGi 运行时中永远找不到的东西,您应该只使用 compileInclude
。相反,使用 compileOnly
或 compile
作为默认值,并将额外的依赖项与您的模块一起部署到运行时。
检查 this article 以获得您所做操作的详细描述。
行part.writeTo(out);
抛出 java.lang.ClassCastException
:
com.sun.mail.handlers.multipart_mixed cannot be cast to 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
,所以应该是可以施法的。为什么不是?
每当子class 显然不能被类型转换为其合法的超级class,你有重复的classes,由不同的classloader 加载。找到你加载激活的位置(superclass)classes,除掉一个(通常你需要删除你自己的项目带来的那个class)并使用提供的一个来自框架。
Exception 消息命名了有问题的 classes 但忽略了参与游戏的 classloader,这就是为什么消息在第一次尝试理解它时并没有多大意义感觉。一旦您了解多个 class 加载器,即 javax.activation.DataContentHandler
的多个实例,它就更有意义了。
编辑:通过 build.gradle 中的 compileInclude
语句,您有效地将所有依赖项捆绑到您自己的 jar 文件中。但是框架有自己的这些 classes 版本,虽然它们都具有相同的名称,但它们现在将是不同的版本(不仅仅是数字),通过不同的 classloader 加载。如果您明显依赖于您在 OSGi 运行时中永远找不到的东西,您应该只使用 compileInclude
。相反,使用 compileOnly
或 compile
作为默认值,并将额外的依赖项与您的模块一起部署到运行时。
检查 this article 以获得您所做操作的详细描述。