Не удается прочитать изображение в файле jar
когда я создаю файл jar и запускаю его, он показывает исключение нулевого указателя из-за не найденного imageicon
new ImageIcon(getClass().getClassLoader().getResource("icons/exit.png")));
это ошибка, которую я получаю, когда я запускаю файл jar
Exception in thread "main" java.lang.NullPointerException
at javax.swing.ImageIcon.<init>(Unknown Source)
at mediaplayer.MediaPlayer.buildtoolbar(MediaPlayer.java:130)
at mediaplayer.MediaPlayer.<init>(MediaPlayer.java:81)
at mediaplayer.MediaPlayer.main(MediaPlayer.java:464)
Но когда я запускаю проект в NetBeans, его хорошая работа
Это результат, когда я перечисляю все файлы внутри моей jar
META-INF/
META-INF/MANIFEST.MF
helliker/
helliker/id3/
icons/
mediaplayer/
Thumbs.db
exit.png
ff1.png
helliker/id3/BinaryParser.class
helliker/id3/CorruptHeaderException.class
helliker/id3/ID3Exception.class
helliker/id3/ID3FieldDataException.class
helliker/id3/ID3Tag.class
helliker/id3/ID3v1Tag.class
helliker/id3/ID3v2ExtendedHeader.class
helliker/id3/ID3v2Footer.class
helliker/id3/ID3v2FormatException.class
helliker/id3/ID3v2Frame.class
helliker/id3/ID3v2Frames.class
helliker/id3/ID3v2Header.class
helliker/id3/ID3v2Tag.class
helliker/id3/MP3Comparator.class
helliker/id3/MP3File.class
helliker/id3/MP3FileFilter.class
helliker/id3/MPEGAudioFrameHeader.class
helliker/id3/NoMPEGFramesException.class
helliker/id3/NullsoftID3GenreTable.class
helliker/id3/Playlist.class
helliker/id3/PlaylistException.class
helliker/id3/XingVBRHeader.class
icons/Thumbs.db
icons/exit.png
icons/ff1.png
icons/label.jpg
icons/openpl.gif
icons/pause1.png
icons/play1.png
icons/playlist.png
icons/rr.png
icons/rr1.PNG
icons/stop.png
label.jpg
mediaplayer/MediaPlayer$1.class
mediaplayer/MediaPlayer$PlaylistFilter.class
mediaplayer/MediaPlayer.class
mediaplayer/PlaylistManager$1.class
mediaplayer/PlaylistManager$MP3Filter.class
mediaplayer/PlaylistManager$PlaylistFilter.class
mediaplayer/PlaylistManager.class
mediaplayer/Settings.class
mediaplayer/TagEditor.class
mediaplayer/Thumbs.db
openpl.gif
pause1.png
play1.png
playlist.png
rr.png
rr1.PNG
Ответы
Ответ 1
В вопросе отсутствует какая-то информация о том, как файл jar фактически создан, но со следующим макетом
├── bin
│ ├── com
│ │ └── example
│ │ └── ImageIconTest.class
│ └── icons
│ └── exit.png
└── src
├── MANIFEST.MF
└── com
└── example
└── ImageIconTest.java
и следующий код в ImageIconTest.java
package com.example;
import javax.swing.ImageIcon;
public class ImageIconTest {
public void run() {
ImageIcon ii = new ImageIcon(getClass().getClassLoader().getResource("icons/exit.png"));
System.out.println(ii);
}
public static void main(String[] args) {
ImageIconTest app = new ImageIconTest();
app.run();
}
}
вы можете правильно запустить образец из файловой системы с помощью
$ java -classpath bin com.example.ImageIconTest
Используя файл MANIFEST.MF со следующим содержимым:
Manifest-Version: 1.0
Main-Class: com.example.ImageIconTest
вы можете упаковать его в исполняемый файл jar и запустить его из файла jar:
$ jar cvfm app.jar src/MANIFEST.MF -C bin .
$ java -jar app.jar
Оба подхода работают нормально, важная деталь - убедиться, что каталог значков включен в файл jar в нужном месте.
При перечислении содержимого файла jar он должен выглядеть следующим образом:
0 Tue Nov 06 12:27:56 CET 2012 META-INF/
107 Tue Nov 06 12:27:56 CET 2012 META-INF/MANIFEST.MF
0 Tue Nov 06 12:27:56 CET 2012 com/
0 Tue Nov 06 12:27:56 CET 2012 com/example/
950 Tue Nov 06 12:27:56 CET 2012 com/example/ImageIconTest.class
0 Tue Nov 06 12:00:36 CET 2012 icons/
873 Tue Nov 06 12:00:36 CET 2012 icons/exit.png
Обратите внимание на расположение каталога значков.
Ответ 2
Исключение происходит, когда MediaPlayer
в пакете MediaPlayer
вызывает встроенный ресурс в "icons/exit.png"
. Это разрешило бы путь:
mediaplayer/icons/exit.png
Я предполагаю, что это не путь, который на самом деле.
icons/exit.png
Вот почему String
должен быть "/icons/exit.png"
- обратите внимание на префикс /
.
/
, который предшествует String
, сообщает загрузчику классов, что мы подразумеваем его для поиска
ресурс из корня пути к классу, в отличие от пакета класса, из которого он вызывается.
Ответ 3
Thanx много всех.
Я понял ответ
button = new JButton(new ImageIcon(getClass().getResource("/icons/playlist.png")));
я удалил ClassLoader(), и он сработал, но я просто не знаю почему.
Может кто-нибудь, пожалуйста, объясните мне теорию этого.?
Ответ 4
Этот код работает хорошо:
ClassLoader cl = getClass().getClassLoader();
InputStream stream = cl.getResourceAsStream( "hpms/study/Starbucks.jpg" );
if( stream == null ) System.err.println( "resource not found" );
BufferedImage image = ImageIO.read( stream );
ImageIcon icon = new ImageIcon( image );