java—如何获取正在运行的jar文件的路径?

yfjy0ee7  于 2021-06-29  发布在  Java
关注(0)|答案(25)|浏览(775)

**想改进这篇文章吗?**提供这个问题的详细答案,包括引文和解释为什么你的答案是正确的。没有足够细节的答案可能会被编辑或删除。

我的代码运行在一个jar文件中,比如foo.jar,我需要知道,在代码中,运行foo.jar的文件夹在哪个文件夹中。
所以,如果foo.jar在 C:\FOO\ ,无论当前工作目录是什么,我都希望获得该路径。

bjp0bcyl

bjp0bcyl1#

我很惊讶地看到最近没有人提议使用 Path . 下面是一段引文:“the Path 类包括各种方法,这些方法可用于获取有关路径的信息、访问路径的元素、将路径转换为其他形式或提取路径的部分“
因此,一个好的选择是获得 Path 目标为:

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

igsr9ssn2#

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

路径总是指向jar文件中的资源。

tktrz96b

tktrz96b3#

试试这个:

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

50few1ms4#

其他答案似乎指向代码源,即jar文件位置,而不是目录。
使用

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

3df52oht5#

我也有同样的问题,我这样解决了:

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

我希望我能对你有所帮助。

wkftcu5l

wkftcu5l6#

令人沮丧的是,当您在eclipse中开发时 MyClass.class.getProtectionDomain().getCodeSource().getLocation() 返回 /bin 目录,但当您将其编译为jar时,路径包含 /myjarname.jar 给你非法文件名的部分。
为了让代码在ide中工作,并且在编译成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");
}
gdx19jrr

gdx19jrr7#

我试着用

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

c:\app>java-jar应用程序.jar
在windows上运行名为“application.jar”的jar应用程序时,文件夹“c:\app”中字符串变量“folder”的值是“\c:\app\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:\app”而不是“\c:\app\application.jar”,我注意到它是有效的。

r1zhe5dt

r1zhe5dt8#

您还可以使用:

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

flvlnr449#

如果您从gnome桌面环境(而不是从任何脚本或终端)单击jar来运行它,那么上面选择的答案将不起作用。
相反,我喜欢以下解决方案在任何地方都有效:

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

czq61nw110#

以下是其他评论的升级版本,在我看来,这些评论对于
在.jar文件外使用相对的“文件夹”(在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"));
xkftehaa

xkftehaa11#

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

适用于windows

htzpubme

htzpubme12#

提到它只在 Windows 但我认为这很管用

zu0ti5jz

zu0ti5jz13#

在我最终找到一个有效的(短期的)解决方案之前,我不得不做了很多事情。
有可能 jarLocation 前缀如下 file:\ 或者 jar:file\ ,可以使用 String#substring() .

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

lztngnrs14#

使用classloader.getresource()查找当前类的url。
例如:

package foo;

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

(这个例子取自一个类似的问题。)
要找到目录,您需要手动拆分url。有关jar url的格式,请参阅jarclassloader教程。

d7v8vwbk

d7v8vwbk15#

为了得到jar文件的运行路径,我研究了上述解决方案,并尝试了各种不同的方法。如果这些代码在eclipseide中运行,那么它们都应该能够找到文件的路径,包括指定的类,并使用找到的路径打开或创建指定的文件。
但这很棘手,当直接或通过命令行运行可运行的jar文件时,会失败,因为从上述方法得到的jar文件路径会在jar文件中给出一个内部路径,即它总是给出一个
rsrc:project-name (也许我应该说它是主类文件的包名-指定的类)
我无法转换rsrc:... 指向外部路径的路径,即在eclipseide外部运行jar文件时无法获取jar文件的路径。
获取在eclipseide外部运行jar文件的路径的唯一可能方法是

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

这个代码行可能会返回正在运行的jar文件的活动路径(包括文件名)(注意,返回路径不是工作目录),正如java文档和一些人所说,它会返回同一目录中所有类文件的路径,但是作为我的测试,如果同一目录中包含许多jar文件,它只返回运行jar的路径(在eclipse中确实发生了多路径问题)。

相关问题