it-swarm.dev

كيفية الحصول على مسار تشغيل برنامج جافا

هل هناك طريقة للحصول على مسار الفئة الرئيسية من برنامج Java قيد التشغيل.

الهيكل هو

D:/
|---Project
       |------bin
       |------src

أريد الحصول على المسار كـ D:\Project\bin\.

جربت System.getProperty("Java.class.path"); لكن المشكلة هي ، إذا قمت بتشغيل مثل

Java -classpath D:\Project\bin;D:\Project\src\  Main

Output 
Getting : D:\Project\bin;D:\Project\src\
Want    : D:\Project\bin

هل هناك أي طريقة للقيام بذلك؟



===== EDIT =====

حصلت على حل هنا

الحل 1 (بواسطة جون سكيت )

package foo;

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

هذه المطبوعة:

file:/C:/Users/Jon/Test/foo/Test.class


الحل 2 (بواسطة Erickson )

URL main = Main.class.getResource("Main.class");
if (!"file".equalsIgnoreCase(main.getProtocol()))
  throw new IllegalStateException("Main class is not stored in a file.");
File path = new File(main.getPath());

لاحظ أن معظم ملفات الفئات يتم تجميعها في ملفات JAR وبالتالي لن يعمل هذا في كل حالة (ومن ثم IllegalStateException). ومع ذلك ، يمكنك تحديد موقع JAR الذي يحتوي على الفصل باستخدام هذه التقنية ، ويمكنك الحصول على محتوى ملف الفصل عن طريق استبدال مكالمة بـ getResourceAsStream() بدلاً من getResource() ، والتي ستعمل ما إذا كانت الفئة موجودة على نظام الملفات أم في جرة.

78
Denim Datta

جرب هذا الكود:

final File f = new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath());

استبدل "MyClass" بفصلك الذي يحتوي على الطريقة الرئيسية.

بدلا من ذلك يمكنك أيضا استخدام

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

توفر خاصية النظام المذكورة أعلاه

المسار المستخدم للعثور على الدلائل وأرشيفات JAR التي تحتوي على ملفات فئة. يتم فصل عناصر مسار الفئة بحرف خاص بالنظام الأساسي محدد في خاصية path.separator.

76
Juned Ahsan

استعمال

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

راجع http://docs.Oracle.com/javase/tutorial/essential/environment/sysprop.html

يمكنك أيضًا تقسيمها إلى عناصر بسهولة

String classpath = System.getProperty("Java.class.path");
String[] classpathEntries = classpath.split(File.pathSeparator);
118
René Link

أنت في الواقع لا ترغب في الحصول على المسار إلى صفك الرئيسي. وفقًا لمثالك الذي ترغب في الحصول عليه في دليل العمل الحالي ، أي الدليل حيث بدأ البرنامج. في هذه الحالة ، يمكنك قول new File(".").getAbsolutePath()

20
AlexR
    ClassLoader cl = ClassLoader.getSystemClassLoader();

    URL[] urls = ((URLClassLoader)cl).getURLs();

    for(URL url: urls){
        System.out.println(url.getFile());
    }
0
Ganesh Rengarajan