চলমান জেআর ফাইলের পথ কীভাবে পাবেন?


580

আমার কোডটি একটি জেআর ফাইলের মধ্যে চলে, foo.jar বলুন এবং কোডটিতে আমার foo.jar চলমান ফোল্ডারে জানতে হবে।

সুতরাং, যদি foo.jar থাকে তবে C:\FOO\আমি আমার বর্তমান কার্যনির্বাহী ডিরেক্টরিটি নির্বিশেষে সেই পথটি পেতে চাই।


এমন একটি সমাধানের জন্য ফ্যাব এর উত্তর দেখুন যা পাথগুলিতে ফাঁকা স্থান অন্তর্ভুক্ত করে works এছাড়াও, নোট করুন যে নীচে কিছু উত্তর শিরোনামটিতে প্রশ্নটি জার করে (জারের পথ), কিছু প্রশ্নটিকে নিজেই সম্বোধন করে (জারযুক্ত ফোল্ডারের পথ), এবং কিছু জার ফাইলের অভ্যন্তরে শ্রেণিতে পথ সরবরাহ করে।
অ্যান্ডি টমাস

32
এএনটি-তে ব্যবহার করার সময় সাবধান! ============== আমি স্ট্রিং পাথ বলি = SomeClass.class.getProticationDomain ()। GetCodeSource ()। GetLocation ()। GetPath (); এবং পান: / সি: / পেপা-ant-1.7.1/lib/ant.jar খুব দরকারী নয়!
দিনো ফ্যানসেলু

মজাদার. আমি যে মূল কোডটিতে এটি ব্যবহার করেছি তা কখনই পিঁপড়ে চালানো হয়নি, সুতরাং এটি আমার পক্ষে কোনও সমস্যা নয়।
থিয়াগো চ্যাভস

2
@ ডিনো ফ্যান্সেল্লু, আপনি যা বর্ণনা করেছেন ঠিক তেমনই আমি अनुभव করেছি। দেবের সময় কাজ করে, জারে তৈরি হলে ব্যর্থ হয়।
বাডি

উত্তর:


538
return new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation()
    .toURI()).getPath();

আপনার ক্লাসের নাম দিয়ে "মাই ক্লাস" প্রতিস্থাপন করুন।

স্পষ্টতই, আপনার ক্লাসটি কোনও ফাইলবিহীন অবস্থান থেকে লোড করা হলে এটি অদ্ভুত কাজ করবে।


42
toURI()ধাপ স্পেস এবং pluses সহ বিশেষ অক্ষর, সঙ্গে এড়ানোর সমস্যা অত্যাবশ্যক। সঠিক ওয়ান-লাইনারটি হ'ল: return new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().toURI()); ব্যবহার URLDecoderঅনেকগুলি বিশেষ চরিত্রের জন্য কাজ করে না। আরও তথ্যের জন্য নীচে আমার উত্তর দেখুন।
ctrueden

4
দ্রষ্টব্য: এটি জার ফাইলের নাম সহ পথটি ফিরিয়ে দেয়
বাডি

8
এই চলমান ডিরেক্টরি পরিবর্তে জার ফাইলটি নির্দেশ করে না? এই কাজের জন্য আপনাকে ফলাফল পিতামাতা ফাইল () করতে হবে।
এফইও

1
এছাড়াও, getProtectionDomainযদি আপনি স্ট্র্যাকট্র্যাস থেকে আপনার ক্লাসটি পান তবে তা বাতিল:val strace = Thread.currentThread().getStackTrace; val path = strace(1).getClass.getProtectionDomain
বার্বার

1
জাভা 8 পর্যন্ত এই পদ্ধতিটি ব্যবহার করে; বাহ্যিক জারে থাকা ক্লাসে এই পদ্ধতিটি রেখে ক্লাস-পাথের মাধ্যমে লোড করা হয়, তবে প্রকৃত চলমান জারের পরিবর্তে বাহ্যিক জারের পথ দেওয়া হবে।
মিঃ00 অ্যান্ডারসন

189

আমার জন্য সেরা সমাধান:

String path = Test.class.getProtectionDomain().getCodeSource().getLocation().getPath();
String decodedPath = URLDecoder.decode(path, "UTF-8");

এটি স্পেস এবং বিশেষ অক্ষরগুলির সাথে সমস্যার সমাধান করা উচিত।


8
আরও একটি দ্রষ্টব্য: জার থেকে এই ফাংশনটি কল করার সময়, জারের নামটি আমার জন্য শেষে যুক্ত করা হয়েছে, সুতরাং এটি সম্পাদন করতে হয়েছিল: path.substring (0, path.lastIndexOf ("/") + 1);
will824

11
/ অগত্যা পাথ বিভাজক নয়। আপনার করা উচিত (নতুন ফাইল (পথ)) get
pjz

10
জেআর ফাইলের নাম এখানে যুক্ত করা নিয়ে কোনও সমস্যা নেই। ইউটিএফ রূপান্তরটি URLDecoder.decode(ClassLoader.getSystemClassLoader().getResource(".").getPath(), "UTF-8");লিনাক্সে @ আইভিগজিয়ানির সাথে ( ) মিশ্রণে নিখুঁত সমাধান বলে মনে হচ্ছে । তবে আমি উইন্ডোজটিতে চেষ্টা করিনি try
উবুন্টুড্রয়েড

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

11
সাবধানতা: URLDecoderবিশেষ অক্ষরগুলি ডিকোড করতে ব্যবহার করার পরামর্শ দেওয়া হয় না । বিশেষত, এর মতো অক্ষরগুলি +ভুলভাবে স্পেসে ডিকোড করা হবে। বিস্তারিত জানার জন্য আমার উত্তর দেখুন।
ctrueden

153

প্রাপ্ত Fileএকটি প্রদত্ত জন্য Class, দুই ধাপ আছে:

  1. রূপান্তর করুন Classএকটি থেকেURL
  2. রূপান্তর URLএকটি থেকেFile

উভয় পদক্ষেপ বোঝা গুরুত্বপূর্ণ, এবং সেগুলি সংঘাতের নয় not

আপনার কাছে একবার File, আপনি কল করতে পারেনgetParentFile যদি প্রয়োজন হয় তবে এটি ধারণকৃত ফোল্ডারটি করতে পারেন।

