परिचय और बुनियादी कार्यान्वयन
सबसे पहले, आपको कम से कम URLStreamHandler की आवश्यकता होगी। यह वास्तव में किसी दिए गए URL से कनेक्शन खोलेगा। ध्यान दें कि यह बस कहा जाता है Handler
; यह आपको निर्दिष्ट करने की अनुमति देता है java -Djava.protocol.handler.pkgs=org.my.protocols
और समर्थित प्रोटोकॉल के रूप में "सरल" पैकेज नाम का उपयोग करके इसे स्वचालित रूप से उठाया जाएगा (इस मामले में "क्लासपाथ")।
प्रयोग
new URL("classpath:org/my/package/resource.extension").openConnection();
कोड
package org.my.protocols.classpath;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandler;
/** A {@link URLStreamHandler} that handles resources on the classpath. */
public class Handler extends URLStreamHandler {
/** The classloader to find resources from. */
private final ClassLoader classLoader;
public Handler() {
this.classLoader = getClass().getClassLoader();
}
public Handler(ClassLoader classLoader) {
this.classLoader = classLoader;
}
@Override
protected URLConnection openConnection(URL u) throws IOException {
final URL resourceUrl = classLoader.getResource(u.getPath());
return resourceUrl.openConnection();
}
}
मुद्दों को लॉन्च करें
यदि आप मेरे जैसे कुछ भी हैं, तो आप कहीं पाने के लिए लॉन्च में सेट की जा रही संपत्ति पर भरोसा नहीं करना चाहते हैं (मेरे मामले में, मैं अपने विकल्पों को जावा वेबस्टार्ट की तरह खुला रखना चाहता हूं - यही कारण है कि
मुझे यह सब चाहिए )।
समाधान / संवर्द्धन
मैनुअल कोड हैंडलर विनिर्देश
यदि आप कोड को नियंत्रित करते हैं, तो आप कर सकते हैं
new URL(null, "classpath:some/package/resource.extension", new org.my.protocols.classpath.Handler(ClassLoader.getSystemClassLoader()))
और यह कनेक्शन खोलने के लिए आपके हैंडलर का उपयोग करेगा।
लेकिन फिर से, यह संतोषजनक से कम है, क्योंकि आपको ऐसा करने के लिए URL की आवश्यकता नहीं है - आप ऐसा इसलिए करना चाहते हैं क्योंकि कुछ काम जो आप नहीं कर सकते हैं (या नहीं करना चाहते हैं) नियंत्रण urls चाहते हैं ...
जेवीएम हैंडलर पंजीकरण
अंतिम विकल्प यह है URLStreamHandlerFactory
कि jvm में सभी url को संभालने के लिए पंजीकरण करना है:
package my.org.url;
import java.net.URLStreamHandler;
import java.net.URLStreamHandlerFactory;
import java.util.HashMap;
import java.util.Map;
class ConfigurableStreamHandlerFactory implements URLStreamHandlerFactory {
private final Map<String, URLStreamHandler> protocolHandlers;
public ConfigurableStreamHandlerFactory(String protocol, URLStreamHandler urlHandler) {
protocolHandlers = new HashMap<String, URLStreamHandler>();
addHandler(protocol, urlHandler);
}
public void addHandler(String protocol, URLStreamHandler urlHandler) {
protocolHandlers.put(protocol, urlHandler);
}
public URLStreamHandler createURLStreamHandler(String protocol) {
return protocolHandlers.get(protocol);
}
}
हैंडलर को पंजीकृत करने के लिए, URL.setURLStreamHandlerFactory()
अपने कॉन्फ़िगर किए गए कारखाने के साथ कॉल करें । फिर new URL("classpath:org/my/package/resource.extension")
पहले उदाहरण को पसंद करें और दूर आप जाएं।
जेवीएम हैंडलर पंजीकरण मुद्दा
ध्यान दें कि इस विधि को केवल JVM के अनुसार एक बार बुलाया जा सकता है, और अच्छी तरह से ध्यान दें कि Tomcat एक JNDI हैंडलर (AFAIK) को पंजीकृत करने के लिए इस पद्धति का उपयोग करेगा। जेट्टी की कोशिश करो (मैं होगा); सबसे खराब तरीके से, आप पहले विधि का उपयोग कर सकते हैं और फिर इसे आपके आस-पास काम करना होगा!
लाइसेंस
मैं इसे सार्वजनिक डोमेन पर जारी करता हूं, और पूछता हूं कि यदि आप संशोधित करना चाहते हैं कि आप कहीं ओएसएस परियोजना शुरू करते हैं और विवरण के साथ यहां टिप्पणी करते हैं। एक बेहतर कार्यान्वयन प्रत्येक के लिए एस को स्टोर करने के URLStreamHandlerFactory
लिए ThreadLocal
एस का उपयोग करने वाला होगा । मैं आपको अपने संशोधन और परीक्षण कक्षाएं भी दूंगा।URLStreamHandler
Thread.currentThread().getContextClassLoader()
com.github.fommil.common-utils
पैकेज के हिस्से के रूप में शामिल कर सकता हूं जिसे मैं सोनाटाइप के माध्यम से जल्द ही अपडेट और रिलीज करने की योजना बना रहा हूं।