【问题标题】:How to add custom MIME content types to Eclipse RCP application如何将自定义 MIME 内容类型添加到 Eclipse RCP 应用程序
【发布时间】:2011-11-30 15:00:08
【问题描述】:

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

我创建了一个简单的 java 项目,内容如下:

my-mime
+- src/com/foo/FooContentHandler
+- META-INF/mailcap
+- META-INF/mime.types

邮箱:

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

mime.types:

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

我已经在一个独立的测试用例中证明了这一点。但是,当我将其添加为插件时,不会拾取 MIME 类型。我认为这是因为 Java Activation 类看不到我的自定义 mime 类型定义。

我怎样才能将它们添加到我的捆绑包中以便被拾取?

【问题讨论】:

  • 你解决了这个问题吗?

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-25
          • 1970-01-01
          • 1970-01-01
          • 2011-08-10
          • 2015-05-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多