Includere db sqlite dentro un JAR

di il
8 risposte

Includere db sqlite dentro un JAR

Ciao ragazzi,
sto creando un'applicazione DESKTOP con JAVAFX e volevo utilizzare sqlite per la base dati. Quando creo il mio Runnable JAR, il db mi viene creato nello stesso PATH in cui si trova la mia applicazione.

Ci sta un modo per lasciarlo all'interno del progetto? Ho provato anche con:
jdbc:sqlite::resource:note.db

ma nulla da fare.

Grazie mille

8 Risposte

  • Re: Includere db sqlite dentro un JAR

    folletto_folle ha scritto:


    Quando creo il mio Runnable JAR, il db mi viene creato nello stesso PATH in cui si trova la mia applicazione.
    Perché non specificando un percorso assoluto, è ovviamente relativo alla directory "corrente". E non sarebbe di per sé sbagliato. Semmai l'unica questione sarebbe stabilire COME l'applicazione debba essere lanciata da "qualunque" utente in modo da poter sempre avere il controllo sulla directory corrente.

    Se non vuoi che dipenda dalla directory corrente, ci sono altre soluzioni. Ad esempio mettere il db in una locazione "notevole", ad esempio da qualche parte sotto la "home" directory dell'utente. (la "home" directory la rintracci da una System property Java).

    Mettere il file del db dentro il jar .. no.

    folletto_folle ha scritto:


    Ci sta un modo per lasciarlo all'interno del progetto?
    Cosa vuol dire per te "all'interno del progetto" ? Quando hai il jar finale, i sorgenti, il progetto, l'IDE non contano/c'entrano più ...
  • Re: Includere db sqlite dentro un JAR

    Ciao andbin, grazie mille per la risposta.
    Il mio jar è stato creato con maven pertanto ho la folder resources dove all'interno ci sono i css, le img e i file fxml.
    Non c'è un modo per mettere il db anche li?
  • Re: Includere db sqlite dentro un JAR

    folletto_folle ha scritto:


    Non c'è un modo per mettere il db anche li?
    No, non va bene (sia per questioni tecniche che concettuali) che il db resti solo nel jar. Lo devi tenere fuori dal jar, da qualche parte sul file-system.

    Il file del db lo puoi eventualmente mettere nel jar se volessi usarlo come base iniziale alla prima esecuzione, ad esempio se hai tabelle/dati predefinite. L'applicazione non trova il db fuori, allora lo estrae dal jar e lo mette dove ci si aspetta. Insomma, una specie di setup "una tantum".
  • Re: Includere db sqlite dentro un JAR

    Crossposting

    https://forum.html.it/forum/showthread.php?threadid=2971696&postid=25546154#post25546154
  • Re: Includere db sqlite dentro un JAR

    Scusate non volevo fare crossposting, neanche c'ho pensato -_-.
    Comunque grazie mille andbin per le info, farò creare il db su qualche cartella dell'utente col system property.

    Ma se volessi usarlo come base iniziale alla prima esecuzione estraendolo dal jar come dovrei fare?Perchè se lo metto in qualsiasi cartella del progetto, quando compilo il progetto trasformandolo nel jar, il file del db non viene portato
  • Re: Includere db sqlite dentro un JAR

    folletto_folle ha scritto:


    Ma se volessi usarlo come base iniziale alla prima esecuzione estraendolo dal jar come dovrei fare?Perchè se lo metto in qualsiasi cartella del progetto, quando compilo il progetto trasformandolo nel jar, il file del db non viene portato
    Visto che hai già precisato l'uso di Maven, va ovviamente messo sotto src/main/resources

    E a runtime devi trattarlo come "risorsa" nel senso del getResourceAsStream(nome) di Class.
    E poi devi "travasare" tutti i byte su un file, che non è difficile ma va fatto accuratamente.

    Se vuoi semplificare, usi la Apache Commons IO che ha la FileUtils con il copyToFile(InputStream source, File destination)
  • Re: Includere db sqlite dentro un JAR

    Grazie mille Andbin.
    Per il PATH sto usando System.getProperty("user.home"), dovrebbe essere compatibile con qualsiasi sistema operativo vero?Almeno così ho letto su internet.
  • Re: Includere db sqlite dentro un JAR

    folletto_folle ha scritto:


    Per il PATH sto usando System.getProperty("user.home"), dovrebbe essere compatibile con qualsiasi sistema operativo vero?
    Sì, vale per tutti i sistemi. Chiaramente la struttura del path cambia in base al sistema e all'interno del path c'è ovviamente anche il nome utente.

    Comunque, "abbozzato":
    
    File dataDir = new File(System.getProperty("user.home"), ".nomedellaapp");
    dataDir.mkdirs();
    File dbFile = new File(dataDir, "file.db");
    
    if (!dbFile.isFile()) {
        // Scarica la risorsa sul file ....
    }
    
    Tutto qui (e con la Commons IO sono solo 1~2 righe in più).
Devi accedere o registrarti per scrivere nel forum
8 risposte