Возможно ли / как встроить и получить доступ к файлам HTML в JAR?
Я сейчас несколько заблокирован: я написал довольно сложное Java Desktop App (без Applet/Web App!), которое имеет свое собственное "Руководство пользователя". Это руководство состоит из некоторых файлов HTML и JPG. Это руководство отображается в "Меню справки" в моем приложении с помощью JEditorPane.
Все идет нормально. Это работает очень хорошо, пока я запускаю Программу с Eclipse. Как только я создаю версию развертывания как исполняемый файл jar (который оборачивается в.exe с launch4j), HTML "Viewer" не может отобразить руководство пользователя (изображения отсутствуют).
Я понимаю, почему это происходит, но я понятия не имею, как это исправить / обойти.
Мое приложение загружает свои ресурсы (свойства "Файлы", "Иконки" и т. Д.) Через 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, потому что она не может получить доступ к связанным изображениям в этом банке. Вот действительно маленький пример 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-файле /classpath. (просто чтобы прояснить это)
2 ответа
File manual = new File(getClass().getResource("/manual/help.html").toURI());
Вот где это идет не так. Java не может создать File
объект из встроенного ресурса
Держите это как URL
и использовать это для setPage(..)
,
Что касается более общей проблемы.
HTML из файла Jar, который связывает ресурсы (например, CSS или изображения) с помощью относительных ссылок, будет работать очень хорошо.
НАПРИМЕР
Этот пример загружает HTML (который имеет относительную ссылку на изображение) из 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();
}
}
});
}
}
Скриншот
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>
EG 2
Для динамически создаваемого HTML JRE, вероятно, будет использовать местоположение файла класса в качестве предполагаемого местоположения HTML. Но чтобы убрать все сомнения, мы можем указать base
элемент в 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);
}
});
}
}
Скриншот
Получив URI, вы превращаете его в файл, а затем обратно в URI, а затем в URL. Вы можете добиться большего успеха, просто превратив URI в URL