Frage

Mein code wird innerhalb einer JAR-Datei, sagen foo.jar und ich muss wissen, in den code, in welchen Ordner ausgeführt foo.jar ist.

Also, wenn foo.jar in C:\FOO\, Ich will, dass Weg, egal, was meine aktuelle Arbeitsverzeichnis ist.

War es hilfreich?

Lösung

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

Ersetzen Sie "MyClass" mit dem Namen Ihrer Klasse.

Offensichtlich wird dies tun seltsame Dinge, wenn Sie Ihre Klasse geladen wurde, von einem nicht-Datei-Speicherort.

Andere Tipps

Beste Lösung für mich:

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

Dies sollte das problem lösen mit Leerzeichen und Sonderzeichen.

Erhalten Sie das File für eine gegebene Class, es gibt zwei Schritte:

  1. Konvertieren Class zu einem URL
  2. Konvertieren URL zu einem File

Es ist wichtig zu verstehen, sowohl Schritten, und nicht verschmelzen Sie.

Sobald Sie die File, Sie können rufen getParentFile um die übergeordneten Ordners, wenn das ist, was Sie brauchen.

Schritt 1: Class zu URL

Wie bereits in anderen Antworten, es gibt zwei wichtige Wege zu finden, um eine URL relevant für eine Class.

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

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

Beide haben vor-und Nachteile.

Die getProtectionDomain Ansatz liefert die Basis Speicherort der Klasse (z.B., das mit der JAR-Datei).Es ist jedoch möglich, dass die Java-runtime security policy werfen SecurityException beim Aufruf getProtectionDomain(), also, wenn Sie Ihre Anwendung ausführen muss, um in einer Vielzahl von Umgebungen, ist es am besten zu testen, in allen von Ihnen.

Die getResource Ansatz liefert die vollständige URL-Ressource, die Weg von der Klasse, von denen Sie benötigen, um durchführen zusätzlicher string-manipulation.Es kann ein file: Weg, aber es könnte auch sein, jar:file: oder auch etwas versauter mag bundleresource://346.fwk2106232034:4/foo/Bar.class bei der Ausführung innerhalb eines OSGi-framework.Umgekehrt, die getProtectionDomain Ansatz richtig, ergibt sich ein file: URL, auch innerhalb von OSGi.

Beachten Sie, dass sowohl getResource("") und getResource(".") konnte in meinen tests, wenn die Klasse wohnte in einer JAR-Datei;beide Aufrufe, gibt Sie null zurück.Daher empfehle ich die #2 Aufruf oben gezeigt, anstatt, wie es scheint sicherer zu machen.

Schritt 2: URL zu File

So oder so, sobald Sie eine URL, der nächste Schritt ist die Umstellung auf eine File.Dies ist seine eigene Herausforderung;finden Kohsuke Kawaguchi s blog post about it für volle details, aber kurz gesagt, Sie verwenden können new File(url.toURI()) solange die URL ist ganz gut-gebildet.

Schließlich, ich würde sehr entmutigen Verwendung URLDecoder.Einige Zeichen der URL, : und / insbesondere sind keine gültige URL-codierte Zeichen.Aus der URLDecoder Javadoc:

Es wird davon ausgegangen, dass alle Zeichen in der kodierten string sind die folgenden:"a" bis "z", "A" bis "Z", "0" bis "9" und "-", "_", ".", und "*".Das Zeichen "%" ist erlaubt, wird aber so interpretiert, dass der Beginn einer besonderen entkommen Sequenz.

...

Es gibt zwei Möglichkeiten, diese decoder könnte deal mit illegalen strings.Es könnte entweder lassen Sie unzulässige Zeichen für sich allein oder könnte es wirft eine IllegalArgumentException.Welcher Ansatz der decoder nimmt, ist in der Umsetzung.

In der Praxis URLDecoder in der Regel nicht werfen IllegalArgumentException als bedroht oben.Und wenn Ihr Pfad Leerzeichen kodiert als %20, dieser Ansatz scheint zu arbeiten.Jedoch, wenn Ihre Datei Weg, den andere nicht-Zeichen alphameric wie + haben Sie Probleme mit URLDecoder mangeln Ihre Datei Pfad.

Funktionierenden code

Zur Erreichung dieser Schritte haben, haben Sie möglicherweise Methoden wie folgenden:

