variable modificar java_home entorno crear configurar java spring environment-variables

modificar - variables de entorno java windows 10



cómo leer la variable de entorno del sistema en Spring applicationContext (12)

¿Cómo leer la variable de entorno del sistema en el contexto de la aplicación?

Quiero algo como:

<util:properties id="dbProperties" location="classpath:config_DEV/db.properties" />

o

<util:properties id="dbProperties" location="classpath:config_QA/db.properties" />

dependiendo del entorno.

¿Puedo tener algo así en mi aplicación Contexto?

<util:properties id="dbProperties" location="classpath:config_${systemProperties.env}/db.properties" />

donde el valor real se establece en función del SISTEMA MEDIO AMBIENTE VARIABLE

Estoy usando Spring 3.0


Así es como lo haces:

<bean id="systemPrereqs" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" scope="prototype"> <property name="targetObject" value="#{@systemProperties}" /> <property name="targetMethod" value="putAll" /> <property name="arguments"> <util:properties> <prop key="deployment.env">dev</prop> </util:properties> </property> </bean>

Pero recuerda que la primavera se carga primero y luego carga este bean MethodInvokingFactoryBean. Entonces, si está tratando de usar esto para su caso de prueba, asegúrese de usar depends-on. Por ejemplo, en este caso

En caso de que lo esté utilizando para su clase principal, mejor configurar esta propiedad usando su pom.xml como

<systemProperty> <name>deployment.env</name> <value>dev</value> </systemProperty>


Declare el titular del lugar de la propiedad de la siguiente manera

<bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> <property name="locations"> <list> <value>file:///path.to.your.app.config.properties</value> </list> </property> </bean>

Entonces digamos que quiere leer System.property("java.io.tmpdir") para su bean Tomcat o cualquier bean, luego agregue following en su archivo de propiedades:

tomcat.tmp.dir=${java.io.tmpdir}


En su definición de bean, asegúrese de incluir "searchSystemEnvironment" y configurarlo en "true". Y si lo está usando para crear una ruta a un archivo, especifíquelo como un archivo: /// url.

Entonces, por ejemplo, si tiene un archivo de configuración ubicado en

/testapp/config/my.app.config.properties

luego establece una variable de entorno así:

MY_ENV_VAR_PATH=/testapp/config

y tu aplicación puede cargar el archivo usando una definición de bean como esta:

p.ej

<bean class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer"> <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> <property name="searchSystemEnvironment" value="true" /> <property name="searchContextAttributes" value="true" /> <property name="contextOverride" value="true" /> <property name="ignoreResourceNotFound" value="true" /> <property name="locations"> <list> <value>file:///${MY_ENV_VAR_PATH}/my.app.config.properties</value> </list> </property> </bean>


Estás cerca: o) Spring 3.0 agrega Spring Expression Language . Puedes usar

<util:properties id="dbProperties" location="classpath:config_#{systemProperties[''env'']}/db.properties" />

Combinado con java ... -Denv=QA debería resolver su problema.

Tenga en cuenta también un comentario por @yiling:

Para acceder a la variable de entorno del sistema, es decir, a las variables de nivel de sistema operativo como amee comment, podemos simplemente usar "systemEnvironment" en lugar de "systemProperties" en ese EL. Me gusta #{systemEnvironment[''ENV_VARIABLE_NAME'']}


Gracias a @Yiling. Esa fue una pista.

<bean id="propertyConfigurer" class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer"> <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> <property name="searchSystemEnvironment" value="true" /> <property name="locations"> <list> <value>file:#{systemEnvironment[''FILE_PATH'']}/first.properties</value> <value>file:#{systemEnvironment[''FILE_PATH'']}/second.properties</value> <value>file:#{systemEnvironment[''FILE_PATH'']}/third.properties</value> </list> </property> </bean>

Después de esto, debe tener una variable de entorno llamada ''FILE_PATH''. Asegúrese de reiniciar su máquina después de crear esa variable de entorno.


Para mi caso de uso, necesitaba acceder solo a las propiedades del sistema, pero proporcionar valores predeterminados en caso de que no estén definidos.

Así es como lo haces:

<bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> <property name="searchSystemEnvironment" value="true" /> </bean> <bean id="myBean" class="path.to.my.BeanClass"> <!-- can be overridden with -Dtest.target.host=http://whatever.com --> <constructor-arg value="${test.target.host:http://localhost:18888}"/> </bean>


Para obtener un valor de la variable del sistema, Simpy usa el siguiente código:

System.getenv("property-name");


Puede mencionar sus atributos de variable en un archivo de propiedades y definir archivos de propiedad específicos del entorno como local.properties, production.propertied, etc.

Ahora, en función del entorno, uno de estos archivos de propiedades puede leerse en uno de los oyentes invocados al inicio, como el ServletContextListener.

El archivo de propiedad contendrá los valores específicos del entorno para varias claves.

Muestra "local.propeties"

db.logsDataSource.url=jdbc:mysql://localhost:3306/logs db.logsDataSource.username=root db.logsDataSource.password=root db.dataSource.url=jdbc:mysql://localhost:3306/main db.dataSource.username=root db.dataSource.password=root

Muestra "production.properties"

db.logsDataSource.url=jdbc:mariadb://111.111.111.111:3306/logs db.logsDataSource.username=admin db.logsDataSource.password=xyzqer db.dataSource.url=jdbc:mysql://111.111.111.111:3306/carsinfo db.dataSource.username=admin db.dataSource.password=safasf@mn

Para usar este archivo de propiedades, puede hacer uso de REsource como se menciona a continuación

PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer(); ResourceLoader resourceLoader = new DefaultResourceLoader(); Resource resource = resourceLoader.getResource("classpath:"+System.getenv("SERVER_TYPE")+"DB.properties"); configurer.setLocation(resource); configurer.postProcessBeanFactory(beanFactory);

SERVER_TYPE se puede definir como la variable de entorno con los valores apropiados para el entorno local y de producción.

Con estos cambios, appplicationContext.xml tendrá los siguientes cambios

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="${db.dataSource.url}" /> <property name="username" value="${db.dataSource.username}" /> <property name="password" value="${db.dataSource.password}" />

Espero que esto ayude .



Sí, puede hacer <property name="defaultLocale" value="#{ systemProperties[''user.region'']}"/> por ejemplo.

La variable systemProperties está predefinida, ver 6.4.1 Configuración basada en XML .


Usando Spring EL puede escribir un ejemplo de la siguiente manera

<bean id="myBean" class="path.to.my.BeanClass"> <!-- can be overridden with -Dtest.target.host=http://whatever.com --> <constructor-arg value="#{systemProperties[''test.target.host''] ?: ''http://localhost:18888''}"/> </bean>


Hoy en día puedes poner

@Autowired private Environment environment;

en su @Component , @Bean , etc., y luego acceda a las propiedades a través de la clase Environment :

environment.getProperty("myProp");

Para una sola propiedad en @Bean

@Value("${my.another.property:123}") // value after '':'' is the default Integer property;

Otra forma son los prácticos beans @ConfigurationProperties :

@ConfigurationProperties(prefix="my.properties.prefix") public class MyProperties { // value from my.properties.prefix.myProperty will be bound to this variable String myProperty; // and this will even throw a startup exception if the property is not found @javax.validation.constraints.NotNull String myRequiredProperty; //getters } @Component public class MyOtherBean { @Autowired MyProperties myProperties; }

Nota: Recuerde reiniciar Eclipse después de establecer una nueva variable de entorno