ভূমিকা এবং মৌলিক বাস্তবায়ন
প্রথমত, আপনার কমপক্ষে একটি ইউআরএল স্ট্রিমহ্যান্ডলার লাগবে। এটি আসলে প্রদত্ত ইউআরএলটির সংযোগটি খুলবে। লক্ষ্য করুন যে এটি সহজভাবে বলা হয় 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 চায় ...
জেভিএম হ্যান্ডলারের নিবন্ধকরণ
চূড়ান্ত বিকল্পটি এমন একটি নিবন্ধন করা 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")
প্রথম উদাহরণটির মতো করুন এবং আপনি চলে যান।
জেভিএম হ্যান্ডলার নিবন্ধকরণ ইস্যু
নোট করুন যে এই পদ্ধতিটি কেবলমাত্র জেভিএম প্রতি একবার কল করা যেতে পারে, এবং ভালভাবে নোট করুন যে টমক্যাট এই পদ্ধতিটি একটি জেএনডিআই হ্যান্ডলার (এএফআইএকে) নিবন্ধিত করতে ব্যবহার করবে। জেটি চেষ্টা করুন (আমি হব); সবচেয়ে খারাপভাবে, আপনি প্রথমে পদ্ধতিটি ব্যবহার করতে পারেন এবং তারপরে এটি আপনার চারপাশে কাজ করতে হবে!
লাইসেন্স
আমি এটি সর্বজনীন ডোমেনে প্রকাশ করি এবং জিজ্ঞাসা করছি যে আপনি যদি কোনও ওএসএস প্রকল্প কোথাও শুরু করতে চান এবং সংশোধন করতে চান তবে বিশদ সহ এখানে মন্তব্য করুন। একজন ভালভাবে কার্যকর একটি আছে হবে URLStreamHandlerFactory
যে ব্যবহারসমূহ ThreadLocal
দোকান থেকে গুলি URLStreamHandler
প্রত্যেকের জন্য গুলি Thread.currentThread().getContextClassLoader()
। আমি আপনাকে আমার পরিবর্তন এবং পরীক্ষার ক্লাসও দেব।
com.github.fommil.common-utils
প্যাকেজটির অংশ হিসাবে অন্তর্ভুক্ত করতে পারি যা আমি সোনাইটাইপের মাধ্যমে শীঘ্রই আপডেট এবং প্রকাশের পরিকল্পনা করি।