জাভাতে ক্লাসপাথ থেকে সংস্থানগুলি লোড করার URL


197

জাভাতে, আপনি একই API ব্যবহার করে তবে বিভিন্ন URL প্রোটোকল সহ সমস্ত ধরণের সংস্থান লোড করতে পারেন:

file:///tmp.txt
http://127.0.0.1:8080/a.properties
jar:http://www.foo.com/bar/baz.jar!/COM/foo/Quux.class

এটি দুর্দান্তভাবে অ্যাপ্লিকেশন থেকে সংস্থানটির আসল লোডিংটিকে সংস্থান করে যা সংস্থান প্রয়োজন, এবং যেহেতু একটি URL কেবল একটি স্ট্রিং, তাই সংস্থানগুলি লোড করা খুব সহজেই কনফিগারযোগ্য।

বর্তমান ক্লাসলোডার ব্যবহার করে সংস্থানগুলি লোড করার জন্য কি কোনও প্রোটোকল রয়েছে? এটি জার প্রোটোকলের সাথে সমান, এটি ছাড়া আমার কোন জার ফাইল বা ক্লাস ফোল্ডারটি উত্স থেকে আসে তা জানা দরকার নেই।

আমি Class.getResourceAsStream("a.xml")অবশ্যই এটি ব্যবহার করে করতে পারি , তবে এর জন্য আমার একটি আলাদা এপিআই ব্যবহার করা প্রয়োজন, এবং তাই বিদ্যমান কোডে পরিবর্তিত হয়। আমি কেবলমাত্র একটি সম্পত্তি ফাইল আপডেট করে যেখানেই ইতিমধ্যে উত্সটির জন্য একটি URL নির্দিষ্ট করতে পারি সেগুলিতে আমি এটি ব্যবহার করতে সক্ষম হতে চাই।

উত্তর:


348

ভূমিকা এবং মৌলিক বাস্তবায়ন

প্রথমত, আপনার কমপক্ষে একটি ইউআরএল স্ট্রিমহ্যান্ডলার লাগবে। এটি আসলে প্রদত্ত ইউআরএলটির সংযোগটি খুলবে। লক্ষ্য করুন যে এটি সহজভাবে বলা হয় 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()। আমি আপনাকে আমার পরিবর্তন এবং পরীক্ষার ক্লাসও দেব।


1
@ স্টেফেন ঠিক এটিই আমি খুঁজছি। আপনি কি আমার সাথে আপনার আপডেট শেয়ার করতে পারেন? আমি আমার com.github.fommil.common-utilsপ্যাকেজটির অংশ হিসাবে অন্তর্ভুক্ত করতে পারি যা আমি সোনাইটাইপের মাধ্যমে শীঘ্রই আপডেট এবং প্রকাশের পরিকল্পনা করি।
fommil

5
নোট করুন যে আপনি System.setProperty()প্রোটোকলটি নিবন্ধকরণ করতেও ব্যবহার করতে পারেন । লাইকSystem.setProperty("java.protocol.handler.pkgs", "org.my.protocols");
tsauerwein

: জাভা 9+ একটি সহজ পন্থা নেই stackoverflow.com/a/56088592/511976
mhvelplund

100
URL url = getClass().getClassLoader().getResource("someresource.xxx");

যা করা উচিৎ.


11
"আমি অবশ্যই Class.getResourceAsStream (" a.xML ") ব্যবহার করে এটি করতে পারি, তবে এর জন্য আমার একটি পৃথক এপিআই ব্যবহার করা প্রয়োজন, এবং তাই বিদ্যমান কোডে পরিবর্তিত হয়েছে I আমি যেখানেই সমস্ত জায়গায় এটি ব্যবহার করতে সক্ষম হতে চাই আমি সম্পত্তির জন্য ইতিমধ্যে একটি সম্পত্তি ফাইল আপডেট করে একটি URL নির্দিষ্ট করতে পারি ""
থিলো

3
-১ থিলোর নির্দেশ অনুসারে, এটি এমন কিছু যা ওপি বিবেচনা করে এবং প্রত্যাখ্যান করে।
sleske

13
getResource এবং getResourceAsStream বিভিন্ন পদ্ধতি। সম্মত হয়েছেন যে getResourceAsStream এপিআইয়ের সাথে খাপ খায় না, তবে গেটআরসোর্স একটি ইউআরএল ফিরিয়ে দেয়, যা ঠিক ওপি চেয়েছিল।
রোমাক্যাফ

