¿Qué causaría una NullPointerException al ejecutar un JAR desde la línea de comando, pero no desde un IDE?

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

  •  16-09-2019
  •  | 
  •  

Pregunta

Tengo un proyecto en Eclipse. Cuando lo ejecuto desde el eclipse interior, todo funciona bien. Sin embargo, cuando ejecuto el script de compilación de hormiga y ejecuto el jar desde la línea de comando o usando un script por lotes, obtengo una nullpointerException.

La NullPointerException en cuestión se está arrojando desde un frasco de terceros que compilé de la fuente. Pero dudo que ese sea el problema: ¡funciona cuando lo ejecuto dentro de Eclipse!

¿Qué podría estar causando esto y cómo puedo aislar el problema y corregirlo?

Aquí está la mayor parte del rastro de la pila que puedo mostrar:

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)

Revisé el Classpath: el frasco de terceros está realmente en el classpath. Sin embargo, esperaba que, ya que probablemente obtendría una NoclassDefFoundException si no fuera así e intenté utilizar las clases en el frasco.

También verifiqué las ubicaciones donde utilicé un cargador de clases, y no eran nulos y estaban cargando correctamente los archivos adecuados.

¿Fue útil?

Solución

Una suposición: está tratando de encontrar un recurso usando ClassLoader.getResourceAsStream() o similar, y no lo encuentra en el frasco.

Por supuesto, estaríamos adivinando bastante menos si nos dirías el resto del rastro de la pila en lugar de solo que es un NPE ... y el hecho de que tienes la fuente significa que deberías poder hacer ejercicio exactamente ¡A donde va mal!

Editar: Sí, con ese rastro de pila probablemente esté creando un FilterInputStream Pero pasando en un null transmisión para envolver. (El JDK realmente debería lanzar una excepción en el constructor, pero es demasiado tarde para solucionarlo ahora).

Otros consejos

Parece que la ruta del archivo DBF no se está resolviendo correctamente en el último caso. La ruta del archivo desde donde ejecuta su archivo de clase en Eclipse es principalmente diferente de donde está ejecutando el archivo por lotes. (No es el camino de clase, pero la ruta física desde donde estás haciendo java -jar ..., como digamos, d: my app bin) La ruta que se ejecuta se ejecuta está en configuraciones de ejecución -> pestaña de argumentos -> Campo de directorio de trabajo.

Debe aprender a adjuntar un depurador a un programa independiente, para que pueda adjuntar su IDE con la fuente a este programa en ejecución. Estoy de acuerdo con Jon Skeet en que este es probablemente un archivo que no se encuentra: intente cambiar su corriente directamente para su configuración de ejecución para ver si también se rompe.

¿Estás seguro de que el frasco de terceros está en tu camino cuando te ejecutas desde la línea de comando?

Intente ejecutarlo en JDK y no en JRE, de esta manera verá en qué línea recibirá NullPointerException y descubra qué hacer al mirar la fuente.

Además, compile con información de depuración habilitada (no recuerde cómo, consulte el manual de tareas de Ant Javac).

Supongo que el ClassPath en su tarea de ejecución de eclipse y la clase de clases en su enfoque manual son diferentes. Vaya al cuadro de diálogo Ejecutar Configuraciones y verifique la pestaña ClassPath de su tarea Eclipse EXT y asegúrese de que su lote tenga las mismas entradas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top