web-dev-qa-db-fra.com

Comment inclure la base de données SQLite dans un exécutable Jar?

J'ai créé une application Swing qui utilise SQLite comme base de données locale. Le fichier de base de données se trouve dans le répertoire racine du projet.

Project/DatabaseFile

L'application fonctionne correctement sur Eclipse, mais lorsque j'exécute le fichier exécutable emballé, j'obtiens l'erreur suivante:

No such table : table1

Cela signifie que la base de données n'est pas accessible. Lorsque j'ai examiné le contenu du fichier JAR résultant, le fichier de base de données n'était plus là.

Dans le code, j'ai lié la base de données comme suit:

jdbc:sqlite:DatabaseFile

Ma question est, comment inclure la base de données SQLite dans le Jar exécutable?

MODIFIER

Lorsque j'ai placé le fichier DB dans le dossier source Project/src/DatabaseFile et a changé le chemin d'accès en jdbc:sqlite:src/DatabaseFile, cela a fonctionné sur Eclipse mais encore une fois lors de l'exécution du fichier Jar en tant que Java -jar Project.jar. Ça disait:

path to 'src/DatabaseFile': 'C:\Users\name\src' does not exist

Je pense que je dois spécifier un chemin relatif pour la base de données.

MODIFIER

Voici comment je me connecte à la base de données:

public Connection getConnection(){      
    try{
        Class.forName("org.sqlite.JDBC").newInstance();             
        con = DriverManager.getConnection("jdbc:sqlite:src/DatabaseFile");              

    } catch (Exception e) {
        Log.fatal("Méthode: getConnection() | Class  : SQLiteConnection | msg system : " + e.getMessage());
    }
    return con;
}
29
outellou

Quelle bibliothèque utilisez-vous pour SQLite?

J'ai fait une recherche basée sur l'URI de connexion que vous avez indiqué et trouvé celui-ci . Dans le documentation il dit:

19 mai 2009: sqlite-jdbc-3.6.14.1 est sorti. Cette version prend en charge la syntaxe "jdbc: sqlite :: resource:" pour accéder aux fichiers DB en lecture seule contenus dans les archives JAR, ou aux ressources externes spécifiées via l'URL, l'adresse des fichiers locaux, etc. (voir aussi detailes )

Si c'est le pilote que vous utilisez, je suggère l'URI de connexion suivant:

"jdbc:sqlite::resource:DatabaseFile"

La clé est que puisque votre base de données est dans un fichier jar, elle ne peut pas être accessible en tant que fichier avec FileInputStream. Au lieu de cela, il doit être accessible via le support de la JVM (à savoir avec Class.getResource() ou Class.getResourceAsStream() ). Notez que les ressources contenues dans les fichiers jar sont en lecture seule. Vous ne pourrez pas enregistrer de modifications dans votre base de données.

36
dsh

J'ai trouvé deux façons différentes de nommer le chemin de fichier en fonction de la façon dont vous essayez d'y accéder. En supposant que vous accédez à la base de données se trouve dans/votreprojet/ressource/ou/votreprojet/bin/ressource (ne l'avez pas réduit, le mien est dans les deux et j'en suis satisfait), vous devez utiliser ceci comme chemin:

//Eclipse test path
String url = "jdbc:sqlite:resource/mydb.db";

ou

//runnable jar path
String url = "jdbc:sqlite::resource:mydb.db";

puis

mysqlitedatasource.setUrl(url);

Votre chemin fonctionne aussi ... en mettant la base de données dans/src

3
tricknology