如何向Eclipse RCP应用程序添加自定义MIME内容类型



我有一个使用MIME格式传递消息的客户机/服务器系统。我使用JavaBeans激活框架创建了一些自定义mime类型。

我创建了一个简单的java项目,如下所示:
my-mime
+- src/com/foo/FooContentHandler
+- META-INF/mailcap
+- META-INF/mime.types

mailcap:

application/x-foo; ; x-java-content-handler=com.foo.FooContentHandler

mime.types:

type=application/x-foo desc="foo" exts="foo"

我已经在一个独立的测试用例中演示了这一点。但是,当我将其作为插件添加时,MIME类型不会被拾取。我认为这是由于Java激活类无法看到我的自定义mime类型定义。

我如何将它们添加到我的包中以便它们被取走?

确保您的项目是一个插件项目,并确保构建。属性包含您的邮件帽和mime。类型检查为导出(打开清单并使用Build选项卡)。

我知道你问这个问题已经有一段时间了,但无论如何…

看起来您的RCP应用程序无法读取该文件。

首先,确保mailcapmime.types资源属于尝试访问它们的同一个插件。

其次,尝试用显式mime类型文件规范构建MimetypesFileTypeMap。从静态文件和绝对文件路径开始,例如/tmp/mime.types,如果这有效,那么你的问题确实是资源加载。在这种情况下,从插件获取流并使用该流构建MimetypesFileTypeMap

在我的项目我有两个RCP插件。其中一个包含Java Mail jar及其所有依赖项,包括activation.jar。另一个包含用于编写和发送邮件的自定义代码。

最初,我试图在第二个插件中使用MimetypesFileTypeMap,并使用类方法getContentType(String filename)识别MIME类型。mime.types文件放在插件的META-INF文件夹中。问题几乎是一样的。当RCP应用程序从IDE启动时,MIME类型识别工作完美,但当它作为导出RCP应用程序启动时失败。

但后来我发现Java邮件试图识别MIME类型,但本身,例如,附加文件到电子邮件。它使用它的依赖项activation.jar。之后,我需要解决如何强迫activation.jar在第一个插件的范围内找到正确的mime.types的问题。

但是我发现的唯一方法是重新包装activation.jar并在jar的META-INF文件夹中添加正确的mime.types。不幸的是,这个解决方案并不完美,因为它"入侵"了第三方库。

From https://docs.oracle.com/cd/E17802_01/j2se/javase/technologies/desktop/javabeans/glasgow/javadocs/javax/activation/MailcapCommandMap.html

Mailcap文件搜索顺序:MailcapCommandMap在用户系统的不同位置查找mailcap文件条目。当请求在MailcapCommandMap中搜索命令时,它按照以下顺序搜索mailcap文件:

  1. 以编程方式向MailcapCommandMap实例添加条目。
  2. 用户主目录中的.mailcap文件。
  3. 文件/lib/mailcap.
  4. META-INF/mailcap文件或资源
  5. 名为META-INF/mailcap.default的文件或资源(通常只在activation.jar文件中找到)。

从现已失效的链接:

JAF使用上下文类装入器来装入类。如果失败了,它使用装载JAF类的类装入器。

当JAF被打包到应用程序中时,JAF类是由与其他应用程序类相同的类装入器装入,因此,即使没有设置上下文类装入器,JAF也可以找到其他应用程序类。

当JAF是JDK的一部分时,JAF类由系统类装入器。如果不设置上下文类装入器,JAF没有办法找到合适的类装入器来装入应用程序类。

用程序设置MailcapCommandMap的一个例子是:

    static { // add handlers for main MIME types
            MailcapCommandMap mcap = new MailcapCommandMap(); 
            mcap.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain"); 
            mcap.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html"); 
            mcap.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
            mcap.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed; x-java-fallback-entry=true");
            mcap.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822"); 
            CommandMap.setDefaultCommandMap(mcap); 
    } 

最新更新