স্প্রিং অ্যাপ্লিকেশনসন্টেক্সটে সিস্টেম এনভায়রনমেন্ট ভেরিয়েবল কীভাবে পড়বেন


116

অ্যাপ্লিকেশন প্রসঙ্গে সিস্টেম পরিবেশের পরিবর্তনশীল কীভাবে পড়বেন?

আমি এরকম কিছু চাই:

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

অথবা

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

পরিবেশের উপর নির্ভর করে।

আমার অ্যাপ্লিকেশন প্রসঙ্গে আমার কি এরকম কিছু থাকতে পারে?

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

যেখানে প্রকৃত ভালটি সিস্টেম পরিবেশ পরিবর্তনের উপর ভিত্তি করে সেট করা আছে

আমি স্প্রিং 3.0 ব্যবহার করছি

উত্তর:


51

এই নিবন্ধটি পরীক্ষা করুন । এটি আপনাকে PropertyPlaceholderConfigurerবাহ্যিক বৈশিষ্ট্যগুলি ( systemPropertiesModeসম্পত্তি হিসাবে) সমর্থন করে এর মাধ্যমে এটি করার বিভিন্ন উপায় দেয় ।


106

আপনার কাছাকাছি: o) স্প্রিং 3.0 3.0 স্প্রিং এক্সপ্রেশন ভাষা যুক্ত করে । তুমি ব্যবহার করতে পার

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

java ... -Denv=QAআপনার সমস্যার সমাধান করা উচিত এর সাথে সম্মিলিত ।

@ ইয়েলিংয়ের একটি মন্তব্যও নোট করুন:

অ্যামো মন্তব্য হিসাবে সিস্টেম এনভায়রনমেন্ট ভেরিয়েবল অ্যাক্সেস করতে, এটি ওএস স্তরের ভেরিয়েবলগুলি, আমরা সেই EL তে "systemProperties" এর পরিবর্তে "systemEnomot" ব্যবহার করতে পারি। মত #{systemEnvironment['ENV_VARIABLE_NAME']}


জাভা কি ... -ডেনভ = কিউ মানে?
টাটকা_দেব

2
আপনি একটি জাভা সিস্টেমের সম্পত্তি মান সেট করেছেন। আপনি এই মানটি কোডে পড়তে পারেনassert System.getProperty("env") == "QA";
আমড়া

আমি মনে করি এই উত্তরটি ভুল, এটি সিস্টেম পরিবেশের ভেরিয়েবলগুলি (যেমন ওএস-স্তরের ভেরিয়েবলগুলি সেট করা exportইত্যাদি) পড়ার অনুমতি দেয় না, এটি কেবল জাভা সিস্টেমের বৈশিষ্ট্যগুলি পড়ার অনুমতি দেয়।
amoe

2
-ড্রপ = ... কমান্ড লাইনে একটি জাভা সম্পত্তি সেট করে। আপনি এই সম্পত্তি মাধ্যমে পড়তে পারেন System.getProperty("prop")। আপনি যদি কোনও ওএস সম্পত্তি পড়তে চান তবে ব্যবহার করুন System.getenv("os-env-variable")। : Javadoc দেখুন docs.oracle.com/javase/6/docs/api/java/lang/System.html
আমড়া

22
অ্যামো মন্তব্য হিসাবে সিস্টেম এনভায়রনমেন্ট ভেরিয়েবল অ্যাক্সেস করতে, এটি ওএস স্তরের ভেরিয়েবলগুলি, আমরা সেই EL তে "systemProperties" এর পরিবর্তে "systemEnomot" ব্যবহার করতে পারি। লাইক #{systemEnvironment['ENV_VARIABLE_NAME']}
ইলিং

51

আজকাল আপনি রাখতে পারেন

@Autowired
private Environment environment;

আপনার @Component, @Beanইত্যাদিতে এবং তারপরে Environmentশ্রেণীর মাধ্যমে বৈশিষ্ট্যগুলি অ্যাক্সেস করুন :

environment.getProperty("myProp");

একটি একক সম্পত্তি জন্য একটি@Bean

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

আর একটি উপায় হ্যান্ড @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;
}

দ্রষ্টব্য: নতুন পরিবেশের ভেরিয়েবল সেট করার পরে গ্রহনটি পুনরায় আরম্ভ করার কথা মনে রাখবেন


1
ইন্টারভেসের মাধ্যমে এনভির ভেরিয়েবলগুলিও অ্যাক্সেসযোগ্য Environment?
নিখিল সাহু

@ নিখিলসাহু হ্যাঁ, তারা। আপনি java.lang.Systemযেমন জিজ্ঞাসা করার সময় যেমন কী দিয়েছিলেন তেমন কী দিয়ে আপনি তাদের অ্যাক্সেস করেন যেমন ধরুন যে ওএস টাইপটি আপনি env.getProperty("os.name")ধরে নিচ্ছেন যে envএটি হ'ল আপনার উদাহরণ org.springframework.core.env.Environment
নিনেটৌ

