JAR-файл не может быть выполнен с NullPointerException, когда он работает нормально, распакованный - PullRequest
2 голосов
/ 14 июня 2011

Я пытаюсь реструктурировать устаревшее приложение и сократить количество шагов, необходимых для развертывания.Для этого я упаковываю все файлы классов и ресурсы в файл jar.

Я использую эту команду для jar всего:

jar -cfm ../Deploy/JEmu.jar Manifest.txt * .class Resources /

Мой файл манифеста выглядит так:

Manifest-Version: 1.0  
Created-By: 1.2.2 (Sun Microsystems Inc.)  
Main-Class: JEmu  
Name: JEmu.class  

Класс, который является точкой входа, - JEmu.class, который упакован в банку, но когда я запускаю банку, я получаю эту ошибку:

java -jar JEmu.jar
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.NullPointerException
        at javax.swing.ImageIcon.<init>(Unknown Source)
        at ControlBar.<init>(ControlBar.java:88)
        at JEmu.<clinit>(JEmu.java:85)
Could not find the main class: JEmu. Program will exit.

Я не совсем уверен, что является причиной этого.

Строка 88 ControlBar:

stopButton = new JButton( new ImageIcon( classLoader.getResource("Resources/stop.gif")));

Что я делаю не так, все работает, когда не упаковано в банку?

Ответы [ 2 ]

3 голосов
/ 14 июня 2011

classLoader.getResource("Resources/stop.gif"), вероятно, не может найти указанный ресурс. Когда это происходит, возвращается null, следовательно, NullPointerException.

0 голосов
/ 14 июня 2011

Проблема в том, что виртуальная машина не может найти ресурс с именем "Resources/stop.gif".Причина этого в том, что файл stop.gif находится в пакете "Resources", как и в базе файла JAR.По умолчанию метод getResource запускается с пакета класса, из которого был получен загрузчик классов.В случае вашего кода это будет пакет, в котором находится класс Thread.Конечным результатом будет то, что виртуальная машина ищет изображение в местоположении "/java/lang/Resources/stop.gif", а не в том месте, где находится ваше изображение.

Если вы ищете фиксированное местоположение, т. Е. Каталог ресурсов, расположенный в базе JAR, убедитесь, что префикс строки URL с '/', как в:

classLoader.getResource("/Resources/stop.gif");

Другойнужно подумать, нужно ли вам использовать ClassLoader из текущего потока.Обычно ClassLoader, используемый вашим классом приложения, будет более подходящим.Вы можете получить это, выполнив что-то похожее на this.getClass().getResource(...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...