Gdzie powinno przechowywać się plik properties?

0

Struktura projektu:
Properties.PNG
Aktualnie mam plik properties w katalogu resources. Gdzie najlepiej go umieścić, żeby później po stworzeniu jara/exe aplikacji nie było problemu ze znalezieniem ścieżki do pliku.

        String path = getClass().getResource("/db.properties").toString();
        Properties prop = new Properties();
        InputStream input = null;

        try {

            input = new FileInputStream(path);

            // load a properties file
            prop.load(input);

            // get the property value and print it out
            System.out.println(prop.getProperty("javax.persistence.jdbc.user"));

        } catch (IOException ex) {
            ex.printStackTrace();
        }

java.io.FileNotFoundException: file:\D:\Documents\IdeaProjects\inzL1G3\TaskManager\target\classes\db.properties (The filename, directory name or volume label syntax is incorrect)

Plik jest pod tą ścieżką:
prop2.PNG
Pytanie o co chodzi z tą nazwą?

1

Po co kombinujesz z plikami jak masz Class.getResourceAsStream? Jak będziesz miał JARka to plik będzie w środku, więc FileInputStream nie zadziała. Zostaw propertiesy w resources, ale ładuj za pomocą getResourceAsStream.

Ewentualnie, jeśli chcesz dawać możliwość edycji properties to skorzystaj z maven-assembly-plugin lub podobnych wynalazków i umieść JARka z aplikacją oraz plik properties w jednym ZIPie zawierającym całe assembly.

0

@Wibowit mam teraz resourceAsStream....

    private void loadProperties2(){

        String path = getClass().getResource("/db.properties").toString();
        Properties properties = null;

        try {
            properties = new Properties();
            InputStream resourceAsStream =  LoginController.class.getClassLoader().getResourceAsStream("db.properties");
            System.out.println(resourceAsStream);
            if (resourceAsStream != null) {
                properties.load(resourceAsStream);
                System.out.println(properties.getProperty("javax.persistence.jdbc.user"));
                tFUserDb.setText(properties.getProperty("javax.persistence.jdbc.user"));
                PFDb.setText(properties.getProperty("javax.persistence.jdbc.password"));
                tFUrlDb.setText(properties.getProperty("javax.persistence.jdbc.url"));
            }


        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 

Nullem też nie jest, bo dostaję:
java.io.BufferedInputStream@6a76dfa9 ale jak widać dalej w polach tekstowych nie pojawia się wartości.
sett.PNG

Po prostu najpierw chce wczytać te dane do tych pól tekstowych z tego pliku properties. Później o ile to możliwe chce zmienić jego zawartość, czyli ktoś wpisze inny url do bazy, klika save i plik properties zmienia swoją zawartość.

1
                System.out.println(properties.getProperty("javax.persistence.jdbc.user"));
                tFUserDb.setText(properties.getProperty("javax.persistence.jdbc.user"));

Jaki tekst widzisz w polu tekstowym, a jaki na konsoli?

0

@gcmarcin a co to za jakieś kombinacje alpejskie? zrób tak:

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>file:/users/wmf-cars/cars_runner/config/cars-dao-db.properties</value>
                <value>classpath:cars-dao-ldap.properties</value>
            </list>
        </property>
    </bean> 
0

Dzięki za odpowiedzi. Trudno mi to wytłumaczyć, ale wyłączyłem komputer, włączam kompa, odpalam projekt jeszcze raz żeby odpisać @bogdans i upewnić się, że na konsoli i pola dalej są puste, a tu zaskoczenie nagle działa. Wstyd się przyznać, ale nie wiem jak to się stało :D

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