2013-04-04 5 views
0

Je viens de compiler un programme Java dans la console. Maintenant, je veux l'exécuter. J'ai besoin de driver jdbc pour postgresql et mysql. Par conséquent, j'ai besoin d'inclure les pots correspondants.java setting classpath

Je l'ai fait l'follwing

java -Xmx512m -cp ".;/path/to/sql/jars" main.Main rc 

Lors de cette opération j'obtiens l'erreur follwoing:

Exception in thread "main" java.lang.NoClassDefFoundError: main/Main 
Caused by: java.lang.ClassNotFoundException: main.Main 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266) 
Could not find the main class: main.Main. Program will exit. 

Lorsque ignorant l'option classpath comme celui-ci

java -Xmx512m main.Main rc 

Je reçois l'erreur follwing

java.lang.ClassNotFoundException: org.postgresql.Driver 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:186) 
    at database.PostgresQL.getConnection(Unknown Source) 
    at database.PostgresQL.loadIndexFromDatabase(Unknown Source) 
    at main.Main.readDataFromDatabase(Unknown Source) 
    at main.Main.main(Unknown Source) 

Ainsi, le programme peut être exécuté correctement. Ma question: Comment dire au programme de chercher les bocaux correctement dans la console?

Répondre

6
java -Xmx512m -cp ".;/path/to/sql/jars" main.Main rc 

D'abord, le séparateur de chemin est uniquement ; sous Windows, il est : sur d'autres plates-formes. En second lieu, si /path/to/sql/jars est un répertoire contenant des fichiers JAR, vous devez ajouter un /* à la fin et utiliser des guillemets simples plutôt que double:

java -Xmx512m -cp '.:/path/to/sql/jars/*' main.Main rc 

La commande java traite path/* dans le classpath comme équivalent à path/some-jar.jar:path/another-jar.jar énumération tous les fichiers JAR dans le répertoire, mais vous devez protéger le * de l'expansion par le shell (d'où les guillemets simples).

Si vous êtes sur Windows alors les mêmes astuce fonctionne, mais avec des points-virgules, et des guillemets doubles barres obliques inversées:

java -Xmx512m -cp ".;C:\path\to\sql\jars\*" main.Main rc 
1

Le séparateur des entrées de chemin de classe est ; sous Windows et : sous Linux. Selon le chemin, il semble que vous êtes sur Linux.

-2

Copiez simplement les jarres de connexion PostgreSQL et MySQL pour jdk.x.x_xx \ jre \ lib \ ext et jre7 \ lib \ ext dossiers (Vous pouvez les trouver dans le répertoire d'installation des deux PostgreSQL et MySQL,

ex: -pour MySQL le connector.jar est dans MySQL \ MySQL dossier connecteur J)

+0

Cela ne doit pas être recommandé, 'lib/ext' est pour les extensions qui doivent être disponibles pour tous les processus Java sur un JRE donné, pas pour les bibliothèques qui sont nécessaires par un programme spécifique. Vous pouvez entrer dans un désordre de classloader horrible en mettant des JARs dans 'ext' qui n'ont pas été conçus pour fonctionner là, et il est impossible d'avoir deux programmes Java différents utilisant des versions différentes de la même bibliothèque. –