পদক্ষেপ 1: ClassথেকেURL

অন্যান্য উত্তরে যেমন আলোচনা করা হয়েছে, তে URLপ্রাসঙ্গিক হওয়ার দুটি উপায় রয়েছে Class

  1. URL url = Bar.class.getProtectionDomain().getCodeSource().getLocation();

  2. URL url = Bar.class.getResource(Bar.class.getSimpleName() + ".class");

উভয় আগপাছ আছে।

getProtectionDomainপদ্ধতির শ্রেণী (যেমন, ধারণকারী JAR- র ফাইল) বেস অবস্থান উৎপাদ। তবে, জাভা রানটাইমের সুরক্ষা নীতি SecurityExceptionকল করার সময় নিক্ষেপ করবেgetProtectionDomain() , তাই যদি আপনার অ্যাপ্লিকেশনটি বিভিন্ন পরিবেশে চালিত হওয়ার প্রয়োজন হয় পরীক্ষা করা ভাল।

getResourceপদ্ধতির বর্গ, যেখান থেকে আপনি অতিরিক্ত স্ট্রিং ম্যানিপুলেশন সঞ্চালন করতে হবে সম্পূর্ণ URL সম্পদ পথ উৎপাদ। এটি একটি file:পাথ হতে পারে তবে এটি কোনও OSGi কাঠামোর মধ্যে কার্যকর করার সময় jar:file:বা কিছুটা nastier ও হতে পারে bundleresource://346.fwk2106232034:4/foo/Bar.class। বিপরীতভাবে, getProtectionDomainপদ্ধতির সঠিকভাবে ফলন করে afile: এমনকি ওএসজিআইয়ের মধ্যে থেকে ইউআরএল ।

নোট করুন getResource("")এবং উভয়ই getResource(".")আমার পরীক্ষায় ব্যর্থ হয়েছে, যখন ক্লাসটি একটি জেআর ফাইলের মধ্যে অবস্থান করেছিল; উভয় আহ্বান বাতিল। সুতরাং আমি এটি পরিবর্তে উপরে প্রদর্শিত # 2 অনুরোধের পরামর্শ দিচ্ছি, কারণ এটি নিরাপদ বলে মনে হচ্ছে।

পদক্ষেপ 2: URLথেকেFile

যে কোনও উপায়ে, একবার আপনার সাথে থাকলে URL, পরবর্তী পদক্ষেপটি একটিতে রূপান্তরিত হয় File। এটি তার নিজস্ব চ্যালেঞ্জ; দেখতে এটি সম্পর্কে Kohsuke Kawaguchi এর ব্লগ পোস্টে সম্পূর্ণ বিবরণের জন্য, কিন্তু সংক্ষেপে, আপনি ব্যবহার করতে পারেনnew File(url.toURI()) যতদিন URL টি সম্পূর্ণরূপে সুগঠিত হয়।

সবশেষে, আমি ব্যবহার করে অত্যন্ত নিরুৎসাহিত করবURLDecoder । URL- এ কিছু অক্ষর :এবং /বিশেষ করে, কার্যকর URL এনকোডেড অক্ষর নয়। URL ডিকোডার জাভাদোক থেকে :

অনুমান করা হয় যে এনকোডযুক্ত স্ট্রিংয়ের সমস্ত অক্ষর নিম্নলিখিতগুলির মধ্যে একটি: "ক" মাধ্যমে "জেড", "এ" "জেড" এর মাধ্যমে, "0" "9" এর মাধ্যমে এবং "-", "_", " .", এবং "*". "%" অক্ষরটি অনুমোদিত তবে একটি বিশেষ পালানো ক্রমের সূচনা হিসাবে ব্যাখ্যা করা হয়।

...

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

অনুশীলনে, URLDecoderসাধারণত IllegalArgumentExceptionউপরে হুমকি হিসাবে ছুঁড়ে না । এবং যদি আপনার ফাইলপথটিতে শূন্যস্থানগুলি এনকোড করা থাকে তবে %20এই পদ্ধতির কাজ হতে পারে। তবে, যদি আপনার ফাইলপথের অন্যান্য অ-অক্ষরযুক্ত অক্ষর থাকে তবে আপনার ফাইলের পাথটি ম্যাংলিংয়ের ক্ষেত্রে +আপনার সমস্যা হবে URLDecoder

ওয়ার্কিং কোড

এই পদক্ষেপগুলি অর্জন করতে আপনার নীচের মতো পদ্ধতি থাকতে পারে:

/**
 * Gets the base location of the given class.
 * <p>
 * If the class is directly on the file system (e.g.,
 * "/path/to/my/package/MyClass.class") then it will return the base directory
 * (e.g., "file:/path/to").
 * </p>
 * <p>
 * If the class is within a JAR file (e.g.,
 * "/path/to/my-jar.jar!/my/package/MyClass.class") then it will return the
 * path to the JAR (e.g., "file:/path/to/my-jar.jar").
 * </p>
 *
 * @param c The class whose location is desired.
 * @see FileUtils#urlToFile(URL) to convert the result to a {@link File}.
 */
public static URL getLocation(final Class<?> c) {
    if (c == null) return null; // could not load the class

    // try the easy way first
    try {
        final URL codeSourceLocation =
            c.getProtectionDomain().getCodeSource().getLocation();
        if (codeSourceLocation != null) return codeSourceLocation;
    }
    catch (final SecurityException e) {
        // NB: Cannot access protection domain.
    }
    catch (final NullPointerException e) {
        // NB: Protection domain or code source is null.
    }

    // NB: The easy way failed, so we try the hard way. We ask for the class
    // itself as a resource, then strip the class's path from the URL string,
    // leaving the base path.

    // get the class's raw resource path
    final URL classResource = c.getResource(c.getSimpleName() + ".class");
    if (classResource == null) return null; // cannot find class resource

    final String url = classResource.toString();
    final String suffix = c.getCanonicalName().replace('.', '/') + ".class";
    if (!url.endsWith(suffix)) return null; // weird URL

    // strip the class's path from the URL string
    final String base = url.substring(0, url.length() - suffix.length());

    String path = base;

    // remove the "jar:" prefix and "!/" suffix, if present
    if (path.startsWith("jar:")) path = path.substring(4, path.length() - 2);

    try {
        return new URL(path);
    }
    catch (final MalformedURLException e) {
        e.printStackTrace();
        return null;
    }
} 

