【问题标题】:Is it possible/how to embed and access HTML Files in a JAR?是否可以/如何在 JAR 中嵌入和访问 HTML 文件?
【发布时间】:2013-08-28 21:28:34
【问题描述】:

我现在有点受阻:我编写了一个非常复杂的 Java 桌面应用程序(不是 Applet/Web 应用程序!),它有自己的“用户手册”。本手册包含一些 HTML 和 JPG 文件。本手册使用 JEditorPane 显示在我的应用程序的“帮助菜单”中。

到目前为止一切顺利。只要我用 Eclipse 启动程序,这就会很好地工作。一旦我将部署版本创建为可运行的 jar(使用 launch4j 包装到 .exe 中),HTML“查看器”就无法显示用户手册(图像丢失)。

我明白为什么会发生这种情况,但我不知道如何解决/规避这个问题。

我的应用程序通过 getClass().getResource() 加载其资源(属性文件、图标等)。例子:

this.setIconImage(new ImageIcon(getClass().getResource("/images/dialog-question.png")).getImage());

stream = new BufferedInputStream(MABIUpdater.class.getResourceAsStream("/settings.properties"));

就像我之前说的,这确实很好用(从 Eclipse 中启动应用程序,或者作为包装的可执行文件或 runnable-jar。

所以我也尝试像这样访问我的 HTML“手册”:

File manual = new File(getClass().getResource("/manual/help.html").toURI());

jEditorPane.setPage(manual.toURI().toURL());

这实际上不起作用。通过 Eclipse 启动程序我看到了手册但缺少图像。通过 jar/exe 启动它,我得到一个空框架。

那么有什么“诀窍”来实现这一目标吗? 我想一个问题是 HTML 页面本身,因为它无法访问该 jar 中的链接图像。 这是一个非常小的示例,一个 HTML 文件不起作用(缺少图像):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html lang="de">
    <head>
        <title>Manual</title>
    </head>
    <body>
        <h1>Example: </h1>
        <p>fubar</p>
        <img style="display: block; text-align: center;" src="../manual/img/Shot01.png" width="666" height="644" border="0" alt="Bildtext">
        <p><a href=\"http://www.google.com/\">blablubb</a></p>
    </body>
</html>

我希望我的问题很清楚,并且有人有想法;)。

编辑: 所有必需的 HTML 文件和图像都在 JAR 文件/类路径中。 (只是为了更清楚)

【问题讨论】:

    标签: java html swing jar jeditorpane


    【解决方案1】:

    一旦有了 URI,您就可以将其转换为文件,然后再转换为 URI,然后再转换为 URL。只需将 URI 转换为 URL,您可能会获得更好的成功

    【讨论】:

      【解决方案2】:
      File manual = new File(getClass().getResource("/manual/help.html").toURI());
      

      这就是问题所在。 Java 无法从 创建File 对象

      将其保留为URL,并将其用于setPage(..)


      至于更普遍的问题。

      通过相对引用链接资源(例如 CSS 或图像)的 Jar 文件中的 HTML 可以正常工作。

      例如

      此示例从 Jar 加载 HTML(具有对图像的相对引用)。

      import javax.swing.*;
      import java.net.URL;
      
      class ShowHtml {
      
          public static void main(String[] args) {
              final String address =
                  "jar:http://pscode.org/jh/hs/object.jar!/popup_contents.html";
              SwingUtilities.invokeLater(new Runnable() {
                  public void run() {
                      try {
                          URL url = new URL(address);
                          JEditorPane jep = new JEditorPane(url);
                          JFrame f = new JFrame("Show HTML in Jar");
                          f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                          f.add(new JScrollPane(jep));
                          f.pack();
                          f.setSize(400,300);
                          f.setLocationByPlatform(true);
                          f.setVisible(true);
                      } catch(Exception e) {
                          e.printStackTrace();
                      }
                  }
              });
          }
      }
      

      截图

      HTML

      正在加载的 HTML。

      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
      <!--       
       *        Copyright (C) 1997  Sun Microsystems, Inc
       *                    All rights reserved.
       *          Notice of copyright on this source code 
       *          product does not indicate publication. 
       * 
       * RESTRICTED RIGHTS LEGEND: Use, duplication, or disclosure by 
       * the U.S. Government is subject to restrictions as set forth 
       * in subparagraph (c)(1)(ii) of the Rights in Technical Data
       * and Computer Software Clause at DFARS 252.227-7013 (Oct. 1988) 
       * and FAR 52.227-19 (c) (June 1987).
       *
       *    Sun Microsystems, Inc., 2550 Garcia Avenue,
       *    Mountain View, California 94043.
       *
      -->
      <HTML>
      <HEAD>
      <TITLE>
      Editing Project Attributes
      </TITLE>
      </HEAD>
      <BODY BGCOLOR="#ffffff">
      <IMG SRC="images/popup_icon.gif" width="24" height="24"> <b>Popup Window</b>
      <p>
      Popup windows appear near the location from which they are
      activated.  They are not contained in frames and thus
      cannot be resized or moved by the user.  Popups are
      dismissed by clicking anywhere in the help viewer.
      <p>
      Popup windows can be activated by clicking on a text object, 
      graphic object, or JComponent button.  All three examples are
      included in this demo.
      <p>
      <A HREF="popup_contents2.html">More...</A>
      </body>
      </html>
      

      例如2

      对于动态创建的 HTML,JRE可能使用类文件的位置作为 HTML 的假定位置。但是为了消除所有疑问,我们可以在head 中指定base 元素。

      import javax.swing.*;
      
      class HtmlUsingBase {
      
          public static void main(String[] args) {
              final String htmlContent =
                  "<html>" +
                  "<head>" +
                  "<base href='http://www.gravatar.com/'>" +
                  "</head>" +
                  "<body>" +
                  "<h1>Image path from BASE</h1>" +
                  "<img src='avatar/a1ab0af4997654345d7a9" +
                  "49877f8037e?s=128&d=identicon&r=PG'" +
                  " width='128' height='128'>" +
                  "</body>" +
                  "</html>";
              SwingUtilities.invokeLater(new Runnable() {
                  public void run() {
                      JLabel label = new JLabel(htmlContent);
                      JOptionPane.showMessageDialog(null, label);
                  }
              });
          }
      }
      

      截图

      【讨论】:

      • 哇,这很快,非常感谢,伙计们!两个答案都帮了我很多/解决了这个问题,但安德鲁汤普森的一个更详细,所以我选择了他的答案。不能投票,但因为我是新来的:(。
      • 很高兴我能帮上忙。 :)
      猜你喜欢
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      • 2012-03-20
      • 1970-01-01
      相关资源
      最近更新 更多