2009-01-30 21 views
7

Nota Estoy ejecutando Windows, la ruta parece que es linus porque lo escribí manualmente y así es como pienso en las rutas.Al ejecutar un programa Java en la línea de comandos, ¿qué estoy haciendo mal?

Estoy tratando de ejecutar una clase java que he creado para diagnosticar mi conexión a un databse, hace referencia al adaptador oracle jdbc.

Cuando lo ejecutas sin una ruta de clase:

%> java DBDiagnostics <connectionString> 

me sale una excepción cuando se llega a la siguiente línea de código:

Class.forName("oracle.jdbc.pool.OracleDataSource").newInstance(); 

con la siguiente excepción:

java.lang.ClassNotFoundException: oracle.jdbc.pool.OracleDataSource 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:200) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:188) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:252) 
     at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) 
     at java.lang.Class.forName0(Native Method) 
     at java.lang.Class.forName(Class.java:169) 
     at DBDiagnostics.GetConnection(DBDiagnostics.java:43) 
     at DBDiagnostics.runDiagnostic(DBDiagnostics.java:29) 
     at DBDiagnostics.main(DBDiagnostics.java:18) 
Creating connection. 
java.sql.SQLException: No suitable driver found for lskd 
     at java.sql.DriverManager.getConnection(DriverManager.java:602) 
     at java.sql.DriverManager.getConnection(DriverManager.java:207) 
     at DBDiagnostics.GetConnection(DBDiagnostics.java:55) 
     at DBDiagnostics.runDiagnostic(DBDiagnostics.java:29) 
     at DBDiagnostics.main(DBDiagnostics.java:18) 
Veryfying connectivity to Database 
Exception in thread "main" java.lang.NullPointerException 
     at DBDiagnostics.verifyTable(DBDiagnostics.java:86) 
     at DBDiagnostics.verifyTable(DBDiagnostics.java:76) 
     at DBDiagnostics.verifyDatabseConnectivity(DBDiagnostics.java:68) 
     at DBDiagnostics.runDiagnostic(DBDiagnostics.java:36) 
     at DBDiagnostics.main(DBDiagnostics.java:18) 

Supongo que esto se debe a que necesito incluirlo en el classpath.

lo tanto, traté de añadir a la ruta de clase de esta manera:

%> java -classpath .:ojdbc6.jar DBDiagnostics <connectionString> 

La máquina virtual se limita a decir que no puede encontrar la clase:

Exception in thread "main" java.lang.NoClassDefFoundError: DBDiagnostics 
Caused by: java.lang.ClassNotFoundException: DBDiagnostics 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:200) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:188) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:252) 
     at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) 
Could not find the main class: DBDiagnostics. Program will exit. 

Sé que esto es una pregunta yo debería saber la respuesta a, pero ¿qué estoy haciendo mal?

+0

¿Su archivo de clase DBDiagnostics está en .JAR, o solo está en el mismo directorio desde el que está intentando ejecutar? –

+0

¿Qué plataforma está ejecutando en Omar? –

+0

Al ejecutar en Windows, la ruta fue algo que puse para mostrar que era una ruta en lugar de publicar la estructura de directorios de mi máquina.punto y coma en lugar de dos puntos trabajado gracias –

Respuesta

16

Reemplazar el colon con un punto y coma: La respuesta de

java -classpath .;ojdbc6.jar DBDiagnostics <connectionString> 
+0

¿No es esto algo de Windows? Pensé que ':' era el delimitador en Linux ... –

+0

¡Está usando Windows! –

+0

Eso funcionó un encanto –

2

hay un error tipográfico:

%> java -classpath .:ojdbc6.jar DBDiagnostics <connectionString> 

tal vez funcionaría si escribe esto:

%> java -classpath ./ojdbc6.jar DBDiagnostics <connectionString> 
+0

Pensé que los dos puntos significaban que se estaba ejecutando en Unix/Linux. – duffymo

+0

Eso es lo que sugeriría también. –

+0

Eso no lo ayudaría, ya que su especificación classpath hacía que su VM no pudiera resolver la clase DBDiagnostics. Referirse correctamente al ojdbc6.jar no resolvería eso. ¿Podría ser una variable de entorno CLASSPATH que se anula especificando ojdbc6.jar a mano? El mensaje – Robin

1

¿El archivo DBDiagnostics.class aparecer en el directorio desde el que se está lanzando Java? Si no, el cargador de clases no lo encontrará.

¿La clase DBDiagnostics tiene un paquete? Si lo hace, debe hacer referencia al nombre de la clase totalmente resuelto, y la raíz de la jerarquía del paquete debe aparecer en el directorio desde el que ejecuta Java.

+0

Creo que DBDiagnostics está en el paquete predeterminado. Encuentra el método principal en el primer ejemplo, pero no puede encontrarlo en el segundo, luego de que agrega el jar al classpath. Algo más debe haber cambiado, sin embargo, porque debería funcionar ... –

+0

Sí, está en el paquete predeterminado –

1

Mike Sickler se ve bien para una plataforma de Windows. El separador de ruta para Windows es ";", pero ":" para Unix y Linux, ¡así que asegúrese de usar siempre el correcto!

1

Disparo lejano, pero ¿es este Unix o Windows? Si en Windows el separador de ruta de clase debe ser un punto y coma: -

%> java -classpath .;ojdbc6.jar DBDiagnostics <connectionString> 

Y, por supuesto, es necesario tener el archivo ojdbc6.jar en el directorio actual si no se especifica ninguna ruta al mismo. (Y posiblemente también sean dependencias ...)

Cuestiones relacionadas