Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 22
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    67

    Jar e database HSQLDB

    Salve ragazzi,

    Vi espongo brevemente il problema. La mia applicazione Java si appoggia ad un database hsqldb e funziona perfettamente quando vado in "run" (utilizzo netbeans). Quando creo il file .jar sempre da procedura guidata mi da unn problema serio. Innanzitutto mi blocca il "disegno" dell'interfaccia proprio nelle combobox che si caricano dinamicamente con il DB rendendo inusufruibile il software, in secondo luogo ho delle label con delle immagini. Non si caricano.

    Come posso fare per risolvere questo problema???

    Stavo prendendo in considerazione di creare un installer o di usufruire di un servizio stile "install shield" per poter inglobare le mie classi java, il mi opackage con le immagini ed HSQLDB. Sapreste consigliarmi come muovermi per creare una sorta di eseguibile del mio programma?

    grazie...

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Jar e database HSQLDB

    Originariamente inviato da dinoala
    Innanzitutto mi blocca il "disegno" dell'interfaccia proprio nelle combobox che si caricano dinamicamente con il DB rendendo inusufruibile il software
    La prima cosa che bisognerebbe vedere è nel contesto di quale thread hai eseguito qualunque degli accessi al tuo DB. La gestione della interfaccia utente e specialmente il dispacciamento degli eventi viene fatto da un solo ed unico thread convenzionalmente chiamato il EDT. La regole fondamentali sono due:
    1) Il EDT non deve essere tenuto "impegnato" (con del proprio codice) per troppo tempo, pena il "congelamento" della interfaccia utente in quel frangente di tempo.
    Qualunque operazione potenzialmente "lunga" come: I/O su file, comunicazione su socket (o altro del networking), accesso ad un DB, computazioni lunghe/pesanti va fatta in un thread separato, che non sia il EDT. E con tutto quello che comporta (sincronizzazione, ecc...)
    2) Salvo casi particolari e noti/documentati, l'accesso alla interfaccia utente (componenti, layout manager, model, ecc...) va fatto solo nel contesto del EDT.

    Se non hai rispettato una (o più) di queste regole, devi ripensare profondamente la tua applicazione.

    Originariamente inviato da dinoala
    ho delle label con delle immagini. Non si caricano.
    Bisogna vedere con quale API (il Toolkit di AWT? ImageIO? ImageIcon?) hai caricato la immagine e in quale modo hai specificato il riferimento alle immagini.

    Se le immagini stanno nel jar il modo migliore di gestirle è quello di trattarle come "risorse" e sfruttare i getResource / getResourceAsStream di Class o eventualmente gli equivalenti nel ClassLoader (ma in genere è più facile/affidabile basarsi su un Class).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    67
    Beh in realtà il mi programma gira tutto su un unico thread.
    Non ho intenzione (quantomeno per il momento e salvo impossibilità di unica via di fuga) di creare un applicazione multithread. Sarò sicuramente ignorante in materia però onestamente non credo che non esista un modo (Se non quello da te descritto) per creare un installer o un jar funzionante che comprenda DB immagini e file di support vari per un applicazione che gira su un unico thread.

    Ti ringrazio per le delucidazioni che mi saranno sicuramente di grande aiuto per quando mi butterò sulla programmazoine multithreading...ma per adesso, per fare un po d'esperienza resto nel single-thread.

    Per quel che concerne la struttura del mio software è così composta:

    CARTELLA PRINCIPALE
    ->CARTELLA DATABASE
    ->CARTELLA IMMAGINI
    ->PACKAGE FILE.JAVA

    i mio software è così strutturato :

    classe "loading" che nel main avvia uno splashscreen che creerà un oggetto "homepage" con un menù. ogni voce del menù ha un .java a se stante che comprende la creazione di un pannello contenitore per tutti i componenti e le funzioni relative a quella classe. Tra queste funzioni tengo anche quelle che mi effettuano salvataggi e ricerche su DB HSQL (istanzio un oggetto di tipo "Connessione" il quale costruttore è in una classe a se stante e ne richiamo i metodi di volta in volta) quindi le interazioni vere e proprie le eseguo al caricarsi del pannello contenitore.

    Ovviamente ho notato un leggerissimo ritardo nell'apertura del pannello, massimo un secondo, perchè ho queries su grandi moli di dati (tengo a precisare che il DB è strutturato a regola d'arte).

    Come posso creare questo eseguibile vista la mia situazione?

    PS: non ho impostato come variabile d'ambiente il collegamento al DB, bensì ho inglobato un file .jar del DB HSQL nella cartella di jdk. Non vorrei che fosse questo il mi problema.

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    67
    Inoltre non so se può essere utile...

    scrivendo le prompt la seguente riga :

    java -jar "C:\Users\Giulio\Documents\NetBeansProjects\DietPr o\dist\DietPro.jar"

    mi dice che java non è riconosciuto come un comando di sistema...

    e questo è ciò che mi dice NETBEANS quando creo il jar. (utilizzo jdk 1.7)

    init:
    Deleting: C:\Users\Giulio\Documents\NetBeansProjects\DietPro \build\built-jar.properties
    deps-jar:
    Updating property file: C:\Users\Giulio\Documents\NetBeansProjects\DietPro \build\built-jar.properties
    compile:
    Created dir: C:\Users\Giulio\Documents\NetBeansProjects\DietPro \dist
    Copying 1 file to C:\Users\Giulio\Documents\NetBeansProjects\DietPro \build
    Nothing to copy.
    Building jar: C:\Users\Giulio\Documents\NetBeansProjects\DietPro \dist\DietPro.jar
    To run this application from the command line without Ant, try:
    java -jar "C:\Users\Giulio\Documents\NetBeansProjects\DietPr o\dist\DietPro.jar"

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    67
    up

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    67
    buonasera ragazzi.

    Per le label con immagine ho risolto in questa maniera :

    bottoneHome = new JButton(new ImageIcon(this.getClass().getClassLoader().getReso urce("Immagini/home.png")));

    per quel che riguarda il DB non ho risolto.

    come consigliato da andbin sto mutando profondamente la struttura del mi oprogramma rendendolo multithread. Sorge qualche problema :

    Ma prima spiego brevemente cosa ho fatto:
    Il main lancia un thread che istanziando una serie di oggetti mi costruisce l'interfaccia grafica. Al momento opportuno lancio un nuovo thread che mi esegue un interazione con il DB e questo riesco a farlo funzionare diminuendo i tempi (seppur di poco perchè ho un db non molto ampio) SEMPRE CON NETBEANS. Quando però vado a creare il jar non riesco a far funzionare questo thread.
    Ho paura che il problema sia dovuto al recupero del path del database che vado a passare come stringa alla mia funziona connessione come segue:

    codice:
        public Connessione(String db_file_name_prefix) throws Exception {   
           Class.forName("org.hsqldb.jdbcDriver");
            conn = DriverManager.getConnection("jdbc:hsqldb:"
                    + db_file_name_prefix, "sa", "");
      }
    e quando vado a richiamare un oggett odi tipo connessione lo faccio in questa maniera

    codice:
    c = new Connessione(pathConnessione);
    con pathConnessione una stringa di tipo : "../MyProject/src/Database/MyProject_db";

    Come al solito, quando creo il JAR non mi fa l'interazione con il db nonostnte sia stata messa in un thread apposito.

    Cosa può essere? è possibile che devo utilizzare un altro modo per prendere il path del DB ???
    utilizzo hsqldb.

    Grazie per l'attenzione

  7. #7
    Utente di HTML.it L'avatar di progAnd
    Registrato dal
    Jan 2012
    Messaggi
    119
    1) il .jar del driver HSQLDB è nel ClassPath?
    2) Tu cerchi il file del database in "../MyProject/src/Database/MyProject_db"; nessuno ti assicura che questo percorso esista quando lo lanci esternamente da Netbeans (è dipendente dalla dir di lavoro). Il percorso dovrebbe far riferimento alla tua struttura delle cartelle a partire dalla radice in modo da usare il getClass().getClassLoader().getResource() ed i vari metodi di URL (più semplicemente, il tuo percorso deve essere "Database/MyProject_db" ed assicurarti che la dir di lavoro sia quella giusta).

    I miei due cents...

    Ciao

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    67
    progAnd sei stato gentilissimo a rispondermi.

    Oltre ad avere impostato il classpath con il file di hsqldb.jar ho messo all'interno di tutte le mie versioni di JRE nella cartella lib/ext/ il file di hsqldb.jar

    Il problema è che ho provato mille volte a cambiare il path mettendolo come mi hai consigliato oppure semplicemente con un ../Database/MyProject_db e tante altre soluzioni che comunque netbeans mi riconosco ma non il JAR.

    Ho inoltre aperto con winrar il file .jar per assicurarmi che ci fosse tutto ed in effetti è cosi.

    Saresti così gentile da mostrarmi magari con un esempio come posso ricavare questo path del mio db sfruttando ciò che mi hai detto, ovvero getClass().getClassLoader().getResource()


    Grazie per l'attenzione e soprattutto per il tempo dedicatomi !!!

  9. #9
    Utente di HTML.it L'avatar di progAnd
    Registrato dal
    Jan 2012
    Messaggi
    119
    1) se posti la traccia di errore, posso cercare di capire il problema
    2) Dipende da quello che vuoi ottenere: ti serve una stringa col percorso, un file, uno stream?
    codice:
    URL url=this.getClass().getClassLoader().getResource("Immagini/home.png");
    File f=new File(url);
    String percorsoConFile=f.getCanonicalPath();
    InputStream in=this.getClass().getClassLoader().getResourceAsStream("Immagini/home.png");
    Ci sono delle eccezioni da gestire, comunque

    Ciao

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    67
    mi serve una stringa da mandare in pasto alla funzione che mi si connette al DB.

    codice:
        public Connessione(String db_file_name_prefix) throws Exception {
            Class.forName("org.hsqldb.jdbcDriver");
            conn = DriverManager.getConnection("jdbc:hsqldb:"+ db_file_name_prefix ,"sa","");
     }

    Il problema è che io riesco a connettermi senza alcun problema quando eseguo tramite netbeans...se mi desse li errori lo avrei notato.

    Il mio sbattimento di testa nasce dal fatto che non ho modo alcuno (che io conosca) di poter vedere l'errore in esecuzione dell'eseguibile jar.

    Quando parli di eccezioni da gestire, intendi un blocco try catch nel codice che hai postato immagino. Quali sarebbero queste eccezioni? il fatto di non trovare l'immagine o qualcosa del genere? Se so per certo che l'immagine si trova li l'eccezione può essere causata soltanto da uno spostamento manuale suppongo!

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.