Plik txt dołączony do projektu - brak po utworzeniu JAR

0

Witam
Tworzę aplikację do łączenia się z bazą MySql. Używam Intellij IDEA. Dane do połączenia z bazą danych umieściłem w pliku database.txt, który umieściłem w katalogu głównym projektu, Jest on oczywiście dodany do .gitignore. Dostęp do niego uzyskuje tak:

Scanner scFile = new Scanner(new File("database.txt"));

Wszystko działa z poziomu kompilatora spod Intellij. Po akcji Build Artifact tworzy plik jar. Gdy go uruchamiam wyrzuca wyjątek:
java.io.FileNotFoundException: database.txt (Nie można odnaleźć określonego pliku).

Wstępnie pokonałem ten problem tworząc zezwnętrzny katalog C:\Resources i umieszczając w nim database.txt.
Potem Project Structure -> Modules -> Sources->Add Content Root i wskazanie na powyższy katalog. Dostęp do pliku wygląda tak:

Scanner scFile = new Scanner(new File("C:\Resources\database.txt"));

Teraz po utworzeniu pliku jar odpala bez problemu. I wszystko było by ok, tylko ścieżka dostępu jest typowa dla Windows, a projekt ten będzie edytowany również na Linuksie (poprzez github).
Jak uzyskać dostęp do database.txt po utworzeniu jar zachowując uniwersalny zapis ścieżki dostępu do tego pliku?

1

Twój kod wczytuje plik z filesystemu, więc jest niezbyt przenośny bez takich sztuczek jakie robisz z zewnętrznym katalogiem.
Musisz dodać ten plik do src/main/resources (jeśli budujesz używając Maven albo Gradle) aby znalazł się wewnątrz JAR i w efekcie na classpath podczas działania aplikacji.
Potem możesz dostać się do niego poprzez np. getClass().getResourceAsStream("/database.txt").

Możesz też rozważyć opcję zostawienia wczytywania pliku z filesystemu dodając jakiś parametr którym osoba odpalająca aplikację może wskazać gdzie plik konfiguracyjny się znajduje.

Edit: Jeśli budujesz używając jedynie Intellij to chyba wystarczy plik umieścić w src żeby znalazł się w wynikowym JAR

0

Nie używam Maven ani Gradle. Teraz sobie pomyślałem, żeby dorzucić klasę, np: Database z polem String zawierającym dane połączenia z MySql i zniego zaciągnąć Stringa. Oznaczyć tą klasę w .gitignore i taki łatany sposób będzie działał.
Tak na marginesie, jakie są dobre zwyczaje i sposoby trzymania takich danych konfiguracyjnych w kodzie? (Nie jestem zwolennikiem takich praktyk odnośnie haseł i innych poświadczeń).

Dodanie do src nic nie zmienia

1

Tak na marginesie, jakie są dobre zwyczaje i sposoby trzymania takich danych konfiguracyjnych w kodzie?

Albo masz obok jara plik application.properties który zawiera takie informacje i ten plik jest wrzucany na serwer razem z jarem (nie jest w repo!), albo takie parametry przekazuje sie przez zmienne środowiskowe.

0

Tak dla potomnych:
Utworzyłem katalog Resources w gałęzi 'src', obok folderu z klasami projektu. następnie:
File->Project Structure->Modules
Zaznaczyłem utworzony folder Resources i wybrałem Marks as: Resources powyżej. Do folderu wrzuciłem database.txt z ignorem dla githuba.
Dostęp do pliku z kodu:

InputStream fileStream = MySQLConn.class.getResourceAsStream("/database.txt");
    Scanner openFile = new Scanner(fileStream);

Zamiast MySQLConn można dać this lub nazwę rodzimej klasy.
i to wszystko.
Dziękuję za pomoc i sugestie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1