web-dev-qa-db-fra.com

Spécification du chemin relatif dans application.properties dans Spring

Existe-t-il un moyen de rechercher des ressources de fichier en utilisant un chemin relatif dans le fichier application.properties dans l'application de démarrage Spring, comme indiqué ci-dessous

spring.datasource.url=jdbc:hsqldb:file:${project.basedir}/db/init
7
Somasundaram Sekar

J'utilise Spring Boot pour créer un exemple de téléchargement et rencontre le même problème. Je souhaite uniquement obtenir le chemin racine du projet. (par exemple/sring-boot-upload)

Je découvre que le code ci-dessous fonctionne:

upload.dir.location=${user.dir}\\uploadFolder
5
chendu

La réponse de @membersound consiste simplement à diviser le chemin codé en dur en 2 parties, sans résolution dynamique de la propriété. Je peux vous dire comment réaliser ce que vous recherchez, mais vous devez comprendre qu’il existeNOproject.basedir lorsque vous exécutez l’application en tant que pot ou guerre. En dehors de l'espace de travail local, la structure de code source n'existe pas.

Si vous voulez toujours faire cela pour les tests, c'est faisable et vous avez besoin de manipuler les PropertySources. Votre option la plus simple est la suivante:

Définissez une ApplicationContextInitializer et définissez la propriété à cet endroit. Quelque chose comme ce qui suit:

    public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
    @Override
    public void initialize(ConfigurableApplicationContext appCtx) {
        try {
            // should be /<path-to-projectBasedir>/build/classes/main/
            File pwd = new File(getClass().getResource("/").toURI());
            String projectDir = pwd.getParentFile().getParentFile().getParent();
            String conf = new File(projectDir, "db/init").getAbsolutePath();
            Map<String, Object> props = new HashMap<>();
            props.put("spring.datasource.url", conf);
            MapPropertySource mapPropertySource = new MapPropertySource("db-props", props);
            appCtx.getEnvironment().getPropertySources().addFirst(mapPropertySource);
        } catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }
    }}

On dirait que vous utilisez Boot, donc vous pouvez simplement déclarer context.initializer.classes=com.example.MyApplicationContextInitializer dans votre application.properties et Boot exécutera cette classe au démarrage.

Mise en garde encore:

  1. Cela ne fonctionnera pas en dehors de l'espace de travail local car cela dépend de la structure du code source.

  2. J'ai supposé une structure de projet Gradle ici /build/classes/main. Si nécessaire, ajustez-le en fonction de votre outil de construction.

  3. Si MyApplicationContextInitializer est dans le src/test/Java, pwd sera <projectBasedir>/build/classes/test/, pas <projectBasedir>/build/classes/main/.

4
Abhijit Sarkar
your.basedir=${project.basedir}/db/init
spring.datasource.url=jdbc:hsqldb:file:${your.basedir}

@Value("${your.basedir}")
private String file;

new ClassPathResource(file).getURI().toString()
0
membersound