/**
 * Converts the given {@link URL} to its corresponding {@link File}.
 * <p>
 * This method is similar to calling {@code new File(url.toURI())} except that
 * it also handles "jar:file:" URLs, returning the path to the JAR file.
 * </p>
 * 
 * @param url The URL to convert.
 * @return A file path suitable for use with e.g. {@link FileInputStream}
 * @throws IllegalArgumentException if the URL does not correspond to a file.
 */
public static File urlToFile(final URL url) {
    return url == null ? null : urlToFile(url.toString());
}

/**
 * Converts the given URL string to its corresponding {@link File}.
 * 
 * @param url The URL to convert.
 * @return A file path suitable for use with e.g. {@link FileInputStream}
 * @throws IllegalArgumentException if the URL does not correspond to a file.
 */
public static File urlToFile(final String url) {
    String path = url;
    if (path.startsWith("jar:")) {
        // remove "jar:" prefix and "!/" suffix
        final int index = path.indexOf("!/");
        path = path.substring(4, index);
    }
    try {
        if (PlatformUtils.isWindows() && path.matches("file:[A-Za-z]:.*")) {
            path = "file:/" + path.substring(5);
        }
        return new File(new URL(path).toURI());
    }
    catch (final MalformedURLException e) {
        // NB: URL is not completely well-formed.
    }
    catch (final URISyntaxException e) {
        // NB: URL is not completely well-formed.
    }
    if (path.startsWith("file:")) {
        // pass through the URL as-is, minus "file:" prefix
        path = path.substring(5);
        return new File(path);
    }
    throw new IllegalArgumentException("Invalid URL: " + url);
}

আপনি এই পদ্ধতিগুলি সায়জভা কমন লাইব্রেরিতে খুঁজে পেতে পারেন :


5
+1 টি; তারিখের সেরা উত্তর: এটি ওএসের জন্য সঠিক স্বরলিপি ব্যবহার করে পথটি ফিরিয়ে দেবে। (যেমন উইন্ডোজের জন্য।)
বাথশেবা

সুরক্ষা সম্পর্কে, আমি বিশ্বাস করি যে আমি খুঁজে পেয়েছি যে জাভা ওয়েবস্টার্ট এটি অনুমতি দেয় না।
থোরবজর্ন রাভন অ্যান্ডারসন

55

আপনি এটি ব্যবহার করতে পারেন:

CodeSource codeSource = YourMainClass.class.getProtectionDomain().getCodeSource();
File jarFile = new File(codeSource.getLocation().toURI().getPath());
String jarDir = jarFile.getParentFile().getPath();

3
এটি আমার পক্ষে আরও ভাল কাজ করে, কারণ এটি জারের পথ দেয়, শ্রেণির নয়!
T30

আমার জন্যও কাজ করেছেন। ফ্যাব এর উত্তরের সাথে একত্রিত করুন এবং এটি আরও ভাল হয়!
ড্যানিয়েলসন আলভেস জুনিয়র

25

আপনার বর্তমান শ্রেণীর জন্য URL খুঁজে পেতে ClassLoader.getResource () ব্যবহার করুন।

উদাহরণ স্বরূপ:

package foo;

public class Test
{
    public static void main(String[] args)
    {
        ClassLoader loader = Test.class.getClassLoader();
        System.out.println(loader.getResource("foo/Test.class"));
    }
}

( একই উদাহরণ থেকে নেওয়া এই উদাহরণ ।)

ডিরেক্টরিটি সন্ধান করার জন্য আপনাকে ম্যানুয়ালি ইউআরএল আলাদা করতে হবে। একটি জার ইউআরএলের ফর্ম্যাটের জন্য জারক্লাসলৌডার টিউটোরিয়ালটি দেখুন ।


আমার জেআর ফাইলটি অস্পষ্ট, তাই এই উত্তরটি আমার সমস্যার সমাধান করে না। তবে আমি প্রশ্নটিতে এটি নির্দিষ্ট করে নেই, সুতরাং এটি এখনও একটি বৈধ উত্তর।
থিয়াগো চ্যাভস

12
যদি এটি অস্পষ্ট থাকে তবে টেস্ট.ক্লাস.সেটনাম () ব্যবহার করুন এবং উপযুক্ত মুংটি করুন।
জন স্কিটি

1
@ জোনস্কিট আপনার উত্তর নিয়ে অনেকগুলি সমস্যা রয়েছে: ১. NPEআপনি যে প্রশ্নটি জিজ্ঞাসা করেছিলেন তার উত্তর না দেওয়ার কারণ হবেনা (জেআর দিরের দিকে জিজ্ঞাসা করা হয়েছিল এবং আপনি একেবারে পৃথক প্রশ্নের উত্তর দিয়েছেন: শ্রেণীর পথে)। ২. অন্যদের দ্বারা নির্দেশিত হিসাবে, এবং আমি একই সমস্যা পেয়েছি, এটি অ্যাপলেটগুলির জন্য কাজ করে না। 3. ফিরে পথ এ সব ক্যানোনিকাল পথ প্রতিনিধিত্বের নয়: jar:file:/listener/build/libs/listener-1.0.0-all.jar!/shared/Test.class
হোয়াইটএঞ্জেল

1
@ হোয়াইটএঞ্জেল: 1) আমার পোস্টের শেষ লাইনটি ইঙ্গিত করে যে জার ফাইলটি পাওয়ার জন্য আপনাকে ইউআরএলটি দেখার প্রয়োজন এবং এটি আলাদা করে নিতে হবে। আমি সম্মত হলাম এটি সর্বাধিক সম্পূর্ণ উত্তর নয়, তবে আমি মনে করি না যে এটি সম্পর্কে বিতর্ক করা খুব খারাপ কারণ (বিশেষত 10 বছর পরে ...) 2) অ্যাপলেটগুলির এখানে কোনও মন্তব্যে উল্লেখ করা হয়নি - আশ্চর্যের পক্ষে যথেষ্ট, আমি ডন আমি যে উত্তরগুলির উত্তর পোস্ট করতে পেরেছি সেগুলির সমস্ত উত্তরের সমস্ত মন্তব্য দেখার সময় নেই। 3) আবার, আমি জার ইউআরএলের বিন্যাসে লিঙ্ক করেছি
জন স্কিটি

