gpt4 book ai didi

java - 是否可能/如何在 JAR 中嵌入和访问 HTML 文件?

转载 作者:搜寻专家 更新时间:2023-11-01 01:26:55 24 4
gpt4 key购买 nike

我现在有些受阻:我写了一个相当复杂的 Java 桌面应用程序(没有 Applet/Web 应用程序!),它有自己的“用户手册”。本手册由一些 HTML 和 JPG 文件组成。本手册显示在我使用 JEditorPane 的应用程序的“帮助菜单”中。

到目前为止一切顺利。只要我用 Eclipse 启动 Programm,这就非常有效。一旦我将部署版本创建为可运行的 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 中启动应用程序或作为包装的可执行文件或可运行的 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 文件/类路径中。 (只是为了使这一点更清楚)

最佳答案

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

截图

JEditorPane displaying Jar'd HTML

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

截图

enter image description here

关于java - 是否可能/如何在 JAR 中嵌入和访问 HTML 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18443315/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com