Загрузка ресурсов с помощью апплета .jar

Я сделал простой апплет, который загружает изображение, включенное в .jar-файл, который я сделал. В проекте есть один пакет с именем «kap12» и один класс с именем «U1». У меня есть одна папка с именем «resrc», где находится мое изображение. Эта папка находится в корне (та же папка, что и kap12).

Это структура каталогов:

test.jar
   *kap12
      -U1.class
   *resrc
      -django.jpg

test.html //outside the .jar, same folder as where test.jar is located

Эта программа отлично работает, когда я запускаю ее в Eclipse с Appletviewer (без .jar). Он находит изображение и показывает его. Но когда я запускаю его в html с .jar, программа не может его найти. Я получаю исключение нулевого указателя каждый раз. Вот мой .html:

<HTML>
<HEAD>
</HEAD>
<TITLE> U1 </TITLE>
<BODY BGCOLOR="EEEEEE">
<CENTER>
<P ALIGN=CENTER>
<APPLET code="kap12/U1.class"
archive="test.jar"
width="1280"
height="720">
</APPLET>
</P>
</CENTER>
</BODY>
</HTML>

А вот мой SSCCE:

package kap12;

import java.awt.FlowLayout;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JApplet;
import javax.swing.JLabel;

public class U1 extends JApplet {

JLabel lbl0;
JLabel img0;
URL imgURL;

ImageIcon django = createImageIcon("resrc/django.jpg");

public void init() {

    setLayout(new FlowLayout());
    lbl0 = new JLabel("Test");
    img0 = new JLabel(django);      
    getContentPane().add(img0);
    getContentPane().add(lbl0);
    img0.setVisible(true);
}

/** Returns an ImageIcon, or null if the path was invalid. */
protected static ImageIcon createImageIcon(String path) {
    java.net.URL imgURL = U1.class.getClassLoader().getResource(path);
    if (imgURL != null) {
        System.out.println(""+imgURL);
        return new ImageIcon(imgURL);
    } else {
        System.err.println("Couldn't find file: " + path);
        return null;
    }
}
}

Я тестировал с помощью getClass() и getClass().getClassLoader(). Я протестировал запись "/resrc/django.jpg" в пути String. Я тестировал с .jar и без него. Я протестировал добавление папки resrc в папку пакета kap12. Вроде все перепробовал. Я потратил дни, пытаясь заставить это работать.

Что я должен написать? Я читал много тем об этом здесь, в StackOverflow, но безуспешно. Спасибо.

Обновление: я проверил все, что вы написали, Эндрю, но все равно не нашел.

Это то, что я получил от -tvf:

C:\Program\Java\jdk1.7.0_40\bin>jar -tvf D:\Path\test.jar 25 пн 20 янв 14:48:14 CET 2014 META-INF/MANIFEST.MF 2035 пн 20 янв 14:48 :04 CET 2014 pkg/U1.class 496057 Вс 03 фев 15:25:06 CET 2013 resrc/django.jpg


person Kalekulan    schedule 16.01.2014    source источник
comment
Какой именно проблемный метод выдает NPE? Не могли бы вы опубликовать трассировку стека?   -  person Martín Schonaker    schedule 16.01.2014
comment
Не знаю, как увидеть трассировку стека, когда она находится в веб-браузере.   -  person Kalekulan    schedule 16.01.2014


Ответы (1)


ImageIcon django = createImageIcon("resrc/django.jpg");

Должно быть:

ImageIcon django = createImageIcon("/resrc/django.jpg");

Обновлять

Точно не знаю, как это сделать, но я убил «Java SE» из диспетчера задач, затем удалил старый файл .jar. У меня есть JOptionPane.showMessageDialog, в котором говорится, что содержит «Путь к строке», и, похоже, он обновляется нормально.

Хорошо, «обновления в порядке» — важная часть. Сделайте то же самое для каждого теста.

Только что заметил более тонкие детали метода загрузки:

protected static ImageIcon createImageIcon(String path) {
    java.net.URL imgURL = U1.class.getClassLoader().getResource(path);

Безопаснее было бы:

protected ImageIcon createImageIcon(String path) {
    java.net.URL imgURL = this.getClass().getResource(path);

Я знаю, что строка, которую я указал, работает для «загрузчика классов контекста», но ее нельзя вызвать из метода static.


Если это по-прежнему не работает, перейдите в командную строку (например, в командную строку Windows или консоль Linux/Unix) и предоставьте вывод:

> jar -tvf path/to/the/test.jar
person Andrew Thompson    schedule 16.01.2014
comment
Я тестировал: ImageIcon django = createImageIcon(/resrc/django.jpg); ImageIcon django = createImageIcon(resrc/django.jpg); Как с getResource(), так и с getClassLoader().getResource(). Он не может найти изображение. - person Kalekulan; 16.01.2014
comment
Точно не знаю, как это сделать, но я убил Java SE из диспетчера задач, затем удалил старый .jar-файл. У меня есть JOptionPane.showMessageDialog, в котором говорится, что содержит путь String, и, похоже, он обновляется нормально. - person Kalekulan; 16.01.2014