2011-11-30 109 views
0

我有一个使用MIME格式传递消息的客户机/服务器系统。我使用JavaBeans激活框架创建了一些自定义mimetypes。如何将自定义MIME内容类型添加到Eclipse RCP应用程序

我已经创建了一个简单的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类型定义。

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

+0

你管理来解决这个问题? – ilya

回答

0

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

0

我知道它已经有一段时间,因为你问到这个问题,但无论如何...

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

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

其次,尝试使用explicit mime-type file specification构造MimetypesFileTypeMap。 从静态文件和绝对文件路径开始,例如/tmp/mime.types,如果这样做,那么你的问题确实是资源加载。在那种情况下,get stream从插件和construct您的MimetypesFileTypeMap与该流。

0

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

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

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

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

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. 用户主目录中的.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); 
    } 
相关问题