Amorçage à ressort: est-il possible d'utiliser une application externe.les propriétés des fichiers dans des répertoires arbitraires avec un gros pot?

Est-il possible d'avoir des applications multiples.fichier de propriétés? ( EDIT : notez que cette question a évolué vers celle du titre.)

j'ai essayé d'avoir 2 fichiers.

  • le premier est sur le dossier racine dans le pot d'application.
  • le second est sur le répertoire qui est spécifié dans classpath.

2 fichiers sont tous les deux nommés "application.propriété.'

est-il possible de "fusionner" le contenu des deux fichiers? (et la valeur de la propriété de la seconde l'emporte sur celle de la première) ou, si j'ai un fichier, alors l'autre fichier est ignoré?

UPDATE 1 : il est possible de "fusionner" le contenu. Hier, il semblait que le premier avait été ignoré, mais il semble que c'est parce que quelque chose était cassé alors. Maintenant il fonctionne bien.

Maj 2 : C'est de retour! Encore une fois, un seul des deux dossiers est appliqué. C'est étrange... Il a commencé après que j'ai construit le fichier app jar en utilisant la suite D'outils de ressort. Et il semble que la version Jar ignore toujours la seconde (dans classpath), alors que le comportement de la version étendue qui tourne sur STS varie. Où puis-je commencer à enquêter?

UPDATE 3 :

le comportement de la version Jar était fait correct. C'est la spécification de java.EXE. Lorsque l'option-jar est spécifiée, java.exe ignore à la fois l'option-classpath et la variable D'environnement CLASSPATH, et classpath ne contiendra que le fichier jar. Donc, la deuxième application.le fichier de propriétés sur classpath est ignoré.

Maintenant, comment puis-je laisser la deuxième application.propriétés sur le chemin classepath être chargé?

UPDATE 4 :

j'ai réussi à charger un application.fichier de propriétés dans le chemin externe en utilisant l'option-jar.

la clé était PropertiesLauncher.

Pour utiliser PropertiesLauncher, pom.fichier xml doit être modifié comme ceci:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>  <!-- added -->
                <layout>ZIP</layout> <!-- to use PropertiesLaunchar -->
            </configuration>
        </plugin>
    </plugins>
</build>

pour cela, j'ai fait référence à la question suivante de StackOverflow: lanceur de propriétés de botte à ressort incapable d'utiliser . BTW, Au Printemps de Démarrage Plugin Maven document( http://docs.spring.io/spring-boot/docs/1.1.7.RELEASE/maven-plugin/repackage-mojo.html ), il n'y a aucune mention précisant que les déclencheurs ZIP que PropertiesLauncher est utilisé. (Peut-être dans un autre document?)

après que le fichier jar ait été construit, je pouvais voir que le PropertiesLauncher est utilisé en inspectant la propriété de classe principale dans META-INF/MENIFEST.MF dans le bocal.

maintenant, je peux exécuter le pot comme suit (dans Windows):

java -Dloader.path=file:///C:/My/External/Dir,MyApp-0.0.1-SNAPSHOT.jar -jar MyApp-0.0.1-SNAPSHOT.jar

notez que le fichier application jar est inclus dans loader.chemin.

maintenant une application.fichier de propriétés C:MyExternalDirconfig il est chargé.

en bonus, n'importe quel fichier (par exemple, un fichier html statique) dans ce répertoire peut aussi être consulté par le jar puisqu'il est dans le chemin du chargeur.

quant à la version non-jar (expanded) mentionnée dans la mise à jour 2, Il y avait peut-être un problème d'ordre classpath.

(BTW, j'ai changé le titre de la question pour être plus spécifique à cette question.)

45
demandé sur Community 2014-10-01 15:53:27

8 réponses

si vous n'avez pas modifié les valeurs par défaut de la botte de printemps (c'est-à-dire que vous utilisez @EnableAutoConfiguration ou @SpringBootApplication et que vous n'avez pas modifié la gestion des sources de propriété), alors elle cherchera des propriétés avec l'ordre suivant (le plus élevé l'emporte sur le plus bas):

  1. a /config subdivision de l'annuaire courant
  2. Le répertoire courant
  3. Un classpath /config package
  4. le chemin de La classe racine

la liste ci-dessus est mentionnée dans cette partie de la documentation

cela signifie que si une propriété est trouvée par exemple application.properties sous src/resources , elle sera remplacée par une propriété portant le même nom que celle trouvée dans application.properties dans le répertoire /config qui est" suivant " du bocal emballé.

cet ordre par défaut utilisé by Spring Boot permet une externalisation très facile de la configuration, qui à son tour rend les applications faciles à configurer dans plusieurs environnements (dev, staging, production, cloud etc)

pour voir l'ensemble des fonctionnalités fournies par la botte de printemps pour la lecture de propriétés (indice: il y a beaucoup plus disponible que la lecture de application.properties ) consultez cette partie de la documentation.

comme on peut le voir dans ma brève description au-dessus ou à partir de la documentation complète, les applications de démarrage à ressort sont très conviviales pour les développeurs!

40
répondu geoand 2016-03-15 07:45:24

tout est expliqué ici dans les docs:

http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

ce qui explique que c'est l'ordre de priorité:

  • /config sous répertoire du répertoire courant.
  • Le répertoire courant
  • paquet classpath /config
  • le chemin de La classe racine

il souligne également que vous pouvez définir des fichiers de propriétés supplémentaires pour les dérogations comme cela:

java -jar myproject.jar 
    --spring.config.location=classpath:/overrides.properties

si vous utilisez spring.config.location , alors tous les emplacements par défaut pour application.properties sont également inclus. Cela signifie que vous pouvez configurer les valeurs par défaut dans application.properties et outrepasser comme requis pour un environnement particulier.

13
répondu Steve 2014-10-01 13:05:43

vous seriez en mesure de lancer votre application de démarrage de printemps avec le chemin du fichier de propriétés externes comme suit:

java -jar {jar-file-name}.jar 
--spring.config.location=file:///C:/{file-path}/{file-name}.properties
7
répondu Krishna Kuntala 2015-07-22 09:41:56

j'ai réussi à charger une application.fichier de propriétés dans le chemin externe en utilisant l'option-jar.

la clé était PropertiesLauncher.

Pour utiliser PropertiesLauncher, pom.fichier xml doit être modifié comme ceci:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>  <!-- added -->
                <layout>ZIP</layout> <!-- to use PropertiesLaunchar -->
            </configuration>
        </plugin>
    </plugins>
</build>

pour cela, j'ai fait référence à la question suivante de StackOverflow: lanceur de propriétés de botte à ressort incapable d'utiliser . BTW, Au Printemps de Démarrage Plugin Maven document( http://docs.spring.io/spring-boot/docs/1.1.7.RELEASE/maven-plugin/repackage-mojo.html ), il n'y a aucune mention précisant que les déclencheurs ZIP que PropertiesLauncher est utilisé. (Peut-être dans un autre document?)

après que le fichier jar ait été construit, je pouvais voir que le PropertiesLauncher est utilisé en inspectant la propriété de classe principale dans META-INF/MENIFEST.MF dans le bocal.

maintenant, je peux exécuter le pot comme suit(dans Windows):

java -Dloader.path=file:///C:/My/External/Dir,MyApp-0.0.1-SNAPSHOT.jar -jar MyApp-0.0.1-SNAPSHOT.jar

notez que le fichier application jar est inclus dans loader.chemin.

maintenant une application.fichier de propriétés C:\My\External\Dir\config il est chargé.

en bonus, n'importe quel fichier (par exemple, un fichier html statique) dans ce répertoire peut aussi être consulté par le jar puisqu'il est dans le chemin du chargeur.

quant à la version non-jar (expanded) mentionnée dans la mise à jour 2, Il y avait peut-être un problème d'ordre classpath.

7
répondu zeodtr 2018-04-02 07:51:42
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <layout>ZIP</layout> 
            </configuration>
        </plugin>
    </plugins>
</build>

java -Dloader.path=file:///absolute_path/external.jar -jar example.jar
2
répondu Ravindranath Akila 2016-11-14 03:03:04

cela peut arriver en retard mais je pense que j'ai trouvé une meilleure façon de charger les configurations externes surtout quand vous utilisez votre application de démarrage à ressort en utilisant java jar myapp.war au lieu de @PropertySource ("classpath:some.propriétés")

la configuration serait chargée de la racine du projet ou de l'endroit où le fichier war/jar est lancé

public class Application implements EnvironmentAware {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void setEnvironment(Environment environment) {
        //Set up Relative path of Configuration directory/folder, should be at the root of the project or the same folder where the jar/war is placed or being run from
        String configFolder = "config";
        //All static property file names here
        List<String> propertyFiles = Arrays.asList("application.properties","server.properties");
        //This is also useful for appending the profile names
        Arrays.asList(environment.getActiveProfiles()).stream().forEach(environmentName -> propertyFiles.add(String.format("application-%s.properties", environmentName))); 
        for (String configFileName : propertyFiles) {
            File configFile = new File(configFolder, configFileName);
            LOGGER.info("\n\n\n\n");
            LOGGER.info(String.format("looking for configuration %s from %s", configFileName, configFolder));
            FileSystemResource springResource = new FileSystemResource(configFile);
            LOGGER.log(Level.INFO, "Config file : {0}", (configFile.exists() ? "FOund" : "Not Found"));
            if (configFile.exists()) {
                try {
                    LOGGER.info(String.format("Loading configuration file %s", configFileName));
                    PropertiesFactoryBean pfb = new PropertiesFactoryBean();
                    pfb.setFileEncoding("UTF-8");
                    pfb.setLocation(springResource);
                    pfb.afterPropertiesSet();
                    Properties properties = pfb.getObject();
                    PropertiesPropertySource externalConfig = new PropertiesPropertySource("externalConfig", properties);
                    ((ConfigurableEnvironment) environment).getPropertySources().addFirst(externalConfig);
                } catch (IOException ex) {
                    LOGGER.log(Level.SEVERE, null, ex);
                }
            } else {
                LOGGER.info(String.format("Cannot find Configuration file %s... \n\n\n\n", configFileName));

            }

        }
    }

}

J'espère que ça aidera.

0
répondu JohnTheBeloved 2016-06-17 08:08:58

une autre méthode flexible utilisant classpath contenant de la graisse jar (- cp fat.jar) ou tous les jars (-cp "$JARS_DIR/*") et un autre classpath de configuration personnalisé ou un dossier contenant des fichiers de configuration habituellement ailleurs et à l'extérieur de jar. Ainsi, au lieu du java-jar limité, utilisez la méthode classpath plus flexible comme suit:

java \
   -cp fat_app.jar \ 
   -Dloader.path=<path_to_your_additional_jars or config folder> \
   org.springframework.boot.loader.PropertiesLauncher

Voir Spring-boot exécutable jar doc et ce lien

Si vous avez MainApps multiples qui est commun, vous pouvez utiliser Comment dire à Spring Boot quelle classe principale utiliser pour l'exécutable jar?

vous pouvez ajouter des emplacements supplémentaires en définissant une variable D'environnement LOADER_PATH ou loader.chemin dans Chargeur.propriétés (liste de répertoires, archives ou répertoires séparés par des virgules dans les archives). Fondamentalement chargeur.le chemin fonctionne à la fois pour java-jar et pour java-cp.

et comme toujours vous pouvez outrepasser et exactement préciser l'application.yml il devrait ramassage fin de débogage

--spring.config.location=/some-location/application.yml --debug
0
répondu kisna 2018-01-19 04:51:46

Solution pour le fichier yml:

1.Copier yml dans le même répertoire que jar application

2.Exécuter la commande, par exemple pour xxx.yml :

java -jar app.jar --spring.config.location=xxx.yml

cela fonctionne très bien, mais au démarrage logger est INFO:

No active profile set .........
0
répondu Piotr R 2018-03-19 08:16:01