- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我现在有些受阻:我写了一个相当复杂的 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 无法从 embedded-resource 创建 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。
<!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>
对于动态创建的 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);
}
});
}
}
关于java - 是否可能/如何在 JAR 中嵌入和访问 HTML 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18443315/
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
PowerShell Web Access 允许您通过 Web 浏览器运行 PowerShell cmdlet。它显示了一个基于 Web 的控制台窗口。 有没有办法运行 cmdlet 而无需在控制台窗
我尝试在无需用户登录的情况下访问 Sharepoint 文件。 我可以通过以下任一方式获取访问 token 方法一: var client = new RestClient("https://logi
我目前正在尝试通过 Chrome 扩展程序访问 Google 服务。我的理解是,对于 JS 应用程序,Google 首选的身份验证机制是 OAuth。我的应用目前已成功通过 OAuth 向服务进行身份
假设我有纯抽象类 IHandler 和派生自它的类: class IHandler { public: virtual int process_input(char input) = 0; };
我有一个带有 ThymeLeaf 和 Dojo 的 Spring 应用程序,这给我带来了问题。当我从我的 HTML 文件中引用 CSS 文件时,它们在 Firebug 中显示为中止。但是,当我通过在地
这个问题已经有答案了: JavaScript property access: dot notation vs. brackets? (17 个回答) 已关闭 6 年前。 为什么这不起作用? func
我想将所有流量重定向到 https,只有 robot.txt 应该可以通过 http 访问。 是否可以为 robot.txt 文件创建异常(exception)? 我的 .htaccess 文件: R
我遇到了 LinkedIn OAuth2: "Unable to verify access token" 中描述的相同问题;但是,那里描述的解决方案并不能解决我的问题。 我能够成功请求访问 toke
问题 我有一个暴露给 *:8080 的 Docker 服务容器. 我无法通过 localhost:8080 访问容器. Chrome /curl无限期挂断。 但是如果我使用任何其他本地IP,我就可以访
我正在使用 Google 的 Oauth 2.0 来获取用户的 access_token,但我不知道如何将它与 imaplib 一起使用来访问收件箱。 最佳答案 下面是带有 oauth 2.0 的 I
我正在做 docker 入门指南:https://docs.docker.com/get-started/part3/#recap-and-cheat-sheet-optional docker-co
我正在尝试使用静态 IP 在 AKS 上创建一个 Web 应用程序,自然找到了一个带有 Nginx ingress controller in Azure's documentation 的解决方案。
这是我在名为 foo.js 的文件中的代码。 console.log('module.exports:', module.exports) console.log('module.id:', modu
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用 MGTwitterEngine"将 twitter 集成到我的应用程序中。它在 iOS 4.2 上运行良好。当我尝试从任何 iOS 5 设备访问 twitter 时,我遇到了身份验证 to
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用以下 API 列出我的 Facebook 好友。 https://graph.facebook.com/me/friends?access_token= ??? 我想知道访问 token 过
401 Unauthorized - Show headers - { "error": { "errors": [ { "domain": "global", "reas
我已经将我的 django 应用程序部署到 heroku 并使用 Amazon s3 存储桶存储静态文件,我发现从 s3 存储桶到 heroku 获取数据没有问题。但是,当我测试查看内容存储位置时,除
我是一名优秀的程序员,十分优秀!