View Full Version : [java]Problemi nel settare il classpath
Io, ed altri colleghi stiamo realizzando un piccolo progetto che consiste in un'applicazione javarmi che simula il gioco della roulette.
Il progetto e' stato sviluppato ed era funzionante sotto MACOSX, ma ora dobbiamo fare andare il server sotto linux ed e' qui che ci sorge il problema.
Dobbiamo collegarci ad un database postgres ma non riusciamo a caricare i jar del driver. La stessa cosa ci capita per un .jar di libreria grafica. Siamo convinti, dopo varie prove (vedi tentativi) che il problema sia legato al settaggio del CLASSPATH. Nel primo caso l'errore e': "java.sql.SQLException: No suitable driver" nel secondo "java.lang.NoClassDefFoundError: org/jdesktop/layout/GroupLayout$Group" .
tentativi gia' fatti:
- Settaggio della variabile di sistema tramite EXPORT
- Settaggio della variabile tramile .bashrc
- Settaggio della variabile tramite parametro -classpath da riga di lancio
- Scompattamento dei jar e posizionamento della directory con i file scompattati
- Concessione di tutti i permessi alle cartelle e file dei classpath
- Controllato e concesso tutti i permessi necessari da policy
Ci sorge il dubbio che forse non lo settiamo nella maniera corretta... ma non riusciamo a capire come sia possibile settarlo, dato che abbiamo provato svariate maniere, seguendo anche guide del sito della sun.
Se avete qualche idea su come risolverlo, fateci sapere perche' siamo disperati!! grazie e ciao :D
Nella directory di installazione del JRE c'è una cartella "ext" sotto "lib". Copia lì dentro i jar che servono al tuo programma.
Controlla per sicurezza quanti e quali JRE hai installato sul sistema. Se ce n'è più d'uno dovrai mettere le librerie nel JRE in uso.
Occorrerebbero piu' informazioni, esempio:
dove si trova il jar postgres (relativamente al resto)?
Come lanciate l'applicazione?
Nella directory di installazione del JRE c'è una cartella "ext" sotto "lib". Copia lì dentro i jar che servono al tuo programma.
Controlla per sicurezza quanti e quali JRE hai installato sul sistema. Se ce n'è più d'uno dovrai mettere le librerie nel JRE in uso.
edit: siamo studenti e non abbiamo i permessi di root per accedere a quella cartella :(
Occorrerebbero piu' informazioni, esempio:
dove si trova il jar postgres (relativamente al resto)?
Come lanciate l'applicazione?
Il progetto lo dobbiamo fare girare nei computer dell'universita'... il file .java del server si trovano tutti dentro /home/account/studenti/{**home-mia**}/PARprogetto/giocoroulette/ .. i file jar di postgres li abbiamo messi su /home/account/studenti/{**home-mia**}/javarmi/lib/ ..
L'applicazione la lanciamo dalla radice del progetto (PARprogetto) con:
"java -DJava.security.policy={**path assoluto del file di policy**} -Djava.rmi.server.codebase={url del codebase} giocoroulette.TavoloGioco"
dove TavoloGioco e' il file main del server (dentro il package giocoroulette), il file di policy ed il codebase funzionano e sono visti correttamente (anche perche' su MACOSX funzionava tutto). Oltre a questo comando "base" abbiamo provato (come ho scritto sopra) a settiare il classpath dalla riga di comando con: "-classpath :/home/accounts/studenti/{**home-mia**}/javarmi/lib/postgresql.jar" .. oppure senza .jar .. oppure scomppattando i .class e mettendo il path della cartella
******UPDATE******
adesso tramite il comando:
"export CLASSPATH=/home/accounts/studenti/{**home-mia**}/javarmi/:
/home/accounts/studenti/{**home-mia**}/javarmi/swings.jar:
/home/accounts/studenti/{**home-mia**}/javarmi/postgresql.jar:
./"
siamo riusciti a caricare le classi swing per l'interfaccia grafica del client, ma il problema dei driver postgre persiste
Se usi Java 6 (forse anche 5, non ricordo esattamente) crea una cartella "libraries" nella radice del progetto, buttaci dentro tutti i jar che ti servono e lancia il programma con:
java -cp .:libraries/* eccetera
Comunque l'impostazione del CLASSPATH, sebbene desueta, è giusta. Per scaramanzia, le capitalizzazioni sono ok? Magari è postgresql.JAR o Postgresql.jar.
O e' un problema di connessione al database.
Su che metodo vi da' l'eccezione?
Poi, che url usate?
In pratica, incollate qui un po' di codice :D
So che non e' bello rispondere con delle domande, ma servono decisamente piu' info:fagiano:
La versione di Postgre che usate su Linux è la stessa che usavate su Mac OsX? Detto altrimenti, la versione del driver jdbc contenuta in postgrsql.jar è quella giusta?
Lo dico perchè se fosse un problema di Classpath allora dovreste vedere un'eccezione ClassNotFoundException nel momento in cui caricate il driver o creare il DataSource.
Voi avete invece una SQLException. Cioè la classe c'è ma il Driver non sembra in grado di interpretare correttamente la stringa di connessione rispetto alla base dati a cui cerca di connettersi.
Se usi Java 6 (forse anche 5, non ricordo esattamente) crea una cartella "libraries" nella radice del progetto, buttaci dentro tutti i jar che ti servono e lancia il programma con:
java -cp .:libraries/* eccetera
Comunque l'impostazione del CLASSPATH, sebbene desueta, è giusta. Per scaramanzia, le capitalizzazioni sono ok? Magari è postgresql.JAR o Postgresql.jar.
abbiamo java 5.. abbiamo provato a mettere la cartella libraries.. e a impostare il classpath come dici tu ma da sempre "no suitable driver" ... cazzu ..
il file si chiama proprio postgresql.jar tutto minuscolo..
O e' un problema di connessione al database.
Su che metodo vi da' l'eccezione?
Poi, che url usate?
In pratica, incollate qui un po' di codice :D
So che non e' bello rispondere con delle domande, ma servono decisamente piu' info:fagiano:
ti copio la parte di codice dove sorge l'errore
package giocoroulette;
import java.io.Serializable;
import java.rmi.*;
import java.sql.*;
public class ListaUtenti implements Serializable {
public String username;
public InterfacciaCroupier croupier;
private static int generatorePingID = 1;
public int pingID;
private static String DB_HOST = "jdbc:postgresql://arena.sci.univr.it/didattica"; // percorso di rete per accedere al dbms
private static String DB_NAME = "dblab133"; // nome del database a cui accedere
private static String DB_USER = "userlab133"; // nome utente per accedere al dbms
private static String DB_PWD = "*********"; // password dell'utente per accedere al dbms
protected static String JDBC_DRIVER = "org.postgresql.Driver"; // nome del driver JDBC
public static final ListaUtenti LISTA_VUOTA = new ListaUtenti();
private ListaUtenti coda;
private static ListaUtenti testaLista = LISTA_VUOTA;
// -- costruttore vuoto
private ListaUtenti() {
this.username = "";
this.croupier = null;
this.coda = null;
try {
Class.forName(JDBC_DRIVER);
String dbmsURL = "jdbc:"+DB_HOST+"/"+DB_NAME+"?user="+DB_USER+"&password="+DB_PWD;
Connection dbmsConn = DriverManager.getConnection(dbmsURL);
Statement state = dbmsConn.createStatement();
String updateQuery = "UPDATE User SET isOnline = '0' WHERE 1;";
state.executeUpdate(updateQuery);
} catch (Exception ex) {
ex.printStackTrace();
}
}
il programma si ferma praticamente al comando
"Connection dbmsConn = DriverManager.getConnection(dbmsURL);"
abbiamo gia' controllato sul sito della postgre la sintassi dell'url ed e' corretta .. ci era venuto in mente il che "forse" non e' possibile fare l'accesso al database da un programma .. boh ma dato che da terminale possiamo accederci, scriverci ecc.. e poi "Class.forName(JDBC_DRIVER);" non da errori .. boh
La versione di Postgre che usate su Linux è la stessa che usavate su Mac OsX? Detto altrimenti, la versione del driver jdbc contenuta in postgrsql.jar è quella giusta?
su osx usavamo mysql .. solo che qui abbiamo solo postgre. Riguardo alla versione abbiamo anche scaricato i driver della versione corrispondente ma niente..
Lo dico perchè se fosse un problema di Classpath allora dovreste vedere un'eccezione ClassNotFoundException nel momento in cui caricate il driver o creare il DataSource.
ma infatti
Voi avete invece una SQLException. Cioè la classe c'è ma il Driver non sembra in grado di interpretare correttamente la stringa di connessione rispetto alla base dati a cui cerca di connettersi.
abbiamo trovato su internet notizie a riguardo e abbiamo trovato che "no suitable driver" vuol dire che nessuno tra i driver disponibili riescono a leggere l'url ..
Dal codice sembra che mettiate due volte "jdbc:"
provate a stampare dbmsURL
abbiamo trovato su internet notizie a riguardo e abbiamo trovato che "no suitable driver" vuol dire che nessuno tra i driver disponibili riescono a leggere l'url ..
Se non avete una "ClassNotFoundException" il driver c'è. Se la versione coincide allora è anche il driver giusto.
Dev'essere la forma della stringa di connessione.
Occhio-di-falco-lovaz ha visto giusto. C'è un "jdbc:" di troppo.
Dal codice sembra che mettiate due volte "jdbc:"
provate a stampare dbmsURL
ehm si scusate ho copiato una vecchia versione :doh: l'url e' aposto nell'ultima versione (purtroppo non e' questo quindi) .. pero' c'e' stato detto da nostri compagni di corso che forse hanno cambiato l'url da "arena.sci.univr.it" a "sqlserver.sci.univr.it" :muro: .. speriamo sia questo ora proviamo..
OLEEEEEEEEEEEEEEEE RISOLTOOOO! ERA url sbagliatoooo!!
certo che hanno cambiato tutto senza comunicare un cazzo -.-
grazie a tutti comunque e scusate lo sbattimento :D
ora ci sono da mettere aposto un po' di cose ma dovrebbe funzionare
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.