2009-08-05 22 views
7

के साथ वर्तमान ईएआर स्थान प्रोग्रामेटिक रूप से कैसे प्राप्त करें किसी को भी पता है कि जेबॉस में तैनात ईएआर के लिए फाइल सिस्टम में प्रोग्रामेटिक रूप से पूर्ण पथ कैसे प्राप्त किया जाए, जावा कोड से उसी ईएआर में?जेबॉस

मुझे इसकी आवश्यकता है क्योंकि मैं कुछ फ़ाइलों को कॉपी करना चाहता हूं जो ईएआर के अंदर फाइल सिस्टम के दूसरे हिस्से में तैनाती पर हैं।

सभी को धन्यवाद!

उत्तर

3

मैं इस तरह से करता हूं।
EAR एक सेवा MyService, जहां मैं EAR सामग्री के साथ काम किया है:

import org.jboss.system.ServiceControllerMBean; 
import org.jboss.system.ServiceMBeanSupport; 

public class MyService extends ServiceMBeanSupport { 

    public void workWithEar() 
    { 
     ServiceControllerMBean serviceController = (ServiceControllerMBean) MBeanProxy.get(
        ServiceControllerMBean.class, 
        ServiceControllerMBean.OBJECT_NAME, server); 
     // server is ServiceMBeanSupport member 

     ClassLoader cl = serviceController.getClass().getClassLoader(); 

     String path = cl.getResource("META-INF/jboss-service.xml").getPath() 
     InputStream file = cl.getResourceAsStream("META-INF/jboss-service.xml"); 
    } 
} 
+0

मैं एक सरल तरीके से उपयोग कर सकता हूं, क्योंकि जिस कक्षा में मुझे उस पथ की आवश्यकता है, मैं ईएआर के भीतर हूं जिसमें डब्ल्यूएआर है जिसमें फाइलें कॉपी करना चाहते हैं। तो, मुझे बस कोड की 1 लाइन की आवश्यकता है: स्ट्रिंग पथ = this.getClass()। GetClassLoader()। GetResource ("my_war_filename.war")। GetPath(); धन्यवाद! – ptdev

2

यह काफी विचित्र है, लेकिन आप जेबॉस MainDeployer एमबीन से पूछकर ऐसा कर सकते हैं। एमबीएन jboss.system:service=MainDeployer पर पाया गया है, और इसमें एक जेएमएक्स ऑपरेशन listDeployments है। यह DeploymentInfo ऑब्जेक्ट्स का संग्रह देता है, जिनमें से एक आपकी ईएआर परिनियोजन होगी। उस परिनियोजन इंफो में url संपत्ति है जो आपकी तैनाती निर्देशिका का वर्णन करने वाला file:// URL है।

अच्छा, आह? ऐसा करने के लिए आप कच्चे जेएमएक्स एपीआई का उपयोग कर सकते हैं, लेकिन MainDeployerMBean के उदाहरण का खुलासा करने के लिए MBeanProxyFactoryBean का उपयोग करके वसंत एक बहुत अच्छा तंत्र प्रदान करता है।

मुझे एक आसान तरीका मिलना है, लेकिन यह अब तक का सबसे अच्छा है।

+0

जोड़ने में आपकी सहायता के लिए धन्यवाद! यह मेरे मामले में काम नहीं करता है हालांकि: मैं जेबॉस के साथ सीमफ्रेमवर्क का उपयोग कर रहा हूं, और मुझे इस कोड को @Observer ("org.jboss.seam.postInitialization") के रूप में एनोटेटेड विधि से चलाने की आवश्यकता है, जिसे कहा जाता है जब एक सीम आवेदन शुरू होता है। इस बिंदु पर मुझे एक मुख्य कार्यकर्ता एमबीएएन मिलेगा जिसने रिपोर्ट की: 0 तैनात ईएआर, 0 अधूरा और 0 तैनाती के लिए प्रतीक्षा ... – ptdev

1

क्या ये संसाधन मैप किए गए हैं या वेब पथ (WAR के भीतर) के अंतर्गत उपलब्ध हैं?

यदि ऐसा है, तो आप वास्तविक/फाइल सिस्टम पथ के आभासी पथ का अनुवाद करने के लिए ServletContext.getRealPath() का उपयोग करने का प्रयास कर सकते हैं।

+0

आपकी मदद के लिए धन्यवाद! यह मेरे मामले में काम नहीं करता है हालांकि: जैसा कि मैंने एक और टिप्पणी में कहा है, मैं इसे सीम स्टार्टअप में उपयोग कर रहा हूं। मुझे इस बिंदु पर ServletContext प्राप्त करने का कोई तरीका नहीं मिला (यह शून्य के रूप में वापस आ जाएगा)। – ptdev

3

सीवन से ServletContext पाने के लिए, आप कर सकते हैं:

ServletLifecycle.getCurrentServletContext() 

जो जैसे ही सीवन पैदा कर दी है उपलब्ध है applicationContext। और फिर getRealPath("/") रूट संदर्भ के परिनियोजन फ़ोल्डर के लिए ठीक काम करता है। संदर्भ रूट के भीतर कोई फ़ोल्डर संरचना तक पहुंचा जा सकता है।

3

आप कर सकते हैं आप "System.getProperty()" यहाँ अन्य संपत्तियों के लिए link है आप

पूर्व इस्तेमाल किया जा सकता है:

String jBossPath = System.getProperty("jboss.server.base.dir") 

परिणाम

"/Users/ALL_THE_PATH/JBoss_7-1/standelone" 

केवल आपके बाद "/deployments/YOUR_PROJECT_EAR/..."