@ রোমাকাফে: হ্যাঁ, আপনি ঠিক বলেছেন। এটি একটি ভাল বিকল্প সমাধান।
সলেসকে

2
ওপি সম্পত্তি ফাইল সমাধানের জন্য জিজ্ঞাসা করেছিল, তবে অন্যরাও প্রশ্নের শিরোনামের কারণে এখানে আসেন। এবং তারা এই গতিশীল সমাধানটি পছন্দ করে :)
জারেক্কিজ

14

আমি মনে করি এটির নিজস্ব উত্তরটি মূল্যবান - আপনি যদি স্প্রিং ব্যবহার করছেন তবে আপনার ইতিমধ্যে এটি রয়েছে

Resource firstResource =
    context.getResource("http://www.google.fi/");
Resource anotherResource =
    context.getResource("classpath:some/resource/path/myTemplate.txt");

বসন্তের ডকুমেন্টেশনের মতো ব্যাখ্যা করা এবং স্কাফম্যানের মন্তব্যে নির্দেশিত।


আইএমএইচও ResourceLoader.getResource()ApplicationContext.getResource()
বসন্তটি

11

আপনি প্রারম্ভকালীন সময় প্রোগ্রামটিগতভাবে সম্পত্তি সেট করতে পারেন:

final String key = "java.protocol.handler.pkgs";
String newValue = "org.my.protocols";
if (System.getProperty(key) != null) {
    final String previousValue = System.getProperty(key);
    newValue += "|" + previousValue;
}
System.setProperty(key, newValue);

এই শ্রেণিটি ব্যবহার করে:

package org.my.protocols.classpath;

import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandler;

public class Handler extends URLStreamHandler {

    @Override
    protected URLConnection openConnection(final URL u) throws IOException {
        final URL resourceUrl = ClassLoader.getSystemClassLoader().getResource(u.getPath());
        return resourceUrl.openConnection();
    }
}

এইভাবে আপনি স্বল্পতম অনুপ্রবেশকারী উপায় পান। :) java.net.URL সিস্টেম বৈশিষ্ট্য থেকে সর্বদা বর্তমান মান ব্যবহার করবে।


1
java.protocol.handler.pkgsসিস্টেম ভেরিয়েবলটিতে অনুসন্ধানের জন্য অতিরিক্ত প্যাকেজ যুক্ত করা কোডটি কেবল তখনই ব্যবহার করা যেতে পারে যখন হ্যান্ডলারটি এখনও "পরিচিত" প্রোটোকল যেমন প্রসেস করার উদ্দেশ্যে নয় gopher://। যদি উদ্দেশ্য হয় "জনপ্রিয়" প্রোটোকলটিকে ওভাররাইড করা হয়, যেমন file://বা http://এটি করতে এটি অনেক দেরি হতে পারে কারণ java.net.URL#handlersমানচিত্রটি ইতিমধ্যে সেই প্রোটোকলের জন্য একটি "স্ট্যান্ডার্ড" হ্যান্ডলার যুক্ত করা হয়েছে। সুতরাং বাইরে যাওয়ার একমাত্র উপায় হ'ল এই পরিবর্তনশীলটিকে জেভিএম-এ পাস করা।
dma_k

6

( আজারের উত্তরের মতো , তবে কিছুটা আলাদা কৌশল))

আমি বিশ্বাস করি না যে ক্লাসপাথের সামগ্রীগুলির জন্য পূর্বনির্ধারিত প্রোটোকল হ্যান্ডলার রয়েছে। (তথাকথিত classpath:প্রোটোকল)

তবে জাভা আপনাকে নিজের প্রোটোকল যুক্ত করার অনুমতি দেয় না। এটি কংক্রিট বাস্তবায়ন সরবরাহের মাধ্যমে করা হয় java.net.URLStreamHandlerএবং java.net.URLConnection

এই নিবন্ধটি বর্ণনা করে যে কীভাবে কাস্টম স্ট্রিম হ্যান্ডলারটি প্রয়োগ করা যেতে পারে: http://java.sun.com/developer/onlineTraining/protocolhandlers/


4
আপনি কী জেভিএম এর সাথে প্রোটোকল শিপ করে তার একটি তালিকা জানেন?
থিলো

5

