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
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
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 PropertySource
s. 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:
Cela ne fonctionnera pas en dehors de l'espace de travail local car cela dépend de la structure du code source.
J'ai supposé une structure de projet Gradle ici /build/classes/main
. Si nécessaire, ajustez-le en fonction de votre outil de construction.
Si MyApplicationContextInitializer
est dans le src/test/Java
, pwd
sera <projectBasedir>/build/classes/test/
, pas <projectBasedir>/build/classes/main/
.
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()