Is it possible/how to embed and access HTML Files in a JAR?

前端 未结 2 1953
情歌与酒
情歌与酒 2020-11-29 12:39

i am somewhat blocked right now: i wrote a quite complex Java Desktop App (no Applet/Web App!) which has it\'s own \"user Manual\". This manual consists of some HTML and JPG

相关标签:
2条回答
  • 2020-11-29 13:09

    Once you have the URI you are turning it into a File and then back to a URI and then to a URL. You might have better success by simply turning the URI into a URL

    0 讨论(0)
  • 2020-11-29 13:19
    File manual = new File(getClass().getResource("/manual/help.html").toURI());
    

    That is where it goes wrong. Java cannot create a File object from an embedded-resource

    Keep it as an URL and use that for setPage(..).


    As to the more general problem.

    HTML from a Jar file that links resources (e.g. CSS or images) by relative references will work just fine.

    E.G.

    This example loads HTML (that has a relative reference to an image) from a Jar.

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

    Screenshot

    JEditorPane displaying Jar'd HTML

    HTML

    The HTML that is being loaded.

    <!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>
    

    E.G. 2

    For dynamically created HTML, the JRE will probably use the class file's location as the presumed location of the HTML. But to remove all doubt, we can specify the base element in the head.

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

    Screenshot

    enter image description here

    0 讨论(0)
提交回复
热议问题