আমি একটি ক্লাস তৈরি করেছি যা কাস্টম হ্যান্ডলারগুলি স্থাপনে ত্রুটিগুলি হ্রাস করতে সহায়তা করে এবং সিস্টেমের সম্পত্তিটি গ্রহণ করে যাতে প্রথমে কোনও পদ্ধতি কল করা বা ডান পাত্রে না থাকায় সমস্যা নেই। আপনি জিনিসগুলি ভুল হয়ে থাকলে একটি ব্যতিক্রম শ্রেণিও রয়েছে:

CustomURLScheme.java:
/*
 * The CustomURLScheme class has a static method for adding cutom protocol
 * handlers without getting bogged down with other class loaders and having to
 * call setURLStreamHandlerFactory before the next guy...
 */
package com.cybernostics.lib.net.customurl;

import java.net.URLStreamHandler;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Allows you to add your own URL handler without running into problems
 * of race conditions with setURLStream handler.
 * 
 * To add your custom protocol eg myprot://blahblah:
 * 
 * 1) Create a new protocol package which ends in myprot eg com.myfirm.protocols.myprot
 * 2) Create a subclass of URLStreamHandler called Handler in this package
 * 3) Before you use the protocol, call CustomURLScheme.add(com.myfirm.protocols.myprot.Handler.class);
 * @author jasonw
 */
public class CustomURLScheme
{

    // this is the package name required to implelent a Handler class
    private static Pattern packagePattern = Pattern.compile( "(.+\\.protocols)\\.[^\\.]+" );

    /**
     * Call this method with your handlerclass
     * @param handlerClass
     * @throws Exception 
     */
    public static void add( Class<? extends URLStreamHandler> handlerClass ) throws Exception
    {
        if ( handlerClass.getSimpleName().equals( "Handler" ) )
        {
            String pkgName = handlerClass.getPackage().getName();
            Matcher m = packagePattern.matcher( pkgName );

            if ( m.matches() )
            {
                String protocolPackage = m.group( 1 );
                add( protocolPackage );
            }
            else
            {
                throw new CustomURLHandlerException( "Your Handler class package must end in 'protocols.yourprotocolname' eg com.somefirm.blah.protocols.yourprotocol" );
            }

        }
        else
        {
            throw new CustomURLHandlerException( "Your handler class must be called 'Handler'" );
        }
    }

    private static void add( String handlerPackage )
    {
        // this property controls where java looks for
        // stream handlers - always uses current value.
        final String key = "java.protocol.handler.pkgs";

        String newValue = handlerPackage;
        if ( System.getProperty( key ) != null )
        {
            final String previousValue = System.getProperty( key );
            newValue += "|" + previousValue;
        }
        System.setProperty( key, newValue );
    }
}


CustomURLHandlerException.java:
/*
 * Exception if you get things mixed up creating a custom url protocol
 */
package com.cybernostics.lib.net.customurl;

/**
 *
 * @author jasonw
 */
public class CustomURLHandlerException extends Exception
{

    public CustomURLHandlerException(String msg )
    {
        super( msg );
    }

}

5

@ স্টেফেন https://stackoverflow.com/a/1769454/980442 এবং http://docstore.mik.ua/orelly/java/exp/ch09_06.htm দ্বারা অনুপ্রেরণা

ব্যবহার করা

new URL("classpath:org/my/package/resource.extension").openConnection()

sun.net.www.protocol.classpathমনোযোগের মতো কাজ করতে কেবল এই ক্লাসটিকে প্যাকেজে তৈরি করুন এবং এটি ওরাকল জেভিএম বাস্তবায়নে চালিত করুন।

package sun.net.www.protocol.classpath;

import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandler;

public class Handler extends URLStreamHandler {

    @Override
    protected URLConnection openConnection(URL u) throws IOException {
        return Thread.currentThread().getContextClassLoader().getResource(u.getPath()).openConnection();
    }
}

আপনি যদি আর একটি জেভিএম বাস্তবায়ন ব্যবহার করে থাকেন তবে java.protocol.handler.pkgs=sun.net.www.protocolসিস্টেমের সম্পত্তি সেট করুন ।

এফওয়াইআই: http://docs.oracle.com/javase/7/docs/api/java/net/URL.html#URL(java.lang.String,%20java.lang.String,%20int,%20java.lang .String)


3

ইউআরএল স্ট্রিমহ্যান্ডারদের নিবন্ধকরণের সাথে সমাধানটি অবশ্যই সবচেয়ে সঠিক, তবে কখনও কখনও সহজ সমাধানের প্রয়োজন হয়। সুতরাং, আমি তার জন্য নিম্নলিখিত পদ্ধতিটি ব্যবহার করি:

/**
 * Opens a local file or remote resource represented by given path.
 * Supports protocols:
 * <ul>
 * <li>"file": file:///path/to/file/in/filesystem</li>
 * <li>"http" or "https": http://host/path/to/resource - gzipped resources are supported also</li>
 * <li>"classpath": classpath:path/to/resource</li>
 * </ul>
 *
 * @param path An URI-formatted path that points to resource to be loaded
 * @return Appropriate implementation of {@link InputStream}
 * @throws IOException in any case is stream cannot be opened
 */
public static InputStream getInputStreamFromPath(String path) throws IOException {
    InputStream is;
    String protocol = path.replaceFirst("^(\\w+):.+$", "$1").toLowerCase();
    switch (protocol) {
        case "http":
        case "https":
            HttpURLConnection connection = (HttpURLConnection) new URL(path).openConnection();
            int code = connection.getResponseCode();
            if (code >= 400) throw new IOException("Server returned error code #" + code);
            is = connection.getInputStream();
            String contentEncoding = connection.getContentEncoding();
            if (contentEncoding != null && contentEncoding.equalsIgnoreCase("gzip"))
                is = new GZIPInputStream(is);
            break;
        case "file":
            is = new URL(path).openStream();
            break;
        case "classpath":
            is = Thread.currentThread().getContextClassLoader().getResourceAsStream(path.replaceFirst("^\\w+:", ""));
            break;
        default:
            throw new IOException("Missed or unsupported protocol in path '" + path + "'");
    }
    return is;
}

3

জাভা 9+ এবং এর থেকে আপনি একটি নতুন সংজ্ঞা দিতে পারেন URLStreamHandlerProviderURLবর্গ রান সময়ে এটি লোড করতে সেবা লোডার ফ্রেমওয়ার্ক ব্যবহার করে।

একটি সরবরাহকারী তৈরি করুন:

package org.example;

import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandler;
import java.net.spi.URLStreamHandlerProvider;

public class ClasspathURLStreamHandlerProvider extends URLStreamHandlerProvider {

    @Override
    public URLStreamHandler createURLStreamHandler(String protocol) {
        if ("classpath".equals(protocol)) {
            return new URLStreamHandler() {
                @Override
                protected URLConnection openConnection(URL u) throws IOException {
                    return ClassLoader.getSystemClassLoader().getResource(u.getPath()).openConnection();
                }
            };
        }
        return null;
    }

}

নামক কোনো ফাইল তৈরি করুন java.net.spi.URLStreamHandlerProviderমধ্যে META-INF/servicesবিষয়বস্তু সঙ্গে ডিরেক্টরি:

org.example.ClasspathURLStreamHandlerProvider

এখন ইউআরএল শ্রেণি যখন সরবরাহকারীটিকে এমন কিছু দেখবে তখন তা ব্যবহার করবে:

URL url = new URL("classpath:myfile.txt");

2

ইতিমধ্যে একটি আছে কিনা তা আমি জানি না, তবে আপনি এটিকে নিজেকে ইজিলি করতে পারেন।

সেই বিভিন্ন প্রোটোকলের উদাহরণটি আমার কাছে মুখোমুখি নকশার মতো দেখায়। প্রতিটি ক্ষেত্রে আলাদা আলাদা বাস্তবায়ন করার সময় আপনার একটি সাধারণ ইন্টারফেস থাকে।

আপনি একই নীতিটি ব্যবহার করতে পারেন, একটি রিসোর্সলোডার ক্লাস তৈরি করতে পারেন যা আপনার সম্পত্তি ফাইল থেকে স্ট্রিং নেয় এবং আমাদের একটি কাস্টম প্রোটোকল পরীক্ষা করে

myprotocol:a.xml
myprotocol:file:///tmp.txt
myprotocol:http://127.0.0.1:8080/a.properties
myprotocol:jar:http://www.foo.com/bar/baz.jar!/COM/foo/Quux.class

মাইপ্রোটোকলটি স্ট্রিপ করে: স্ট্রিংয়ের শুরু থেকে এবং তারপরে কোন উপায়টি রিসোর্সটি লোড করা যায়, এবং কেবল আপনাকে উত্স দেয়।


যদি আপনি কোনও তৃতীয় পক্ষের লাইব ইউআরএল ব্যবহার করেন এবং আপনি সম্ভবত কোনও নির্দিষ্ট প্রোটোকলের জন্য সংস্থানগুলির সংস্থান পরিচালনা করতে চান তবে এটি কাজ করবে না।
এমপি।