2
@ হোয়াইটএঞ্জেল: আমি লিখেছি এটি সবচেয়ে ভাল উত্তর? নাঃ। এটি যেমন তৈরি করা হচ্ছে ততটা খারাপ? না, আমি এটা মনে করি না। (বিশেষত আপনি এনপিই নিক্ষেপকারী চারপাশের দাবির পরিপ্রেক্ষিতে, যা এটি হয় না)) আমি আপনাকে এই উত্তর সম্পর্কে কোনও ঝগড়া করার পরিবর্তে আপনার নিজের উত্তর যুক্ত করার পরামর্শ দিচ্ছি। এটি একটি আরও ইতিবাচক পদ্ধতির হবে।
জন স্কিটি

19

আমি অবাক হয়ে দেখেছি যে কেউই সম্প্রতি ব্যবহারের প্রস্তাব করেনি Path। এখানে একটি তলব রয়েছে: " বর্গ বিভিন্ন পদ্ধতি পথ সম্পর্কে তথ্য প্রাপ্ত করতে ব্যবহৃত করা যেতে পারে, পথের এক্সেস উপাদান অন্তর্ভুক্ত, অন্যান্য ধরনের, অথবা একটি পথের সার অংশ পাথ রূপান্তর "Path

সুতরাং, একটি ভাল বিকল্প হ'ল Pathআপত্তিজনক হিসাবে পাওয়া:

Path path = Paths.get(Test.class.getProtectionDomain().getCodeSource().getLocation().toURI());

3
একটি নোট হিসাবে, পাথটি জাভা 7-তে শুরু হবে
ক্রিস ফোরেন্স

15

লিনাক্স, ম্যাক এবং উইন্ডোজে আমার জন্য একমাত্র সমাধান:

public static String getJarContainingFolder(Class aclass) throws Exception {
  CodeSource codeSource = aclass.getProtectionDomain().getCodeSource();

  File jarFile;

  if (codeSource.getLocation() != null) {
    jarFile = new File(codeSource.getLocation().toURI());
  }
  else {
    String path = aclass.getResource(aclass.getSimpleName() + ".class").getPath();
    String jarFilePath = path.substring(path.indexOf(":") + 1, path.indexOf("!"));
    jarFilePath = URLDecoder.decode(jarFilePath, "UTF-8");
    jarFile = new File(jarFilePath);
  }
  return jarFile.getParentFile().getAbsolutePath();
}

এটি কাজ করবে না। যদি লিনাক্সে থাকে তবে টুড়ি () পদ্ধতিটি একটি ব্যতিক্রম ছুঁড়ে ফেলেছে এবং আপনি লিনাক্সের জন্য অন্য অংশে পৌঁছাতে পারবেন না।
উইলহেম সোর্বান

9

আমার একই সমস্যা ছিল এবং আমি এটি সেভাবে সমাধান করেছি:

File currentJavaJarFile = new File(Main.class.getProtectionDomain().getCodeSource().getLocation().getPath());   
String currentJavaJarFilePath = currentJavaJarFile.getAbsolutePath();
String currentRootDirectoryPath = currentJavaJarFilePath.replace(currentJavaJarFile.getName(), "");

আমি আশা করি আমি আপনার জন্য সহায়ক ছিলাম।


এটা করবেন না। URL.getPath () কোনও ফাইলের নাম ফিরিয়ে দেয় না এবং এটি অনেক পরিস্থিতিতে ব্যর্থ হবে, যেমন তাদের ফাঁকা জায়গাগুলির সাথে ফাইল পাথ।
ভিজিআর

9

এখানে অন্যান্য মন্তব্যে আপগ্রেড করা হয়েছে, যা সুনির্দিষ্টতার জন্য আমার কাছে অসম্পূর্ণ বলে মনে হচ্ছে

.jar ফাইলের বাইরে একটি আপেক্ষিক "ফোল্ডার" ব্যবহার করে (জারের একই জায়গায়):

String path = 
  YourMainClassName.class.getProtectionDomain().
  getCodeSource().getLocation().getPath();

path = 
  URLDecoder.decode(
    path, 
    "UTF-8");

BufferedImage img = 
  ImageIO.read(
    new File((
        new File(path).getParentFile().getPath()) +  
        File.separator + 
        "folder" + 
        File.separator + 
        "yourfile.jpg"));

4
সাবধানতা: URLDecoderবিশেষ অক্ষরগুলি ডিকোড করতে ব্যবহার করার পরামর্শ দেওয়া হয় না । বিশেষত, এর মতো অক্ষরগুলি +ভুলভাবে স্পেসে ডিকোড করা হবে। বিস্তারিত জানার জন্য আমার উত্তর দেখুন।
ctrueden

ফাইলের নামগুলিতে বিশেষ অক্ষর ব্যবহার করার পরামর্শ দেওয়া হয় না।
জোন

URLDecoderএর নাম সত্ত্বেও, ইউআরএল ডিকোড করার জন্য এবং প্যারামিটারের নাম এবং মানগুলি তৈরি করে, ইউআরএল নয়।
লার্নের মারকুইস

6

জার ফাইলটি চালনার পথ পাওয়ার জন্য আমি উপরের সমাধানগুলি অধ্যয়ন করেছি এবং সমস্ত পদ্ধতির চেষ্টা করেছি যা একে অপরের মধ্যে কিছু পার্থক্য রয়েছে। যদি এই কোডগুলি Eclipse IDE এ চলমান থাকে তবে তাদের সকলকেই নির্দেশিত বর্গ সহ ফাইলটির সন্ধান করতে এবং সন্ধানের পথটি সহ একটি সূচিত ফাইলটি খুলতে বা তৈরি করতে সক্ষম হওয়া উচিত।

তবে এটি মুশকিল, যখন চালানোযোগ্য জার ফাইলটি সরাসরি বা কমান্ড লাইনের মাধ্যমে চালানো হয়, এটি ব্যর্থ হবে কারণ উপরের পদ্ধতিগুলি থেকে জার ফাইলের পথটি জার ফাইলটিতে একটি অভ্যন্তরীণ পথ দেবে, এ কারণেই এটি সর্বদা একটি পথ দেয় যেমন

