2012-05-09 14 views
6

के रूप में एक ही JAR फ़ाइल में है, मैं सफलतापूर्वक एक C++ एप्लिकेशन चला रहा हूं जो एक JAR फ़ाइल को क्लासपाथ तर्क के रूप में JVM लोड करता है। इस जेएआर फ़ाइल में .class फ़ाइलों में परिभाषित विभिन्न कार्यों को निष्पादित करने के लिए एप्लिकेशन सफलतापूर्वक जेएनआई कॉल का उपयोग करता है।सेवा लोडर सेवा प्रदाता कक्षा का पता नहीं लगाता है, भले ही कक्षा मेटा-आईएनएफ/सेवाओं

.jar फ़ाइल की निर्देशिका संरचना में शामिल है .class फ़ाइलों का एक तृतीय-पक्ष सेट है - जो jai_imageio.jar से विलय किए गए हैं (इन .class फ़ाइलों, उनकी पूर्ण निर्देशिका संरचना के साथ, इस एकल .jar फ़ाइल में विलय कर रहे थे इंटेलिज आईडीईए)। मर्ज किए गए .jar फ़ाइल में भी शामिल हैं मूल jai_imageio.jar के manifest.mf - विशेष रूप से implementation-title और संबंधित लाइनों से लाइनें हैं। इसके अलावा, meta-inf/services फ़ोल्डर मौजूद है, jai_imageio.jar से भी कॉपी किया गया है। services निर्देशिका में सूचीबद्ध विभिन्न सेवाएं सही दिखती हैं।

विशेष रूप से, javax.imageio.spi.ImageOutputStreamSpi .jar फ़ाइल में meta-inf/services फ़ोल्डर के भीतर एक पंक्ति com.sun.media.imageioimpl.stream.ChannelImageOutputStreamSpi शामिल है, और वहाँ एक वर्ग वास्तव में निर्देशिका कि लाइन द्वारा indicatted पर .jar फ़ाइल के भीतर इस के लिए इसी है: com/sun/media/imageioimpl/stream/ChannelImageOutputStreamSpi.class

हालांकि, जब जावा कोड निम्न पंक्ति निष्पादित करता है:

ImageIO.write(image, "tiff", file); // Assume 'image' is a BufferedImage and 'file' is a File 

... यह एक अपवाद फेंकता है:

java.util.ServiceConfigurationError: javax.imageio.spi.ImageOutputStreamSpi: 
Provider com.sun.media.imageioimpl.stream.ChannelImageOutputStreamSpi not found 

... भले ही इस वर्ग भीतर मौजूद है जैसा कि ऊपर बताया गया है, वही .jar फ़ाइल।

क्या कोई यह बता सकता है कि यह त्रुटि क्यों हो रही है, और इसे हल करने के लिए मुझे क्या करना चाहिए।

+0

वही त्रुटि होता है (अर्थात सिर्फ जावा कोड से विधि सामान्य रूप से कह कर बुलाया)? – artbristol

+0

यदि आवश्यकता हो तो मैं इसका परीक्षण करूंगा, लेकिन यह एक परेशानी होगी क्योंकि कई पिछले जेएनआई कॉल (सफलतापूर्वक) चलते हैं जो सेटअप करते हैं। ये इस अर्थ में समस्याएं पैदा नहीं कर रहे हैं कि मानक छवि प्रकार 'jpg', 'bmp' और' png' को फ़ाइल सिस्टम में सफलतापूर्वक लिखा गया है (मान लीजिए कि 'jai_imageio' .class फ़ाइलों को विलय नहीं किया गया है)। यदि आवश्यक हो, तो मैं इसे सेट अप करूँगा और जैसा कि आप सुझाव देते हैं, परीक्षण करें, हालांकि मैं इसे किए बिना इसे हल करने की उम्मीद कर रहा था। –

+1

कोई सेटअप करने के लिए आवश्यक नहीं होना चाहिए - आप केवल 'ImageIO.write (छवि, "टिफ़", फ़ाइल) के साथ एक स्वयं निहित वर्ग बना सकते हैं; इसमें, और उस श्रेणी को चलाने की कोशिश करें, अपने जार में कक्षापाथ – artbristol

उत्तर

2

इस दस्तावेज़ http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/invocation.html

से "एक धागा वीएम से जुड़ा हुआ है जब, संदर्भ वर्ग लोडर बूटस्ट्रैप लोडर है।"

AttachCurrentThread() के माध्यम से JVM से जुड़ा कोई मूल धागा केवल बूटस्ट्रैप क्लास लोडर प्राप्त करता है, यहां तक ​​कि सिस्टम क्लास लोडर भी नहीं। ServiceLoader द्वारा संदर्भित कक्षाएं तब तक उपलब्ध नहीं होंगी जब तक आप स्पष्ट रूप से नए थ्रेड के संदर्भ वर्ग लोडर को ठीक नहीं करते।

यह किया जा सकता है जैसे: बिना JNI शामिल

java.lang.Thread.currentThread().setContextClassLoader(
    java.lang.ClassLoader.getSystemClassLoader() 
); 
+0

विचित्र रूप से, यह प्रासंगिक विवरण जेएनआई दस्तावेज के वर्तमान संस्करण से छोड़ा गया था। – Wheezil

संबंधित मुद्दे