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 .
Revisa este artículo . Le ofrece varias formas de hacerlo, a través del PropertyPlaceholderConfigurer
que admite propiedades externas (a través de la propiedad systemPropertiesMode
)
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