আরএসসিআর: প্রকল্পের নাম (সম্ভবত আমার বলা উচিত এটি মূল শ্রেণীর ফাইলের প্যাকেজের নাম - নির্দেশিত শ্রেণি)

আমি আরএসসিআর: ... একটি বাহ্যিক পাথে পাথ রূপান্তর করতে পারি না, এটি যখন গ্রহ আইডির বাইরে জার ফাইলটি চালানো হয় তখন এটি জার ফাইলটির পাথ পায় না।

Eclipse IDE এর বাইরে জার ফাইল চালানোর পথ পাওয়ার একমাত্র সম্ভাব্য উপায়

System.getProperty("java.class.path")

এই কোড লাইনটি চলমান জার ফাইলের জীবন্ত পথ (ফাইলের নাম সহ) ফিরিয়ে দিতে পারে (নোট করুন যে ফেরতের পথটি কার্যনির্বাহী ডিরেক্টরি নয়), জাভা নথি এবং কিছু লোক বলেছে যে এটি সমস্ত শ্রেণীর ফাইলের পথগুলি ফিরিয়ে দেবে একই ডিরেক্টরিতে, তবে আমার পরীক্ষাগুলি হিসাবে যদি একই ডিরেক্টরিতে অনেকগুলি জার ফাইল অন্তর্ভুক্ত থাকে তবে এটি কেবল চলমান জারের পথটি ফেরত দেয় (একাধিক পাথ ইস্যু সম্পর্কে যা বাস্তবে এটি গ্রহনে ঘটেছিল)।


java.class.pathমাল্টিভ্যালু করা যেতে পারে। সেই মানগুলির মধ্যে একটি অবশ্যই ডিরেক্টরি বা জার ফাইল সরবরাহ করবে যেখানে বর্তমান বর্গটি অবস্থিত তবে কোনটি?
লার্নের মারকুইস

আমি নিশ্চিত, আমি অন্যান্য সমাধান চেষ্টা করেছিলাম, কিন্তু জার ফাইলের নামটি কখনই পাই না। এটি খুব সহজভাবে কাজ করে! ধন্যবাদ - +1
গিলোড গিরোড-ভিটোচকিনা

5

অন্যান্য উত্তরগুলি কোড উত্সকে নির্দেশ করে বলে মনে হচ্ছে যা জার ফাইলের অবস্থান যা কোনও ডিরেক্টরি নয়।

ব্যবহার

return new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()).getParentFile();

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

4

উপরের নির্বাচিত উত্তরটি কাজ করছে না যদি আপনি জারোমে ডেস্কটপ এনভায়রনমেন্ট (কোনও স্ক্রিপ্ট বা টার্মিনাল থেকে নয়) থেকে তার জারটি ক্লিক করে চালান।

পরিবর্তে, আমি পছন্দ করি যে নীচের সমাধানটি সর্বত্র কাজ করছে:

    try {
        return URLDecoder.decode(ClassLoader.getSystemClassLoader().getResource(".").getPath(), "UTF-8");
    } catch (UnsupportedEncodingException e) {
        return "";
    }

2
আপনি কি এটি কোনও অ্যাপলেট বা কোনও অ্যাপ্লিকেশনটিতে চেষ্টা করেছিলেন? জাভা ওয়েব স্টার্ট ব্যবহার করে চালু হয়েছে? আমার বোধগম্যতা এটি উভয় পরিস্থিতিতেই ব্যর্থ হবে (যদিও অ্যাপ্লিকেশনটি বিশ্বাসযোগ্য)।
অ্যান্ড্রু থম্পসন

এই সমাধানটি কেবল "এর অবস্থান" ফিরিয়ে দিতে পারে। মধ্যে JAR- র ফাইল, অবস্থানটি এর JAR- র ফাইল।
লার্নের মারকুইস

সাবধানতা: URLDecoderবিশেষ অক্ষরগুলি ডিকোড করতে ব্যবহার করার পরামর্শ দেওয়া হয় না । বিশেষত, এর মতো অক্ষরগুলি +ভুলভাবে স্পেসে ডিকোড করা হবে। বিস্তারিত জানার জন্য আমার উত্তর দেখুন।
ctrueden

স্প্রিং বুটে, এটি নিক্ষেপ করবেNullPointerException
রবি পেরেক

আপনি হবে NPEযদি বয়াম মধ্যে কোন সম্পদ।
হোয়াইটএঞ্জেল

3

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

  private String getJarFolder() {
    // get name and path
    String name = getClass().getName().replace('.', '/');
    name = getClass().getResource("/" + name + ".class").toString();
    // remove junk
    name = name.substring(0, name.indexOf(".jar"));
    name = name.substring(name.lastIndexOf(':')-1, name.lastIndexOf('/')+1).replace('%', ' ');
    // remove escape characters
    String s = "";
    for (int k=0; k<name.length(); k++) {
      s += name.charAt(k);
      if (name.charAt(k) == ' ') k += 2;
    }
    // replace '/' with system separator char
    return s.replace('/', File.separatorChar);
  }

অ্যাপলেটগুলির ব্যর্থতা হিসাবে, আপনার সাধারণত স্থানীয় ফাইলগুলিতে যাইহোক অ্যাক্সেস থাকবে না। আমি জেডাব্লুএস সম্পর্কে খুব বেশি জানি না তবে স্থানীয় ফাইলগুলি পরিচালনা করতে অ্যাপ্লিকেশনটি ডাউনলোড করা সম্ভব নাও হতে পারে??


পাথটি ডিকোড করার জন্য বেশ কয়েকটি অন্তর্নির্মিত উপায় রয়েছে। আপনার নিজের কোড লেখার দরকার নেই।
লার্নের মারকুইস

3

আমি জার চালানোর পথটি ব্যবহার করার চেষ্টা করেছি

String folder = MyClassName.class.getProtectionDomain().getCodeSource().getLocation().getPath();

সি: \ অ্যাপ> জাভা-অ্যাপ্লিকেশন.জার

