Le package jar java-jar commence par des variables d'environnement (paramètres)

besoin

On peut compiler un projet java dans un jar ou le traduire en war.Généralement, je vais jeter le paquet war dans le conteneur tomcat et lancer tomcat pour accéder au service.Les ports, les certificats SSL, les logs, etc. sont tous confiés à tomcat .

S'il s'agit d'un package jar, je le démarre généralement avec nohup.Par exemple, certains secrets db, redis et tiers dans l'environnement de production ne seront pas configurés dans le projet.Ce que je veux enregistrer aujourd'hui, c'est comment démarrer le jar package avec nohup java -jar Problème lors du chargement de la configuration de la variable d'environnement.

Lorsque le package jar développé par le langage java est démarré, les paramètres de démarrage peuvent être ajoutés de la manière suivante.

Méthode 1 : -DpropName=propValue

Ce moyen devrait être disponible bientôt

-DpropName=propValue

Par exemple:

java -jar -DdatabaseUrl="mysql://localhost:3306/pdb?user=root&password=root"  -Dapp.key="123" -Dapp.secret="xxx"  demo.jar

Plusieurs paramètres sont également possibles.

Méthode 2 : les paramètres suivent directement la commande et plusieurs paramètres sont séparés par des espaces

java -jar demo.jar JOURNAL_TREENODE_DATA-20190404174502.txt processType=1

Les paramètres de cette méthode sont les paramètres args de la méthode principale dans la classe de démarrage principale du package jar, dans l'ordre

Méthode 3 : Utilisation de la méthode springboot, méthode --propName=propValue

java -jar demo.jar  --spring.profiles.active=dev  --server.port=8181

Remarque :
Spécifiez le port lors de l'exécution du package jar : java -jar xxx.jar --server.port=8088
Si le server.port transmis à partir de la ligne de commande n'a aucun effet, le service commencera toujours à utiliser le port 8081 car spring- cloud-config l'écrasera Les paramètres transmis depuis la ligne de commande, c'est intentionnel,

Le moyen est de faire un petit changement dans web-prod.yml pour rendre la "configuration" "configurable": ajouter une paire d'accolades

server.port={port:8081}

Il y a des surprises dans le pot développé avec clojure

La configuration sur clojure devient bizarre. Devinez si la configuration suivante peut prendre effet ?

java -jar -Ddatabase-url="mysql://localhost:3306/pdb?user=root&password=root"  -Dapp.key="123" -Dapp.secret="xxx"  demo.jar

Si vous vous cider-conectconnectez à votre service via le port de nrepl, vous constaterez que database-urlla valeur provoquée par cette configuration a bien été modifiée, mais pas les deux dernières.

La raison en est que nous utilisons java pour obtenir des paramètres du classpath sous forme de propriétés, c'est-à-dire au format json. Ce n'est pas difficile à comprendre, le printemps a son propre chemin, et bien sûr le clojure a aussi son propre chemin.

"app": {
    "key": "123",
    "secret":"xxx"
}

Bien que json soit très similaire à la carte de notre edn, ils sont finalement différents, nous devons donc analyser comment il lit les informations de configuration dans l'edn actuel ?

env dans le code

configEnv a été trouvé dans cet espace de noms

(defstate env
  :start
  (load-config
   :merge
   [(args)
    (source/from-system-props)
    (source/from-env)]))

configuration de charge cprop

cprop.sourceCe fichier est utilisé pour charger le fichier edn

(defn- env->path [k]
  (k->path k "_" #"__"))

(defn read-system-env
  ([]
   (read-system-env {}))
  ([opts]
   (->> (System/getenv)
        (map (fn [[k v]] [(env->path k)
                          (str->value v opts)]))
        (into {}))))

Du point de vue du processus d'acquisition, il doit être _déconnecté en tant que nœud d'unité, il doit donc être remplacé par celui-ci.

java -jar -Ddatabase-url="mysql://localhost:3306/pdb?user=root&password=root"  -Dapp_key="123" -Dapp_secret="xxx"  demo.jar

Correspondant à edn devrait être

{:app
    {:key "123"
     :secret "xxx"}}

Ce n'est pas difficile à comprendre si vous regardez de plus près la bibliothèque cprop .
L'ordre dans lequel cprop charge les fichiers de configuration est :

Par défaut, cprop fusionnera toutes les configurations qu'il peut trouver dans l'ordre suivant : fichier de
configuration des ressources classpath sur un système de fichiers (pointé par une propriété système conf ou par (load-config :file <chemin>)) configurations personnalisées, cartes provenant de diverses sources , etc. Propriétés système Variables ENV



Il existe également des instructions claires pour le chargement d'ENV

Les variables ENV manquent de structure. La seule façon d'imiter la structure consiste à utiliser un caractère de soulignement. Le _ est converti en - par cprop, donc à la place, pour identifier l'imbrication, deux traits de soulignement peuvent être utilisés.

Pour plus de détails, veuillez lire l'introduction de cprop

mes attentes

Si la commande ci-dessus a 20 paramètres qui doivent être spécifiés dans Qidong, on estime que regarder cette commande vous rendra fou. Pouvez-vous spécifier un fichier de configuration dans Qidong, tel que prod-config.edn ? Je ne l'ai pas trouvé, ce serait plus pratique s'il y en avait.

référence

cprop



Auteur : Xiaoma traversera la rivière
Lien : https://www.jianshu.com/p/fed7a174bfb8
Source : Jianshu
Le droit d'auteur appartient à l'auteur. Pour une réimpression commerciale, veuillez contacter l'auteur pour autorisation, pour une réimpression non commerciale, veuillez indiquer la source.

Guess you like

Origin blog.csdn.net/zhongguowangzhan/article/details/128354032
Recommended