1
@Autowired private Environment environment;আমার Componentপরিবেশের জন্য কাজ করে না সর্বদা নাল
a_horse_with_no_name


8

আপনার মটরশুটি সংজ্ঞা, "অনুসন্ধান সিস্টেম" পরিবেশ "অন্তর্ভুক্ত এবং এটি" সত্য "হিসাবে সেট করা নিশ্চিত করুন। এবং যদি আপনি এটি কোনও ফাইলের পাথ তৈরি করতে ব্যবহার করে থাকেন তবে এটি ফাইল হিসাবে নির্দিষ্ট করুন: /// url।

সুতরাং উদাহরণস্বরূপ, যদি আপনার কাছে একটি কনফিগার ফাইল থাকে

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

তারপরে এমন পরিবেশের পরিবর্তনশীল সেট করুন:

MY_ENV_VAR_PATH=/testapp/config

এবং আপনার অ্যাপ্লিকেশনটি এভাবে বিনের সংজ্ঞা ব্যবহার করে ফাইলটি লোড করতে পারে:

যেমন

<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>

8

স্প্রিং ইএল ব্যবহার করে আপনি নীচের মত উদাহরণ লিখতে পারেন

<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>

5

আমার ব্যবহারের ক্ষেত্রে, কেবলমাত্র সিস্টেমের বৈশিষ্ট্যগুলিতে অ্যাক্সেস করা দরকার ছিল, তবে সেগুলি অপরিবর্তিত থাকলে ডিফল্ট মানগুলি সরবরাহ করে provide

আপনি এটি এইভাবে করেন:

<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>

4

নীচে সম্পত্তি স্থান ধারক ঘোষণা করুন

<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>

তারপরে বলুন যে আপনি System.property("java.io.tmpdir")নিজের টমক্যাট শিম বা যে কোনও শিমের জন্য পড়তে চান তারপরে আপনার সম্পত্তি ফাইলটিতে নিম্নলিখিতটি যুক্ত করুন:

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

1

আপনি এটি এইভাবে করেন:

<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>

তবে মনে রাখবেন বসন্তটি প্রথমে লোড হয় এবং তারপরে এটি এই মটর মেথডিনোভাকিং ফ্যাক্টরিবিয়ানটি লোড করবে। সুতরাং আপনি যদি নিজের পরীক্ষার ক্ষেত্রে এটি ব্যবহার করার চেষ্টা করছেন তবে নিশ্চিত হয়ে নিন যে আপনি নির্ভরশীল। যেমন এই ক্ষেত্রে

আপনি যদি আপনার পম.এক্সএমএল হিসাবে এই সম্পত্তিটি সেট করে আপনার মূল শ্রেণীর জন্য আরও ভাল ব্যবহার করেন

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

1

আপনি কোনও সম্পত্তি ফাইলগুলিতে আপনার পরিবর্তনশীল বৈশিষ্ট্যগুলি উল্লেখ করতে পারেন এবং পরিবেশ সম্পর্কিত নির্দিষ্ট সম্পত্তি ফাইলগুলি স্থানীয়.প্রপার্টি, প্রোডাকশন.প্রোপার্টিয়েড ইত্যাদি সংজ্ঞায়িত করতে পারেন

এখন পরিবেশের উপর ভিত্তি করে, এই সম্পত্তি ফাইলগুলির মধ্যে একটি সার্ভারকন্টেক্সটলাইস্টারের মতো শুরুতে অনুরোধ করা শ্রোতাদের মধ্যে একটিতে পড়তে পারে।

সম্পত্তি ফাইলটিতে বিভিন্ন কীগুলির জন্য পরিবেশের নির্দিষ্ট মান থাকবে।

"স্থানীয়.প্রযুক্তি" নমুনা

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

নমুনা "product.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

এই বৈশিষ্ট্যগুলির ফাইলটি ব্যবহার করার জন্য, আপনি নীচে উল্লিখিত হিসাবে রিসোর্স ব্যবহার করতে পারেন

        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 স্থানীয় এবং উত্পাদন পরিবেশের জন্য উপযুক্ত মান সহ পরিবেশের পরিবর্তনশীল হিসাবে সংজ্ঞায়িত করা যেতে পারে।

এই পরিবর্তনগুলির সাথে appplicationContext.xML এর নিম্নলিখিত পরিবর্তনগুলি হবে

<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}" />

আশাকরি এটা সাহায্য করবে .


1

ইয়েলকে ধন্যবাদ এটি একটি ইঙ্গিত ছিল।

<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>

এর পরে, আপনার কাছে 'FILE_PATH' নামে একটি পরিবেশের পরিবর্তনশীল থাকা উচিত। পরিবেশের পরিবর্তনশীল তৈরি করার পরে আপনি আপনার টার্মিনাল / আইডিই পুনরায় চালু করার বিষয়টি নিশ্চিত করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.