Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    19

    Grosso Problema File .jar E Risorse Esterne

    Ciao a tutti,
    è la prima volta che chiedo aiuto in questo forum per cui mi scuso in anticipo per eventuali inadempienze e/o imprecisioni.

    Veniamo al dunque: io e il mio gruppo universitario abbiamo dovuto ideare un progetto per il corso di basi di dati con relativa interfaccia grafica java in grado di collegarsi al database da noi ideato.
    In soldoni il nostro programma si basa su MySQL, ogni volta che l'applicazione parte controlla che il database (nome prefissato) esista: se non esiste lo crea, riempie le tabelle e genera trigger e procedure; se esiste non fa nulla e apre una schermata di login che porterà alle fasi successive del programma.
    Per creare tabelle, riempirle e aggiungere trigger e procedure abbiamo ideato degli script .sql appositi che vengono dati in pasto nel punto giusto del programma al metodo runScript della classe ScriptRunner (classe da noi trovata sul web e adattata alle nostre esigenze).
    Tale metodo ha solo bisogno di ricevere in input il percorso assoluto/relativo del file .sql.

    Ed è qui che viene il bello: noi usiamo Netbeans come IDE, facendo partire il programma con una semplice RUN funziona tutto alla perfezione mente quando andiamo a creare il file .jar relativo (cosa che vogliamo/dobbiamo fare per portabilità del programma su varie macchine su richiesta del professore) non trova i suddetti file .sql.

    per maggior chiarezza posto l'organizzazione delle directory del progetto e un pezzo di codice per semplificare la comprensione
    (PS: io sto lavorando su Ubuntu attualmente ma lo stesso problema si ha su windows tale e quale):

    Frammento di codice che crea il database a runtime:

    codice:
    package progettobd2011;
    
    import java.sql.*;
    import java.io.*;
    import java.net.URL;
    
    /**
     * Dipende da ScriptRunner.java
     * */
    public class Db_Connection 
    {
    	private String driver;
    	private String url;
    	private String user;
    	private String pass;
    	
    	private Connection conn;
    	private Statement stmt;
    	
    	private String query;
    	public Db_Connection (String driver,String url,String user,String pass)
    	{
    		this.driver= driver;
    		this.url=url;
    		this.user=user;
    		this.pass=pass;	
    		this.query="";	
    	}
    	public void Mod_Settings (String driver,String url,String user,String pass)
    	{
    			if (driver!= "") this.driver= driver;
    			if (driver!= "") this.url=url;
    			if (driver!= "") this.user=user;
    			if (driver!= "") this.pass=pass;
    			
    	}
    	/**
    	 * Apre la connessione al DB
    	 * */
    	public /*void*/boolean Open_Conn ()
    	{
    		try{	Class.forName(driver);//caricamento driver
    		System.out.println("Driver convalidati");
    		
    		conn = DriverManager.getConnection(url,user,pass);//crezionze connessione al DB
    		System.out.println("Ok, sono connesso al DB");
    		stmt=conn.createStatement();
    	}
    		
    		catch (ClassNotFoundException e) { //caso driver non trovati
    			System.out.println("Drivers not found");
    		}	
    			catch (SQLException e) { 
    				//sintassi query non corretta
    			e.printStackTrace();
                            return false ;
    		}
    
    		return true ;
    	}
    	/**
    	 * Inizializza il database alla prima esecuzione del programma
    	 * */
    	public void Init_DB()
    	{
    		Open_Conn();
    		int ERR = Ins_Up_SQL("SHOW CREATE DATABASE ProgettoBD2011");
    		Close_Conn();
    		System.out.println(ERR);
    		if (ERR == 0) 
    					//Il database non esiste, va creato...
    				{		System.out.println("Creazione");
    						Open_Conn();
    						Ins_Up_SQL("create database ProgettoBD2011 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;");	
    						Close_Conn();
    						url+="/ProgettoBD2011";
    						Open_Conn();
    							ScriptRunner r = new ScriptRunner(conn, false, true);
    							try{
                                                                    URL fileURL= getClass().getClassLoader().getResource("progettobd2011/CreazioneDB.sql");
                                                                    System.out.println(fileURL);
                                                                    String file= fileURL.getPath();
    								r.runScript(new BufferedReader(new FileReader(file)));
    Organizzazione directory progetto:

    codice:
    Scrivania
        -> ProgettoBD2011
                      ->src
                         ->progettobd2011
                                 -><tutti file .java,.sql,.png>
                      -> build
                         ->classes 
                                 -><tutti i file .sql,.class e .png del programma>
                      ->mysql-connector
                         -><file .jar e altri del driver mysql completamente funzionante>
                      ->dist(cartella dove viene creato di default il .jar del programma)
                         ->ProgettoBD2011.jar
                                 (nell'archivio) 
                                 ->progettobd2011
                                          -><esatta copia dei file .class, .sql e .png citati sopra in src>
                                          ->META-INF(contiene il MANIFEST.MF che se volete vi posto)
                         ->lib
                                 -><collegamento al driver mysql sopracitato>
                         ->nbproject
                                 -><contiene a file di configurazione che forse non c'entrano>
    (Queste le più importanti se vi serve altro che manca provvederò a postare tutto)

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Sposto nel forum Java.
    In futuro, il titolo della discussione dovrebbe dare il senso del problema trattato e il codice postalo usando gli appositi tag CODE (vedi regolamento interno).

    Manca uno slash nel percorso al file.

    Questo è uno dei motivi per cui le applicazioni andrebbero sempre testate al di fuori dell'ambiente di sviluppo (io il RUN dell'ambiente non lo uso mai).

    Quando carichi dei file usando getResource() hai due possibilità: usare percorsi relativi (il file verrà cercato in relazione alla posizione del class che effettua la ricerca, o del class dal quale viene fatta partire) o usare percorsi assoluti.

    Nel tuo caso, il class che effettua la ricerca è già nella directory progettobd2011, quindi se gli dici di cercarlo in "progettobd2011/nomefile.sql", lui si aspetta di trovare una sottodirectory chiamata "progettobd2011" dentro a quella attuale del class. Se, al contrario, aggiungi uno slash all'inizio, il percorso diventa assoluto.

    Quindi:
    codice:
    URL fileURL= getClass().getClassLoader().getResource("/progettobd2011/CreazioneDB.sql");
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    19
    Ho fatto qualche passo avanti:
    1) ora riesco a caricare le immagini con questa porzione di codice nella classe che deve farlo:

    codice:
    URL url = ClassLoader.getSystemResource("progettobd2011/warning.png");
              System.out.println(url);
              lblWarningIcon.setIcon(new ImageIcon(url)) ;
    2) con i file .sql non ne vuole sapere minimamente. Uso questo codice:

    codice:
    fileURL= ClassLoader.getSystemResource("progettobd2011/CreazioneDB.sql");
              System.out.println(fileURL);
              String file= fileURL.toString();
              System.out.println(file);
    	  r.runScript(new BufferedReader(new FileReader(file)));
    PS. Il tuo ragionamento precedente è sensatissimo, ma se metto /progettobd.... mi da "NullPointerException" sia nel codice delle immagini sia nel codice dell'sql.

    PS. Le System.out.println le ho messe per stampare i path che in teoria vengono passati ai vari metodi usati per caricare le varie risorse esterne; ecco cosa viene stampato:

    Per le immagini:

    codice:
    jar:file:/home/daniele/Scrivania/ProgettoBD2011/dist/ProgettoBD2011.jar!/progettobd2011/warning.png
    jar:file:/home/daniele/Scrivania/ProgettoBD2011/dist/ProgettoBD2011.jar!/progettobd2011/success.png
    e tutto funziona alla grande;

    Per l'sql:

    codice:
    jar:file:/home/daniele/Scrivania/ProgettoBD2011/dist/ProgettoBD2011.jar!/progettobd2011/CreazioneDB.sql   <stampa della variabile/stringa di tipo URL>
    file:/home/daniele/Scrivania/ProgettoBD2011/dist/ProgettoBD2011.jar!/progettobd2011/CreazioneDB.sql  <stampa dell'URL convertito a String>
    Come vedi nel convertire a stringa l'URL viene perso nel path il "jar:" iniziale (e non capisco il motivo) quindi succede qualcosa qui.

    Scusami ancora ma sono a un passo dalla soluzione (e da consegnare sto benedetto progetto), manca solo quest'ultima cosa...

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Perchè tenti di creare un oggetto File a partire da una stringa che non rappresenta un file, ma una "url" (la url del file caricato come risorsa).

    Se vuoi leggere la risorsa, allora devi usare getSystemResourceAsStream() in modo da ottenere l'InputStream che poi userai con il BufferedReader (costruendo, prima, un InputStreamReader).

    codice:
    InputStream is = ClassLoader.getSystemResourceAsStream("progettobd2011/CreazioneDB.sql");
    r.runScript(new BufferedReader(new InputStreamReader(is)));
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    19
    Grazie mille dell'aiuto, la tua prima risposta mi ha fatto arrivare a una soluzione molto simile a quella che hai postato successivamente, eccola:

    codice:
    fileURL= ClassLoader.getSystemResource("progettobd2011/CreazioneDB.sql"); 
    System.out.println(fileURL); is= new InputStreamReader(fileURL.openStream()); 
    System.out.println(is); r.runScript(new BufferedReader(is));
    Ora tutto funziona perfettamente! Grazie ancora!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.