2013-03-12 6 views
7

मेरे पास कई स्वतंत्र जावा ईई मॉड्यूल (WAR वेब एप्लिकेशन, और जेएआर ईजेबी मॉड्यूल) हैं जिन्हें मैं जेबॉस 7.1.1 एएस पर तैनात करता हूं। मैं चाहता हूं:जेबॉस एएस 7 एप्लिकेशन विशिष्ट गुण फ़ाइल

  1. एक * .properties फ़ाइल में इन मॉड्यूल की कॉन्फ़िगरेशन को केंद्रीकृत करें।
  2. इस फ़ाइल को क्लासपाथ में उपलब्ध कराएं।
  3. इस फ़ाइल की स्थापना/कॉन्फ़िगरेशन को यथासंभव सरल रखें। आदर्श रूप से इसे केवल कुछ जेबॉस फ़ोल्डर में रखना होगा: $ {JBOSS_HOME}/स्टैंडअलोन/कॉन्फ़िगरेशन।
  4. एप्लिकेशन फ़ाइल को पुनरारंभ किए बिना इस फ़ाइल में बदलाव करें।

क्या यह संभव है?

मुझे पहले से ही यह लिंक मिला है: How to put an external file in the classpath, जो बताता है कि ऐसा करने का बेहतर तरीका स्थिर जेबॉस मॉड्यूल बनाना है। लेकिन, मुझे तैनात हर एप्लिकेशन मॉड्यूल में इस स्थैतिक मॉड्यूल पर निर्भरता बनाना है, जो कि एक तरह का युग्मन है जिसे मैं टालने की कोशिश कर रहा हूं।

उत्तर

0

./standalone.sh --server-config = standalone-gdrais.xml --properties =/home/user/programs/jboss/jboss-eap-6.0/स्टैंडअलोन/कॉन्फ़िगरेशन/file.properties -b 0.0। 0.0

5

शायद एक साधारण समाधान फ़ाइल को सिंगलटन या स्थैतिक वर्ग से पढ़ना है।

private static final String CONFIG_DIR_PROPERTY = "jboss.server.config.dir"; 

private static final String PROPERTIES_FILE = "application-xxx.properties"; 

private static final Properties PROPERTIES = new Properties(); 

static { 
    String path = System.getProperty(CONFIG_DIR_PROPERTY) + File.separator + PROPERTIES_FILE; 
    try { 
     PROPERTIES.load(new FileInputStream(path)); 
    } catch (MalformedURLException e) { 
     //TODO 
    } catch (IOException e) { 
     //TODO 
    } 
} 
2

यहां इस site से लिया गया केवल सीडीआई का उपयोग करके एक पूर्ण उदाहरण है।

यह कॉन्फ़िगरेशन जेबॉस एएस 7 के लिए भी काम करेगा।

  1. बनाएँ और पॉप्युलेट एक गुण WildFly विन्यास फ़ोल्डर

    $ echo 'docs.dir=/var/documents' >> .standalone/configuration/application.properties 
    
  2. अंदर दाखिल WildFly विन्यास फाइल करने के लिए एक प्रणाली संपत्ति जोड़ें।

    $ ./bin/jboss-cli.sh --connect 
    [[email protected]:9990 /] /system-property=application.properties:add(value=${jboss.server.config.dir}/application.properties) 
    

यह आपके सर्वर कॉन्फ़िगरेशन फ़ाइल (standalone.xml या domain.xml) के लिए निम्न जोड़ देगा:

<system-properties> 
    <property name="application.properties" value="${jboss.server.config.dir}/application.properties"/> 
</system-properties> 
  1. सिंगलटन बनाएं सत्र बीन जो अनुप्रयोग विस्तृत गुणों को लोड और स्टोर करता है

    import java.io.File; 
    import java.io.FileInputStream; 
    import java.io.IOException; 
    import java.util.HashMap; 
    import java.util.Map; 
    import java.util.Properties; 
    
    import javax.annotation.PostConstruct; 
    import javax.ejb.Singleton; 
    
    @Singleton 
    public class PropertyFileResolver { 
    
        private Logger logger = Logger.getLogger(PropertyFileResolver.class); 
        private String properties = new HashMap<>(); 
    
        @PostConstruct 
        private void init() throws IOException { 
    
         //matches the property name as defined in the system-properties element in WildFly 
         String propertyFile = System.getProperty("application.properties"); 
         File file = new File(propertyFile); 
         Properties properties = new Properties(); 
    
         try { 
          properties.load(new FileInputStream(file)); 
         } catch (IOException e) { 
          logger.error("Unable to load properties file", e); 
         } 
    
         HashMap hashMap = new HashMap<>(properties); 
         this.properties.putAll(hashMap); 
        } 
    
        public String getProperty(String key) { 
         return properties.get(key); 
        } 
    } 
    
  2. सीडीआई योग्यता बनाएँ। हम जावा एनरिएबल पर इस एनोटेशन का उपयोग करेंगे जिसे हम इंजेक्ट करना चाहते हैं।

    import java.lang.annotation.ElementType; 
    import java.lang.annotation.Retention; 
    import java.lang.annotation.RetentionPolicy; 
    import java.lang.annotation.Target; 
    
    import javax.inject.Qualifier; 
    
    @Qualifier 
    @Retention(RetentionPolicy.RUNTIME) 
    @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR }) 
    public @interface ApplicationProperty { 
    
        // no default meaning a value is mandatory 
        @Nonbinding 
        String name(); 
    } 
    
  3. निर्माता विधि बनाएं; इस उत्पन्न वस्तु इंजेक्ट किया जा करने के लिए

    import javax.enterprise.inject.Produces; 
    import javax.enterprise.inject.spi.InjectionPoint; 
    import javax.inject.Inject; 
    
    public class ApplicaitonPropertyProducer { 
    
        @Inject 
        private PropertyFileResolver fileResolver; 
    
        @Produces 
        @ApplicationProperty(name = "") 
        public String getPropertyAsString(InjectionPoint injectionPoint) { 
    
         String propertyName = injectionPoint.getAnnotated().getAnnotation(ApplicationProperty.class).name(); 
         String value = fileResolver.getProperty(propertyName); 
    
         if (value == null || propertyName.trim().length() == 0) { 
          throw new IllegalArgumentException("No property found with name " + value); 
         } 
         return value; 
        } 
    
        @Produces 
        @ApplicationProperty(name="") 
        public Integer getPropertyAsInteger(InjectionPoint injectionPoint) { 
    
         String value = getPropertyAsString(injectionPoint); 
         return value == null ? null : Integer.valueOf(value); 
        } 
    } 
    
  4. अन्त में अपने CDI सेम में से एक में संपत्ति इंजेक्षन

    import javax.ejb.Stateless; 
    import javax.inject.Inject; 
    
    @Stateless 
    public class MySimpleEJB { 
    
        @Inject 
        @ApplicationProperty(name = "docs.dir") 
        private String myProperty; 
    
        public String getProperty() { 
         return myProperty; 
        } 
    } 
    
संबंधित मुद्दे