/**
 * 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);
}

Sie finden diese Methoden in der SciJava Common library:

Sie können auch verwenden:

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

Verwenden ClassLoader.getResource (), um den URL für die aktuelle Klasse.

Zum Beispiel:

package foo;

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

(Dieses Beispiel ist entnommen aus eine ähnliche Frage.)

Das Verzeichnis finden, würden Sie dann brauchen auseinander nehmen die URL manuell.Siehe die JarClassLoader tutorial für das format einer jar-URL.

Ich bin überrascht zu sehen, dass keiner vor kurzem vorgeschlagen, die zu verwenden Path.Hier folgt ein Zitat:"Die Path die Klasse enthält verschiedene Methoden, die verwendet werden können, um Informationen über den Pfad, Zugriff auf Elemente der Pfad, konvertieren Sie den Pfad zu anderen Formen, oder extrahieren Teile eines Pfades"

Also, eine gute alternative ist, um die Path objest als:

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

Die einzige Lösung, die für mich funktioniert auf Linux, Mac und Windows:

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();
}

Ich hatte das gleiche problem, und ich löste es auf diese Weise:

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

Ich hoffe, ich war behilflich.

Hier ist ein upgrade auf die Kommentare von anderen, das scheint mir unvollständig für die Besonderheiten des

mit einem relativen "Ordner" außerhalb .jar-Datei (in der jar-die gleichen Lage):

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"));

Für immer den Weg laufen jar-Datei, die ich untersucht habe die oben genannten Lösungen und versucht, alle Methoden, die existieren etwas Unterschied jeder andere.Wenn dieser code in Eclipse-IDE, sollten Sie alle werden in der Lage zu finden den Pfad zu der Datei, einschließlich der angegebenen Klasse und öffnen oder erstellen Sie eine angegebene Datei mit den gefundenen Pfad.

Aber es ist schwierig, beim ausführen der ausführbaren jar-Datei direkt oder über die Kommandozeile, wird Sie nicht wie der Pfad der jar-Datei bekommen von den oben genannten Methoden geben einen internen Pfad in der jar-Datei,, dass ist, es gibt immer einen Weg als

rsrc:Projekt-name (vielleicht sollte ich sagen, es ist der Paketname der Hauptklasse Datei - die angegebenen Klasse)

Ich kann nicht konvertieren die rsrc:...den Pfad zu einer externen Pfad, ist, dass beim ausführen der jar-Datei außerhalb der Eclipse-IDE, die es nicht bekommen können Sie den Pfad der jar-Datei.

Die einzig mögliche Art und Weise für immer den Weg laufen jar-Datei außerhalb von Eclipse IDE

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

diese code-Zeile können wieder das Leben Pfad (einschließlich des Dateinamens) der Ausführung der jar-Datei (beachten Sie, dass der Rückweg ist nicht das Arbeitsverzeichnis), da die java-Dokument und einige Leute sagten, dass er zurückkehren wird, und die Pfade alle class-Dateien im gleichen Verzeichnis, aber als meinen tests, wenn es im selben Verzeichnis sind viele jar-Dateien, es erst dann wieder den Weg laufen jar (über mehrere Pfade Problem in der Tat, es geschah in der Finsternis).

die ausgewählte Antwort oben ist nicht arbeiten, wenn Sie ausführen, Sie Ihr Glas durch einen Klick auf das es aus der Gnome-desktop-Umgebung (nicht aus jedem script oder den terminal -).

Stattdessen habe ich gern, dass die folgende Lösung funktioniert überall:

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

Andere Antworten scheinen zu zeigen, um die code, die Jar-Datei Standort ist kein Verzeichnis.

Verwenden

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

Tatsächlich ist hier eine bessere version - die alte fehlgeschlagen, wenn ein Ordner Namen hatte Platz in ihm.

  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);
  }

Für Versagen mit applets, würden Sie nicht haben in der Regel Zugriff auf lokale Dateien ja sowieso.Ich weiß nicht viel über die Zeugen Jehovas, sondern Griff auf lokale Dateien könnte es nicht möglich sein, die app herunterzuladen.?

Die einfachste Lösung ist, übergeben Sie den Pfad als argument beim ausführen der jar.

Sie automatisieren können dies mit einem shell-Skript (.bat unter Windows, .sh überall sonst):

java -jar my-jar.jar .

Ich verwendet . übergeben Sie das aktuelle Arbeitsverzeichnis.

UPDATE

Sie können wollen zu stick die jar-Datei in einem sub-directory, sodass Benutzer versehentlich darauf klicken.Ihr code sollte auch überprüfen, um sicherzustellen, dass die Kommandozeilen-Argumente geliefert wurden, und bieten eine gute Fehlermeldung, wenn die Argumente fehlen.

Ich hatte alles Durcheinander eine Menge, bevor ich endlich eine Arbeit (und kurze) Lösung.
Es ist möglich, dass die jarLocation kommt mit einem Präfix wie file:\ oder jar:file\, die entfernt werden können durch die Verwendung String#substring().

URL jarLocationUrl = MyClass.class.getProtectionDomain().getCodeSource().getLocation();
String jarLocation = new File(jarLocationUrl.toString()).getParent();
String path = getClass().getResource("").getPath();

Der Pfad bezieht sich immer auf die Ressource innerhalb der jar-Datei.

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;}

Funktioniert gut auf Windows

Ich habe versucht, die jar ausführen mit Pfad

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

c:\app>java-jar application.jar

Ausführen der jar-Anwendung mit dem Namen "application.jar", unter Windows im Ordner "c:\app"der Wert der String variable "folder" war "\c:\app\application.jar"und ich hatte Probleme, testen Pfad für die Richtigkeit

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

Also habe ich versucht zu definieren, "test" wie folgt:

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

bekommen Pfad in einem richtigen format wie "c:\app"statt "\c:\app\application.jar"und ich habe gemerkt, dass es funktioniert.

Etwas frustrierend ist, dass, wenn Sie Entwicklung in Eclipse MyClass.class.getProtectionDomain().getCodeSource().getLocation() gibt die /bin Verzeichnis, das ist großartig, aber wenn Sie es kompilieren, um ein jar, der Pfad enthält den /myjarname.jar Teil, die Ihnen illegale file-Namen.

Die code-Arbeit sowohl in der ide und sobald es kompiliert ist, um ein jar, ich benutze den folgenden code:

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");
}

Nicht wirklich sicher über die anderen, aber in meinem Fall funktionierte es nicht mit einem "Runnable jar" und ich habe es funktioniert, indem die Befestigung codes zusammen aus phchen2 Antwort und ein anderes von diesem link :Wie man den Pfad eines Laufenden JAR-Datei? Der code:

               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");

Habe versucht, mehrere Lösungen gibt, aber keiner lieferte richtige Ergebnisse für die (wahrscheinlich Sonder -) Fall, dass die ausführbare jar exportiert wurde mit "Verpackung externer Bibliotheken" in Eclipse.Für einige Grund, alle Lösungen basieren auf der ProtectionDomain führen in null in, dass Fall.

Durch Kombination von einigen oben genannten Lösungen habe ich es geschafft, um die folgenden funktionierenden code:

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);

Diese Methode, genannt von code im Archiv, gibt Sie den Ordner, wo die .jar-Datei ist.Es sollte funktionieren, in Windows-oder Unix.


  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);
  } 

Abgeleitet von code an: Bestimmen Sie, ob laufen aus JAR

Erwähnen, dass es überprüft nur in Windows aber ich denke, es funktioniert perfekt auf anderen Betriebssystemen [Linux,MacOs,Solaris] :).


Ich hatte 2 .jar Dateien im gleichen Verzeichnis .Ich wollte von der einen .jar Datei zum starten der anderen .jar Datei die im gleichen Verzeichnis.

Das problem ist, dass, wenn Sie starten es von der cmd das aktuelle Verzeichnis ist system32.


Warnungen!

  • Die unten scheint ziemlich gut zu funktionieren, in alle den test habe ich auch getan, mit Ordner-name ;][[;'57f2g34g87-8+9-09!2#@!$%^^&() oder ()%&$%^@# es funktioniert gut.
  • Ich bin mit dem ProcessBuilder mit den folgenden, wie folgenden:

🍂..

//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;
    }

Dieser code funktionierte für mich:

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;
  }

Versuchen Sie dies:

String path = new File("").getAbsolutePath();

Ich Schreibe in Java 7, and test in Windows 7, mit der Oracle zur Laufzeit, und Ubuntu mit dem open-source-runtime.Dies funktioniert perfekt für alle Systeme:

Der Pfad zum übergeordneten Verzeichnis jeder ausführen der jar-Datei (vorausgesetzt, die Klasse aufrufen dieser code ist ein direktes Kind von dem jar-Archiv selbst):

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

Also, der Weg der foo.jar wäre:

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

Wieder war dies nicht getestet auf einem beliebigen Mac oder älteren Windows -

Die getProtectionDomain Ansatz funktioniert möglicherweise nicht manchmal z.B.wenn Sie das Glas für einige der Kern-java-Klassen (. e.g in meinem Fall StringBuilder Klasse in IBM JDK), jedoch Folgendes funktioniert nahtlos:

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, "");
}

Ich habe einen anderen Weg, um den String-Standort einer Klasse.

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

Der Ausgabe-String haben die form

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

Die Leerzeichen und andere Zeichen behandelt werden, und in die form ohne file:/.So wird es leichter zu verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top