বয়াম ফোল্ডারে "application.jar" নামের অ্যাপ্লিকেশন, Windows এ চালনা " C: \ অ্যাপ্লিকেশন ", স্ট্রিং পরিবর্তনশীল "ফোল্ডারে" -র মান ছিল " \ C: \ অ্যাপ্লিকেশন \ application.jar " এবং আমি সমস্যার জন্য পরীক্ষা ছিল পথের নির্ভুলতা

File test = new File(folder);
if(file.isDirectory() && file.canRead()) { //always false }

সুতরাং আমি "পরীক্ষা" সংজ্ঞায়িত করার চেষ্টা করেছি:

String fold= new File(folder).getParentFile().getPath()
File test = new File(fold);

মত "একটি অধিকার বিন্যাসে পথ পেতে : \ অ্যাপ্লিকেশন গ পরিবর্তে" এর " \ C: \ অ্যাপ্লিকেশন \ application.jar " এবং আমি লক্ষ্য করেছি যে এটা কাজ করে।


3

জার চালানোর সময় সবচেয়ে সহজ সমাধানটি আর্গুমেন্ট হিসাবে পাস করা।

আপনি এটিকে শেল স্ক্রিপ্ট (উইন্ডোজে .bat, .sh যে কোনও জায়গায়) দিয়ে স্বয়ংক্রিয় করতে পারেন:

java -jar my-jar.jar .

আমি .বর্তমান ওয়ার্কিং ডিরেক্টরিটি পাস করতাম ।

হালনাগাদ

আপনি কোনও সাব-ডিরেক্টরিতে জার ফাইলটি আটকে রাখতে চাইতে পারেন যাতে ব্যবহারকারীরা দুর্ঘটনাক্রমে এটি ক্লিক না করে। আপনার কোডটিতে কমান্ড লাইন আর্গুমেন্ট সরবরাহ করা হয়েছে কিনা তা নিশ্চিত করতে এবং আর্গুমেন্টগুলি অনুপস্থিত থাকলে একটি ভাল ত্রুটির বার্তা সরবরাহ করা উচিত।


3

অবশেষে একটি কার্যকারী (এবং সংক্ষিপ্ত) সমাধান খুঁজে পাওয়ার আগে আমাকে অনেকটা গোলমাল করতে হয়েছিল।
এটা সম্ভবত jarLocationএকটি উপসর্গ সঙ্গে আসে file:\বা jar:file\ব্যবহার করে মুছে ফেলা যেতে পারে, যা String#substring()

URL jarLocationUrl = MyClass.class.getProtectionDomain().getCodeSource().getLocation();
String jarLocation = new File(jarLocationUrl.toString()).getParent();

2
String path = getClass().getResource("").getPath();

পাথ সর্বদা জার ফাইলের মধ্যে থাকা সংস্থানটিকে বোঝায়।


1
সেই পথের স্ট্রিংটিকে এখনও আপনার প্রয়োজন অনুসারে সরল করা দরকার। String path = new File(getClass().getResource("").getPath()).getParentFile().getParent(); File jarDir = new File(path.substring(5));
ZZZ

4
উভয়ই getResource("")এবং getResource(".")আমার পরীক্ষায় ব্যর্থ হয়েছিল, যখন ক্লাসটি একটি জেআর ফাইলের মধ্যে থাকতে পারে; উভয় আহ্বান বাতিল।
সিট্রুডেন

2
এই ছোঁড়ার NullPointerException
লার্নের মারকুইস

2
public static String dir() throws URISyntaxException
{
    URI path=Main.class.getProtectionDomain().getCodeSource().getLocation().toURI();
    String name= Main.class.getPackage().getName()+".jar";
    String path2 = path.getRawPath();
    path2=path2.substring(1);

    if (path2.contains(".jar"))
    {
        path2=path2.replace(name, "");
    }
    return path2;}

উইন্ডোজ ভাল কাজ করে


1

হতাশাজনক কিছু হ'ল আপনি যখন গ্রহপদে বিকাশ করছেন MyClass.class.getProtectionDomain().getCodeSource().getLocation()তখন /binডিরেক্টরিটি দুর্দান্ত যা আপনি ফিরে আসেন তবে আপনি যখন এটি একটি জারে সংকলন করেন তখন সেই পথটিতে সেই /myjarname.jarঅংশটি অন্তর্ভুক্ত থাকে যা আপনাকে অবৈধ ফাইলের নাম দেয়।

কোডটি উভয়ই আদর্শে কাজ করতে এবং একবার এটি কোনও জারে সংকলিত হয়ে গেলে, আমি নিম্নলিখিত কোডের টুকরোটি ব্যবহার করি:

URL applicationRootPathURL = getClass().getProtectionDomain().getCodeSource().getLocation();
File applicationRootPath = new File(applicationRootPathURL.getPath());
File myFile;
if(applicationRootPath.isDirectory()){
    myFile = new File(applicationRootPath, "filename");
}
else{
    myFile = new File(applicationRootPath.getParentFile(), "filename");
}

1

অন্যদের সম্পর্কে সত্যই নিশ্চিত নয় তবে আমার ক্ষেত্রে এটি একটি "রান্নেবল জার" দিয়ে কাজ করেনি এবং আমি এই লিচ থেকে phchen2 উত্তর এবং অন্যটি থেকে একসাথে কোডগুলি ঠিক করে কাজ করতে পেরেছি: চলমান জেআর ফাইলের পথ কীভাবে পাব? কোড:

               String path=new java.io.File(Server.class.getProtectionDomain()
                .getCodeSource()
                .getLocation()
                .getPath())
          .getAbsolutePath();
       path=path.substring(0, path.lastIndexOf("."));
       path=path+System.getProperty("java.class.path");

1

সেখানে বেশ কয়েকটি সমাধানের চেষ্টা করেছেন কিন্তু কোনওটিই (সম্ভবত বিশেষ) ক্ষেত্রে সঠিক ফলাফল লাভ করতে পারেনি যে সঞ্চালনযোগ্য জারটি ইক্লিপসে "প্যাকেজিং বহিরাগত লাইব্রেরি" দিয়ে রফতানি করা হয়েছে। কোনও কারণে প্রোটেকশনডোমাইন ভিত্তিক সমস্ত সমাধানের ক্ষেত্রে সেই ক্ষেত্রে শূন্য হয়।

উপরের কয়েকটি সমাধানের সংমিশ্রণ থেকে আমি নিম্নলিখিত কার্যকরী কোডটি অর্জন করতে সক্ষম হয়েছি:

String surroundingJar = null;

// gets the path to the jar file if it exists; or the "bin" directory if calling from Eclipse
String jarDir = new File(ClassLoader.getSystemClassLoader().getResource(".").getPath()).getAbsolutePath();

// gets the "bin" directory if calling from eclipse or the name of the .jar file alone (without its path)
String jarFileFromSys = System.getProperty("java.class.path").split(";")[0];

// If both are equal that means it is running from an IDE like Eclipse
if (jarFileFromSys.equals(jarDir))
{
    System.out.println("RUNNING FROM IDE!");
    // The path to the jar is the "bin" directory in that case because there is no actual .jar file.
    surroundingJar = jarDir;
}
else
{
    // Combining the path and the name of the .jar file to achieve the final result
    surroundingJar = jarDir + jarFileFromSys.substring(1);
}

System.out.println("JAR File: " + surroundingJar);


0

সংরক্ষণাগারের কোড থেকে কল করা এই পদ্ধতিটি .jar ফাইলটি যেখানে ফোল্ডারে ফিরে আসে। এটি উইন্ডোজ বা ইউনিক্স উভয় ক্ষেত্রেই কাজ করা উচিত।


  private String getJarFolder() {
    String name = this.getClass().getName().replace('.', '/');
    String s = this.getClass().getResource("/" + name + ".class").toString();
    s = s.replace('/', File.separatorChar);
    s = s.substring(0, s.indexOf(".jar")+4);
    s = s.substring(s.lastIndexOf(':')-1);
    return s.substring(0, s.lastIndexOf(File.separatorChar)+1);
  } 

কোড থেকে প্রাপ্ত: জেআর থেকে চলমান কিনা তা নির্ধারণ করুন


3
"এটি উইন্ডোজ বা ইউনিক্স উভয় ক্ষেত্রেই কাজ করা উচিত" " তবে কোনও অ্যাপলেট এবং প্রতিটি অ্যাপ্লিকেশন ব্যর্থ হবে। JWS ব্যবহার করে চালু করা হয়েছে।
অ্যান্ড্রু থম্পসন

0

উল্লেখ করুন যে এটি কেবলমাত্র চেক করা আছে Windowsতবে আমি মনে করি এটি অন্যান্য অপারেটিং সিস্টেমগুলিতে নির্ভুল কাজ করে [ Linux,MacOs,Solaris] :)।


