Что может вызвать исключение NullPointerException при запуске JAR из командной строки, но не из IDE?

StackOverflow https://stackoverflow.com/questions/1137170

  •  16-09-2019
  •  | 
  •  

Вопрос

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

Исключение 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)

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

Я также проверил местоположения, в которых я использовал classloader, и они не были null и правильно загружали соответствующие файлы.

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

Я бы предположил, что путь к классу в вашей задаче запуска Eclipse и путь к классу в вашем ручном подходе отличаются.Перейдите в диалоговое окно Run Configuration и проверьте вкладку classpath вашей задачи запуска Eclipse и убедитесь, что в вашем пакете есть те же записи.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top