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

时间:2011-11-30 15:00:08

标签: java java-ee eclipse-plugin eclipse-rcp mime-types

我有一个使用MIME格式传递邮件的客户端/服务器系统。我使用JavaBeans激活框架创建了一些自定义mimetypes。

我创建了一个简单的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 Activation类无法看到我的自定义mime类型定义。

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

4 个答案:

答案 0 :(得分:0)

确保您的项目是插件项目,并确保build.properties将mailcap和mime.types检查为导出(打开清单并使用Build选项卡)。

答案 1 :(得分:0)

我意识到你提出这个问题已经有一段时间了,但无论如何......

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

首先,确保mailcapmime.types资源归尝试访问它们的同一插件所有。

其次,尝试使用explicit mime-type file specification构建MimetypesFileTypeMap。 从静态文件和绝对文件路径开始,例如/tmp/mime.types如果有效,那么你的问题就是资源加载了。在这种情况下,来自插件的get streamMimetypesFileTypeMap来自该{{1}}的广告。

答案 2 :(得分:0)

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

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

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

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

答案 3 :(得分:0)

来自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.   
  3. 用户主目录中的文件.mailcap。
  4.   
  5. 文件/ lib / mailcap。
  6.   
  7. 名为META-INF / mailcap。
  8. 的文件或资源   
  9. 名为META-INF / mailcap.default的文件或资源(通常仅在activation.jar文件中找到>)。
  10.   

从现在已经死亡的链接:

  

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); 
    }