একই ডিরেক্টরিতে আমার 2 টি .jar ফাইল ছিল । আমি এক .jarফাইল থেকে অন্য .jarফাইলটি একই ডিরেক্টরিতে থাকা অন্য ফাইলটি শুরু করতে চেয়েছিলাম ।

সমস্যাটি হ'ল আপনি যখন cmdএটি বর্তমান ডিরেক্টরি থেকে শুরু করেন তা হয় system32


সতর্কবাণী!

  • নীচে মনে হয় ফোল্ডারের নাম ;][[;'57f2g34g87-8+9-09!2#@!$%^^&()বা এমনকি আমি সমস্ত পরীক্ষাগুলিতে বেশ ভালভাবে কাজ করেছি()%&$%^@# এটি ভালভাবে কাজ করে।
  • আমি ProcessBuilderনীচের সাথে নীচের সাথে ব্যবহার করছি :

🍂 ..

//The class from which i called this was the class `Main`
String path = getBasePathForClass(Main.class);
String applicationPath=  new File(path + "application.jar").getAbsolutePath();


System.out.println("Directory Path is : "+applicationPath);

//Your know try catch here
//Mention that sometimes it doesn't work for example with folder `;][[;'57f2g34g87-8+9-09!2#@!$%^^&()` 
ProcessBuilder builder = new ProcessBuilder("java", "-jar", applicationPath);
builder.redirectErrorStream(true);
Process process = builder.start();

//...code

🍂 getBasePathForClass(Class<?> classs):

    /**
     * Returns the absolute path of the current directory in which the given
     * class
     * file is.
     * 
     * @param classs
     * @return The absolute path of the current directory in which the class
     *         file is.
     * @author GOXR3PLUS[StackOverFlow user] + bachden [StackOverFlow user]
     */
    public static final String getBasePathForClass(Class<?> classs) {

        // Local variables
        File file;
        String basePath = "";
        boolean failed = false;

        // Let's give a first try
        try {
            file = new File(classs.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());

            if (file.isFile() || file.getPath().endsWith(".jar") || file.getPath().endsWith(".zip")) {
                basePath = file.getParent();
            } else {
                basePath = file.getPath();
            }
        } catch (URISyntaxException ex) {
            failed = true;
            Logger.getLogger(classs.getName()).log(Level.WARNING,
                    "Cannot firgue out base path for class with way (1): ", ex);
        }

        // The above failed?
        if (failed) {
            try {
                file = new File(classs.getClassLoader().getResource("").toURI().getPath());
                basePath = file.getAbsolutePath();

                // the below is for testing purposes...
                // starts with File.separator?
                // String l = local.replaceFirst("[" + File.separator +
                // "/\\\\]", "")
            } catch (URISyntaxException ex) {
                Logger.getLogger(classs.getName()).log(Level.WARNING,
                        "Cannot firgue out base path for class with way (2): ", ex);
            }
        }

        // fix to run inside eclipse
        if (basePath.endsWith(File.separator + "lib") || basePath.endsWith(File.separator + "bin")
                || basePath.endsWith("bin" + File.separator) || basePath.endsWith("lib" + File.separator)) {
            basePath = basePath.substring(0, basePath.length() - 4);
        }
        // fix to run inside netbeans
        if (basePath.endsWith(File.separator + "build" + File.separator + "classes")) {
            basePath = basePath.substring(0, basePath.length() - 14);
        }
        // end fix
        if (!basePath.endsWith(File.separator)) {
            basePath = basePath + File.separator;
        }
        return basePath;
    }

0

এই কোডটি আমার পক্ষে কাজ করেছে:

private static String getJarPath() throws IOException, URISyntaxException {
    File f = new File(LicensingApp.class.getProtectionDomain().().getLocation().toURI());
    String jarPath = f.getCanonicalPath().toString();
    String jarDir = jarPath.substring( 0, jarPath.lastIndexOf( File.separator ));
    return jarDir;
  }

0

এই কোডটি প্রোগ্রামটি কোনও জেআর ফাইল বা আইডিই-র মধ্যে কার্যকর করা হচ্ছে কিনা তা সনাক্ত করার জন্য আমার পক্ষে কাজ করেছিল:

private static boolean isRunningOverJar() {
    try {
        String pathJar = Application.class.getResource(Application.class.getSimpleName() + ".class").getFile();

        if (pathJar.toLowerCase().contains(".jar")) {
            return true;
        } else {
            return false;
        }
    } catch (Exception e) {
        return false;
    }
}

আমার যদি জেআর ফাইলের উইন্ডোজ পূর্ণ পাথের দরকার হয় তবে আমি এই পদ্ধতিটি ব্যবহার করছি:

    private static String getPathJar() {
        try {
            final URI jarUriPath =
                    Application.class.getResource(Application.class.getSimpleName() + ".class").toURI();
            String jarStringPath = jarUriPath.toString().replace("jar:", "");
            String jarCleanPath  = Paths.get(new URI(jarStringPath)).toString();

            if (jarCleanPath.toLowerCase().contains(".jar")) {
                return jarCleanPath.substring(0, jarCleanPath.lastIndexOf(".jar") + 4);
            } else {
                return null;
            }
        } catch (Exception e) {
            log.error("Error getting JAR path.", e);
            return null;
        }
    }

প্রয়োগটি ব্যবহার করে স্প্রিং বুট অ্যাপ্লিকেশনটির সাথে কাজ করা আমার সম্পূর্ণ কোডটি CommandLineRunnerসর্বদা কনসোল ভিউয়ের মধ্যে প্রয়োগটি কার্যকর করা হবে তা নিশ্চিত করতে (জেআর ফাইলের নামে ভুল করে ডাবল ক্লিক), আমি পরবর্তী কোডটি ব্যবহার করছি:

@SpringBootApplication
public class Application implements CommandLineRunner {
    public static void main(String[] args) throws IOException {
        Console console = System.console();

        if (console == null && !GraphicsEnvironment.isHeadless() && isRunningOverJar()) {
            Runtime.getRuntime().exec(new String[]{"cmd", "/c", "start", "cmd", "/k",
                    "java -jar \"" + getPathJar() + "\""});
        } else {
            SpringApplication.run(Application.class, args);
        }
    }

    @Override
    public void run(String... args) {
        /*
        Additional code here...
        */
    }

    private static boolean isRunningOverJar() {
        try {
            String pathJar = Application.class.getResource(Application.class.getSimpleName() + ".class").getFile();

            if (pathJar.toLowerCase().contains(".jar")) {
                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
            return false;
        }
    }

    private static String getPathJar() {
        try {
            final URI jarUriPath =
                    Application.class.getResource(Application.class.getSimpleName() + ".class").toURI();
            String jarStringPath = jarUriPath.toString().replace("jar:", "");
            String jarCleanPath  = Paths.get(new URI(jarStringPath)).toString();

            if (jarCleanPath.toLowerCase().contains(".jar")) {
                return jarCleanPath.substring(0, jarCleanPath.lastIndexOf(".jar") + 4);
            } else {
                return null;
            }
        } catch (Exception e) {
            return null;
        }
    }
}

-1

আমি জাভা 7 তে লিখি, এবং ওরাকলের রানটাইম সহ উইন্ডোজ 7 এবং ওপেন সোর্স রানটাইম সহ উবুন্টুতে পরীক্ষা করি। এটি সেই সিস্টেমগুলির জন্য নিখুঁতভাবে কাজ করে:

যে কোনও চলমান জার ফাইলের পিতামহ নির্দেশকের পথ (এই কোডটি কল করে এমন শ্রেণি ধরে নেওয়া জার সংরক্ষণাগার নিজেই সরাসরি শিশু child):

try {
    fooDir = new File(this.getClass().getClassLoader().getResource("").toURI());
} catch (URISyntaxException e) {
    //may be sloppy, but don't really need anything here
}
fooDirPath = fooDir.toString(); // converts abstract (absolute) path to a String

সুতরাং, foo.jar এর পথটি হ'ল:

fooPath = fooDirPath + File.separator + "foo.jar";

আবার কোনও ম্যাক বা পুরানো উইন্ডোজে এটি পরীক্ষা করা হয়নি


-1

getProtectionDomainপদ্ধতির মাঝে মাঝে কাজ নাও করতে পারে যেমন আপনি কোর জাভা ক্লাস কিছু বয়াম খুঁজে বের করতে হবে যখন (যেমন আমার ক্ষেত্রে StringBuilderআইবিএম JDK মধ্যে বর্গ), তবে নিম্নলিখিত কাজ অঙ্গীভূতভাবে:

public static void main(String[] args) {
    System.out.println(findSource(MyClass.class));
    // OR
    System.out.println(findSource(String.class));
}

public static String findSource(Class<?> clazz) {
    String resourceToSearch = '/' + clazz.getName().replace(".", "/") + ".class";
    java.net.URL location = clazz.getResource(resourceToSearch);
    String sourcePath = location.getPath();
    // Optional, Remove junk
    return sourcePath.replace("file:", "").replace("!" + resourceToSearch, "");
}

URL.getPath () আপনি যা ভাবেন তা করেন না। যে কোনও বিশেষ অক্ষরকে শতাংশ-এনকোড করা হবে।
ভিজিআর

-1

আমার কাছে ক্লাসের স্ট্রিং অবস্থান পাওয়ার আরও একটি উপায় রয়েছে।

URL path = Thread.currentThread().getContextClassLoader().getResource("");
Path p = Paths.get(path.toURI());
String location = p.toString();

আউটপুট স্ট্রিংয়ের রূপটি থাকবে

C:\Users\Administrator\new Workspace\...

স্পেস এবং অন্যান্য অক্ষরগুলি পরিচালনা করা হয় এবং বিনা আকারে file:/। সুতরাং ব্যবহার করা সহজ হবে।

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