2012-10-28 27 views
6

मैवेन और मानक निर्देशिका लेआउट का उपयोग कर रहा हूं। इसलिए मैं src/परीक्षण/संसाधन फ़ोल्डर में एक testdata.xml फ़ाइल को शामिल किया है, और मैं भी रूप में यह कहा:आर्किलीयन का उपयोग करते समय WEB-INF फ़ोल्डर में रखी गई फ़ाइल को मैं कैसे संदर्भित करूं?

.addAsWebInfResource("testdata.xml", "testdata.xml") 
तैनाती विधि में

, और मैं पुष्टि की है कि यह नहीं है। इससे फ़ाइल /WEB-INF/testdata.xml में दिखाई देगी। अब मुझे अपने कोड में इस फ़ाइल का संदर्भ होना चाहिए और मैंने कई अलग-अलग getClass().getResourceAsStream(...) और बार-बार विफल होने की कोशिश की, इसलिए मुझे अब कुछ सलाह चाहिए।

मुझे इसे अपने डीबीयूनीट एकीकरण परीक्षण के लिए चाहिए। क्या यह संभव नहीं है?

+2

यह करने के लिए classpath में होना चाहिए 'class.getResourseAsStream()' करें। WEB-INF के अंदर सबकुछ क्लासपाथ में नहीं रखा जाता है। WEB-INF में कक्षा फ़ोल्डर की केवल सामग्री क्लासपाथ में जोड़ दी गई है। आप संदर्भ पथ का मार्ग प्राप्त कर सकते हैं और शेष स्थान को जोड़ सकते हैं। –

+0

या यदि आपके पास 'ServletContext' तक पहुंच है तो आप' servletContext.getRealPath ("/ WEB-INF/testdata.xml") कर सकते हैं। –

+0

@heshGurung लेकिन यह विफल रहता है। – LuckyLuke

उत्तर

17

विकल्प ए) का प्रयोग करें ServletContext.getResourceXXX()

आप एक Aquillarian MockHttpSession और एक MockServletContext होना चाहिए। उदाहरण के लिए:

@Test 
    public void myTest() 
    { 
     HttpSession session = new MockHttpSession(new MockServletContext()); 
     ServletLifecycle.beginSession(session); 

     ..testCode.. 

     // You can obtain a ServletContext (will actually be a MockServletContext 
     // implementation): 
     ServletContext sc = session.getServletContext(); 
     URL url = ServletContext.getResource("/WEB-INF/testdata.xml") 
     Path resPath = new Path(url); 
     File resFile = new File(url); 
     FileReader resRdr = new FileReader(resFile); 
     etc... 

     ..testCode.. 

     ServletLifecycle.endSession(session); 
    } 

