2009-07-16 1 views
1

У меня есть проект в Eclipse. Когда я запускаю его из Eclipse, все работает отлично. Однако, когда я запускаю скрипт сборки Ant и выполняю JAR либо из командной строки, либо с помощью пакетного скрипта, я получаю исключение NullPointerException.Что может вызвать исключение NullPointerException при запуске JAR из командной строки, но не из среды IDE?

Исследуемое исключение NullPointerException выбрано из стороннего JAR, который я скомпилировал из источника. Но я сомневаюсь, что это проблема - она ​​работает, когда я выполняю ее внутри Eclipse!

Что может быть причиной этого и как я могу обойти проблему и исправить ее?

Вот как большая часть трассировки стека, как я могу показать:

java.lang.NullPointerException 
     at java.io.FilterInputStream.read(Unknown Source) 
     at java.io.BufferedInputStream.fill(Unknown Source) 
     at java.io.BufferedInputStream.read(Unknown Source) 
     at java.io.DataInputStream.readUnsignedByte(Unknown Source) 
     at com.jhlabs.dbf.DBFFile.readHeader(DBFFile.java:129) 
     at com.jhlabs.dbf.DBFFile.<init>(DBFFile.java:76) 
     at com.jhlabs.map.shapefile.Shapefile.<init>(Shapefile.java:102) 
     at com.jhlabs.map.layer.ShapefileLayer.<init>(ShapefileLayer.java:62) 

Я проверил путь к классам - JAR третья сторона действительно на пути к классам. Тем не менее, я ожидал, что, поскольку я, скорее всего, получаю исключение NoClassDefFoundException, если это не так, и я попытался использовать классы в JAR.

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

+0

Вы добавили сторонний JAR в путь сборки? – AlbertoPL

+0

- Слишком быстро нажмите, добавьте комментарий, и вы упаковали его с помощью JAR? – AlbertoPL

ответ

1

Предполагается, что он пытается найти ресурс, используя ClassLoader.getResourceAsStream() или аналогичный, и он не находит его в банке.

Конечно, мы бы угадали, если бы вы рассказали нам остальную трассировку стека, а не просто, что это NPE ... и тот факт, что у вас есть источник, означает, что вы должны быть в состоянии выработать точно, где все пойдет не так!

EDIT: Да, с этой трассировкой стека это, вероятно, создает FilterInputStream, но проходит через поток null. (JDK должен действительно генерировать исключение в конструкторе, но это уже слишком поздно, чтобы исправить это.)

+0

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

0

Вы уверены, что сторонний JAR находится на вашем пути, когда вы запускаете из командной строки?

+0

Первое, что я проверил. –

0

Попробуйте запустить его на JDK, а не на JRE, таким образом вы увидите, на какой строке вы получите NullPointerException, и узнайте, что делать, если посмотреть на источник.

Кроме того, скомпилируйте его с включенной информацией об отладке (не помните, как это описано в Руководстве по работе с Ant javac).

+0

Простите мое нообильность, но как я могу указать JAR на JDK? Я никогда этого не делал раньше. –

+0

Но я действительно думаю, что это может мне помочь. Тем более, что я не знаю, что такое null, и зная, что это поможет мне исправить проблемы. –

0

Я бы предположил, что путь к классу в вашей задаче запуска Eclipse и путь к классам в вашем ручном режиме различны. Перейдите в диалоговое окно «Запуск конфигурации» и проверьте вкладку «Путь к классу» задачи запуска Eclipse и убедитесь, что ваша партия имеет те же записи.

1

Похоже, что в последнем случае путь к файлу DBF неверно. Путь к файлу, из которого вы запускаете свой файл класса в Eclipse, в основном отличается от того, откуда вы запускаете командный файл. (Не путь к классу, но физический путь от того, где вы делаете java -jar ..., например, D: \ my \ app \ bin) Путь Eclipse работает от в Run Configurations -> вкладка Arguments -> Область рабочего каталога.

1

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

Смежные вопросы