2

দিলমসের উত্তরের একটি বর্ধন :

কোড পরিবর্তন না করে, আপনার সম্ভবত ইউলিয়াম সম্পর্কিত ইন্টারফেসের কাস্টম বাস্তবায়নের প্রয়োজন হবে যেমন দিলাম সুপারিশ করেছেন। আপনার জন্য জিনিসগুলি সহজ করার জন্য, আমি স্প্রিং ফ্রেমওয়ার্কের সংস্থানগুলির উত্সটি দেখার পরামর্শ দিতে পারি । কোডটি কোনও স্ট্রিম হ্যান্ডলারের আকারে না থাকলেও এটি আপনি ঠিক যা করতে দেখছেন তা করার জন্য ডিজাইন করা হয়েছে এবং এএসএল ২.০ লাইসেন্সের অধীনে রয়েছে, এটিকে যথাযথ creditণের সাথে আপনার কোডটিতে পুনরায় ব্যবহারের পক্ষে যথেষ্ট বান্ধব করে তোলে।


সেই পৃষ্ঠাটি আপনি উল্লেখ করেছেন যে "এমন কোনও স্ট্যান্ডার্ডযুক্ত ইউআরএল বাস্তবায়ন নেই যা ক্লাসপাথ থেকে প্রাপ্ত কোনও সংস্থার অ্যাক্সেসের জন্য ব্যবহার করা যেতে পারে বা কোনও সার্লেটকন্টেক্সট সম্পর্কিত" ব্যবহার করা যেতে পারে, যা আমার প্রশ্নের উত্তর দেয়, আমার ধারণা।
থিলো

@ হোমলেস: সেখানে থাকুন, যুবক। আরও কিছুটা অভিজ্ঞতার সাথে আপনি শীঘ্রই অল্প সময়ে মন্তব্য পোস্ট করবেন।
কুগা

1

একটি স্প্রিং বুট অ্যাপে আমি ফাইলটি ইউআরএল পেতে নিম্নলিখিতগুলি ব্যবহার করেছি,

Thread.currentThread().getContextClassLoader().getResource("PromotionalOfferIdServiceV2.wsdl")

1

আপনার যদি ক্লাসপথে টমক্যাট থাকে তবে এটি এতটা সহজ:

TomcatURLStreamHandlerFactory.register();

এটি "যুদ্ধ" এবং "ক্লাসপাথ" প্রোটোকলের জন্য হ্যান্ডলারদের নিবন্ধভুক্ত করবে।


0

আমি URLক্লাস এড়ানোর চেষ্টা করি এবং পরিবর্তে নির্ভর করি URIURLস্প্রিং রিসোর্স করার জন্য যেখানে বসন্ত রিসোর্স করা দরকার তার জন্য আমি নীচের কাজগুলি করছি :

public static URL toURL(URI u, ClassLoader loader) throws MalformedURLException {
    if ("classpath".equals(u.getScheme())) {
        String path = u.getPath();
        if (path.startsWith("/")){
            path = path.substring("/".length());
        }
        return loader.getResource(path);
    }
    else if (u.getScheme() == null && u.getPath() != null) {
        //Assume that its a file.
        return new File(u.getPath()).toURI().toURL();
    }
    else {
        return u.toURL();
    }
}

একটি ইউআরআই তৈরি করতে আপনি ব্যবহার করতে পারেন URI.create(..)। এই উপায়টি আরও ভাল কারণ আপনি এটি নিয়ন্ত্রণ করে ClassLoaderযা সংস্থান অনুসন্ধান করবে।

আমি লক্ষ্য করেছি যে অন্যান্য কিছু উত্তর স্কিমটি সনাক্ত করতে স্ট্রিং হিসাবে ইউআরএলকে বিশ্লেষণের চেষ্টা করছে। আমি ইউআরআই কাছাকাছি যেতে এবং পরিবর্তে পার্স করার জন্য এটি ব্যবহার করা ভাল বলে মনে করি।

আমি স্প্রিং সোর্সকে অনুরোধ করে তাদের রিসোর্স কোডটি আলাদা করে দেওয়ার জন্য অনুরোধ করে কিছুক্ষণ আগে আসলে একটি সমস্যা দায়ের করেছি coreযাতে আপনার অন্য সমস্ত বসন্তের জিনিসগুলির প্রয়োজন হয় না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.