आप संसाधन फ़ाइलों में & उपनिर्देशिका बना सकते हैं:

  1. वेब मॉड्यूल दस्तावेज़ जड़ - संसाधनों - संसाधन ब्राउज़र से और वर्गों
  2. वेब-INF/वर्गों/से सुलभ हैं वर्ग
  3. वेब-आईएनएफ/lib/*। जार स्रोत जार - कक्षाओं के लिए सुलभ
  4. वेब-आईएनएफ/lib/*। जार समर्पित संसाधन-केवल जार - क्लास के लिए सुलभ एस
  5. वेब-आईएनएफ/सीधे निर्देशिका के भीतर - कक्षाओं के लिए सुलभ। यही वह है जिसे आप पूछ रहे हैं।

सभी मामलों में संसाधन के माध्यम से पहुँचा जा सकता है:

URL url = sc.getResource("/<path from web doc root>/<resourceFileName>"); 
OR  
InputStream resIS = sc.getResourceAsStream("/<path from web doc root>/<resourceFileName>"); 

>

ये युद्ध फ़ाइल में पैक किया जाएगा और तैनात अनुप्रयोग सर्वर या वे हो सकता है पर निर्देशिका में विस्फोट किया जा सकता है ऐप सर्वर पर WAR फ़ाइल के भीतर रहें। किसी भी तरह से - संसाधनों तक पहुंचने के लिए एक ही व्यवहार: ServletContext.getResourceXXX() का उपयोग करें।

ध्यान दें कि एक सामान्य सिद्धांत के रूप में, (5) शीर्ष-स्तर वाली वेब-आईएनएफ निर्देशिका स्वयं सर्वर द्वारा उपयोग के लिए है।यह 'विनम्र' है कि अपने वेब संसाधनों को सीधे यहां न डालें या यहां अपनी निर्देशिका सीधे बनाएं। इसके बजाय, ऊपर (2) का उपयोग करने के लिए बेहतर है।

JEE5 tutorial web modules JEE6 tutorial web modules

विकल्प बी): उपयोग Class.getResourceXXX()

प्रथम में वेब-INF फ़ोल्डर से बाहर ले जाने के संसाधन वेब-INF/वर्गों (या एक जार के अंदर WEB- INF/lib/*। जार)।

यदि आपकी परीक्षण वर्ग है:

फ़ाइल में
  • com.abc.pkg.test.MyTest वेब-INF/वर्गों/com/एबीसी/pkg/परीक्षण/MyTest.class

और अपने संसाधन फ़ाइल

  • वेब-INF/वर्गों/com/एबीसी/pkg/परीक्षण/संसाधन/testdata.xml (या एक जार फ़ाइल में समतुल्य)
0 है

Access का उपयोग सापेक्ष फ़ाइल स्थान फ़ाइल जावा classloader के माध्यम से, - क्लासपाथ पाता फ़ोल्डर/जार रिश्तेदार:

java.net.URL resFileURL = MyTest.class.getResource("resources/testdata.xml"); 
File resFile = new File(fileURL);  
OR 
InputStream resFileIS = 
    MyTedy.class.getResourceAsStream("resources/testdata.xml"); 

पहुँच फ़ाइल पूर्ण पैकेज की तरह योग्यता का उपयोग करना, जावा classloader का उपयोग करना - पाता क्लासपाथ को फ़ोल्डर/जार रिश्तेदार :

java.net.URL resFileURL = MyTest.class.getResource("/com/abc/pkg/test/resources/testdata.xml"); 
File resFile = new File(fileURL);   
OR 
InputStream resFileIS = 
    MyTest.class.getResourceAsStream("/com/abc/pkg/test/resources/testdata.xml"); 
OR 
java.net.URL resFileURL = MyTest.class.getClassLoader().getResource("com/abc/pkg/test/resources/testdata.xml"); 
File resFile = new File(fileURL);  
OR 
InputStream resFileIS = 
    MyTest.class.getClassLoader().getResourceAsStream("com/abc/pkg/test/resources/testdata.xml"); 

आशा है कि यह नाखून! @B)

+0

धन्यवाद। इससे मुझे भी मदद मिली। – CodeBlue

+0

java.io.File में java.net.URL के लिए कोई कन्स्ट्रक्टर नहीं है इसलिए आपकी फ़ाइल resFile = नई फ़ाइल (url); रूपांतरण भी – JanM

+0

संकलित नहीं करेंगे @JanM राज्यों के रूप में, java.io.File में java.net.URL कन्स्ट्रक्टर नहीं है। – Doug

4

WEB-INF तहत फ़ाइलों तक पहुँचने के लिए रास्ता ServletContext के तीन विधियों के माध्यम से है:

  1. getResource("/WEB-INF/testdata.xml") आप एक URL
  2. getResourceAsStream आप एक इनपुट स्ट्रीम
  3. getRealPath आप की डिस्क पर पथ देता है देता है देता है प्रासंगिक फाइल

पहले दो को हमेशा काम करना चाहिए, तीसरा असफल हो सकता है यदि संसाधन पथ और डिस्क पर फ़ाइलों के बीच कोई प्रत्यक्ष पत्राचार नहीं है, उदाहरण के लिए यदि आपका वेब एप्लिकेशन सीधे एक अनपॅक निर्देशिका की बजाय WAR फ़ाइल से चलाया जा रहा है संरचना।

+1

जब मैं आर्किलियन का उपयोग करता हूं तो मैं सर्वलेट संदर्भ ऑब्जेक्ट कैसे प्राप्त करूं? – LuckyLuke

1

अपनी परियोजना के लिए इस वर्ग में जोड़ें:

import java.io.UnsupportedEncodingException; 
import java.net.URLDecoder; 

public class Init { 
    private static final String WEB_INF_DIR_NAME="WEB-INF"; 
    private static String web_inf_path; 
    public static String getWebInfPath() throws UnsupportedEncodingException { 
     if (web_inf_path == null) { 
      web_inf_path = URLDecoder.decode(Init.class.getProtectionDomain().getCodeSource().getLocation().getPath(), "UTF8"); 
      web_inf_path=web_inf_path.substring(0,web_inf_path.lastIndexOf(WEB_INF_DIR_NAME)+WEB_INF_DIR_NAME.length()); 
     } 
     return web_inf_path; 
    } 
} 

अब भी आप फ़ाइल "testdata.xml" उपयोग का पूरा पथ इस या इसी तरह के कोड प्राप्त करना चाहते हैं:

String testdata_file_location = Init.getWebInfPath() + "/testdata.xml"; 
+0

HI अभिषेक: मैंने आपके कोड की कोशिश की..मैं ने वेब-आईएनएफ के अंदर .properties फ़ाइल रखी .. जब मैं testdata_file_location प्रिंट करता हूं तो यह ई: \ ec \ temp.properties की तरह प्रिंट कर रहा है .. इसलिए मुझे नहीं पता कि यह क्यों कर रहा है। तो इसे – sree

+0

से गुणों को कैसे पढ़ा जाए @ क्या आप कुछ आईडीई का उपयोग कर अपना प्रोजेक्ट चला रहे हैं? और क्या आप हमें टोमकैट या ग्लासफ़िश का संस्करण भी बता सकते हैं या जो भी आप उपयोग कर रहे हैं? ऐसा लगता है कि ec.war ई: ड्राइव में तैनात किया गया है, और/या /conf/catalina/localhost/ec.xml ''संदर्भ' तत्व में 'docBase' प्रॉपर्टी को ऐसे स्थान पर इंगित कर रहा है। यह भी जांचें कि क्या आप ऊपर दिए गए कोड से 'web_inf_path.lastIndexOf (WEB_INF_DIR_NAME) + WEB_INF_DIR_NAME.length() 'या' web_inf_path.lastIndexOf (WEB_INF_DIR_NAME) 'का उपयोग कर रहे हैं (यानी आपने गलती से' + WEB_INF_DIR_NAME.length()' भाग छोड़ा है कोड?) –

+0

हाय अभिषेक मैं काम कर रहा हूं..बेटा मेरा कोड prop.load है (नया FileInputStream ("./ WEB-INF/temp.properties")); – sree

2

आज मैं था एक ही आवश्यकता के साथ संघर्ष कर रहा है और मुझे कोई पूर्ण स्रोत नमूना नहीं मिला है, इसलिए यहां मैं सबसे छोटे आत्म निहित परीक्षण के साथ जाता हूं जिसे मैं एक साथ रख सकता हूं:

@RunWith(Arquillian.class) 
public class AttachResourceTest { 

    @Deployment 
    public static WebArchive createDeployment() { 
     WebArchive archive = ShrinkWrap.create(WebArchive.class).addPackages(true, "org.apache.commons.io") 
       .addAsWebInfResource("hello-kitty.png", "classes/hello-kitty.png");    
     System.out.println(archive.toString(true)); 
     return archive; 
    } 

    @Test 
    public void attachCatTest() { 
     InputStream stream = getClass().getResourceAsStream("/hello-kitty.png"); 
     byte[] bytes = null; 
     try { 
      bytes = IOUtils.toByteArray(stream); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     Assert.assertNotNull(bytes); 
    } 
} 

आपकी परियोजना में हैलो-किट्टी.png फ़ाइल src/test/संसाधन पर जाती है। परीक्षण संग्रह में इसे /WEB-INF/कक्षा फ़ोल्डर में पैक किया गया है जो क्लासपाथ पर है और इसलिए आप इसे अपने परीक्षण परिदृश्य के लिए उपयोग किए गए कंटेनर के समान वर्ग लोडर के साथ लोड कर सकते हैं।

IOUtils apache commons-io से है।

अतिरिक्त नोट: एक बात है कि मुझे खरोंच करने के लिए मेरे सिर अपने सर्वर और जिस तरह getResourceAsStream() निकल जाता है के लिए पथ में रिक्त स्थान इस तरह के विशेष वर्ण से संबंधित था मिल गया: sysLoader.getResource() problem in java

+0

जावा 7 फ़ाइल एपीआई का उपयोग क्यों नहीं करें? – BonanzaOne