El paquete java-jar jar comienza con variables de entorno (parámetros)

necesidad

Podemos compilar un proyecto java en un jar o convertirlo en una guerra. Generalmente, arrojaré el paquete de guerra en el contenedor de Tomcat e iniciaré Tomcat para acceder al servicio. Los puertos, certificados SSL, registros, etc., están todos confiados a Tomcat. .

Si es un paquete jar, generalmente lo inicio con nohup. Por ejemplo, algunos secretos de db, redis y de terceros en el entorno de producción no se configurarán en el proyecto. Lo que quiero dejar constancia hoy es cómo iniciar el paquete jar con nohup java -jar Problema al cargar la configuración de la variable de entorno.

Cuando se inicia el paquete jar desarrollado por el lenguaje Java, los parámetros de inicio se pueden agregar de la siguiente manera.

Método 1: -DpropName=propValor

Esta forma debería estar disponible pronto

-DpropName=propValue

Por ejemplo:

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

También son posibles múltiples parámetros.

Método 2: los parámetros siguen el comando directamente y varios parámetros están separados por espacios

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

Los parámetros de este método son los parámetros args del método principal en la clase de inicio principal en el paquete jar, en orden

Método 3: Usando el método springboot, --propName=propValue method

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

Nota:
Especifique el puerto cuando ejecute el paquete jar: java -jar xxx.jar --server.port=8088
Si el servidor.puerto pasado desde la línea de comando no tiene efecto, el servicio aún comenzará a usar el puerto 8081 porque spring- cloud-config lo sobrescribirá Los parámetros pasados ​​desde la línea de comando, esto es intencional,

La forma es hacer un pequeño cambio en web-prod.yml para que la "configuración" sea "configurable": agregue un par de llaves

server.port={port:8081}

Hay sorpresas en el frasco elaborado con clojure

La configuración en clojure se vuelve extraña. ¿Adivina si la siguiente configuración puede tener efecto?

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

Si cider-conectse conecta a su servicio a través del puerto de nrepl, encontrará que database-urlel valor causado por esta configuración sí ha cambiado, pero los dos últimos no.

El motivo es que usamos java para obtener parámetros del classpath en forma de propiedades, es decir, en formato json. Esto no es difícil de entender, la primavera tiene su propio camino y, por supuesto, el clojure también tiene su propio camino.

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

Aunque json es muy similar al mapa en nuestra edn, son diferentes después de todo, por lo que debemos analizar cómo lee la información de configuración en la edn actual.

env en el código

configEnv se encontró en este espacio de nombres

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

configuración de carga cprop

cprop.sourceEste archivo se utiliza para cargar el archivo 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 {}))))

Desde la perspectiva del proceso de adquisición, debe _desconectarse como un nodo de unidad, por lo que debe cambiarse a este

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

Correspondiente a edn debe ser

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

No es difícil de entender si echa un vistazo más de cerca a la biblioteca cprop .
El orden en que cprop carga los archivos de configuración es:

De forma predeterminada, cprop fusionará todas las configuraciones que pueda encontrar en el siguiente orden: archivo
de configuración de recursos classpath
en un sistema de archivos (señalado por una propiedad del sistema conf o por (load-config :file <ruta>))
configuraciones personalizadas, mapas de varias fuentes , etc.
Propiedades del sistema
Variables ENV

También hay instrucciones claras para cargar ENV

Las variables ENV carecen de estructura. La única forma de imitar la estructura es mediante el uso de un carácter de subrayado. El _ se convierte en - por cprop, por lo que en su lugar, para identificar el anidamiento, se pueden usar dos guiones bajos.

Para obtener más detalles, lea la introducción de cprop

mis expectativas

Si el comando anterior tiene 20 parámetros que deben especificarse en Qidong, se estima que mirar ese comando lo volverá loco. ¿Puede especificar un archivo de configuración en Qidong, como prod-config.edn? No lo encontré, sería más conveniente si lo hay.

referencia

cprop



Autor: Xiaoma cruzará el río
Enlace: https://www.jianshu.com/p/fed7a174bfb8
Fuente: Jianshu
Los derechos de autor pertenecen al autor. Para reimpresión comercial, comuníquese con el autor para obtener autorización, para reimpresión no comercial, indique la fuente.

Supongo que te gusta

Origin blog.csdn.net/zhongguowangzhan/article/details/128354032
Recomendado
Clasificación