2013-03-03 14 views
8

Używam JAVA (z eclipse juno) i próbuję utworzyć plik wykonywalny JAR, który zawiera plik DB sqlite. mam spróbować uzyskać połączenie z PB tej linii:add sqlite DB do pliku wykonywalnego JAR

DriverManager.getConnection("jdbc:sqlite:"+DataController.class.getResource("test.sqlite").getPath()) 

The DataController jest klasa, która znajduje się gdzie zlokalizował SQLite.

i ciągle pojawia się błąd:

java.sql.SQLException: invalid database address 

Czy ktoś może pomóc i dać krok po kroku instrukcje dotyczące sposobu obejmują sqlite DB wewnątrz wykonywalnego pliku JAR?

+0

Ten błąd występuje, gdy podany adres URL bazy danych jest nieprawidłowy. Spróbuj wydrukować ciąg, który dasz 'getConnection()' –

+0

Już go wydrukowałem i jest to dokładna ścieżka do sqlite DB. – gran33

Odpowiedz

10

Podobno sqlite-jdbc może otwierać zasoby samodzielnie. W tym wątku https://groups.google.com/forum/?fromgroups=#!topic/xerial/Oayzj5nrJGk dodaj: resource do ścieżki. Więc spróbuj wykonać następujące czynności: pakiet

DriverManager.getConnection("jdbc:sqlite::resource:package/test.sqlite"); 

zamienić na „/” oddzielone ścieżki do pakietu Ten plik jest w

Należy pamiętać, że będzie to rzeczywiście skopiować plik do tmp directory.-

.
+0

Przeczytałem, że przy użyciu jdbc: sqlite :: resource: db jest tylko do odczytu. – Paolo

+0

Jeśli twoja baza danych (jak moja) znajduje się w katalogu * resources * twojego projektu, wystarczy następujący ciąg połączenia: 'jdbc: sqlite :: resource: test.sqlite' lub' jdbc: sqlite :: resource: test .db' w zależności od twojej wersji SQLite.Spędziłem zbyt dużo czasu, próbując to rozgryźć. dodanie 'resource' do identyfikatora URI sprawiło, że działał, ponieważ bez niego sterownik zakłada, że ​​twoja db znajduje się w tym samym katalogu co plik, który się z nim łączy. –

+0

Podążam tą ścieżką i otrzymuję wyjątek java.sql.SQLException: resource quanlythuchi3.sqlite nie znaleziony: java.net.MalformedURLException: no protocol: MyDB.sqlite – Andiana

0

Droga jest właściwa . I te wyjaśnienia pomogą, jeśli używasz ::resource, ale nadal dostaniesz błędy takie jak resource database.db not found: java.net.MalformedURLException: no protocol: database.db jak verdana.

Najczęściej anwsers są: DriverManager.getConnection("jdbc:sqlite::resource:path/to/database.db")

Jednak path/to/database.db musi być dokładna ścieżka (ścieżka w rzeczywistym systemie pliku, ale nie w Jar) do pliku jar.

polecam użyć getClass().getResource():

DriverManager.getConnection("jdbc:sqlite::resource:" + 
     getClass().getResource("/path/to/db/in/the/jar/file")) 

UWAGA: the /path/to/db/in/the/jar/file część musi zacząć /

0

Nie jestem pewien, czy to się zmieniło w ostatnich wersjach JDBC, ale po bawiąc przez około godzinę i uzyskiwanie różnych wyjątków (MalformedURLException i "Baza danych została zamknięta") okazało się, że dla mnie zadziałało:

DriverManager.getConnection("jdbc:sqlite::resource:file:/path/to/database.db") 

Plik: file: porcja wydaje się brakować w innych odpowiedzi i nie mógłbym go uruchomić bez niego.

Należy również pamiętać, że

/path/to/database.db 

jest ścieżka bezwzględna począwszy od korzenia do pliku .jar, zamiast normalnego korzenia zasobów.

Powiązane problemy