**想改进这篇文章吗?**提供这个问题的详细答案,包括引文和解释为什么你的答案是正确的。没有足够细节的答案可能会被编辑或删除。
我的代码运行在一个jar文件中,比如foo.jar,我需要知道,在代码中,运行foo.jar的文件夹在哪个文件夹中。所以,如果foo.jar在 C:\FOO\ ,无论当前工作目录是什么,我都希望获得该路径。
C:\FOO\
bjp0bcyl1#
我很惊讶地看到最近没有人提议使用 Path . 下面是一段引文:“the Path 类包括各种方法,这些方法可用于获取有关路径的信息、访问路径的元素、将路径转换为其他形式或提取路径的部分“因此,一个好的选择是获得 Path 目标为:
Path
Path path = Paths.get(Test.class.getProtectionDomain().getCodeSource().getLocation().toURI());
igsr9ssn2#
String path = getClass().getResource("").getPath();
路径总是指向jar文件中的资源。
tktrz96b3#
试试这个:
String path = new File("").getAbsolutePath();
50few1ms4#
其他答案似乎指向代码源,即jar文件位置,而不是目录。使用
return new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()).getParentFile();
3df52oht5#
我也有同样的问题,我这样解决了:
File currentJavaJarFile = new File(Main.class.getProtectionDomain().getCodeSource().getLocation().getPath()); String currentJavaJarFilePath = currentJavaJarFile.getAbsolutePath(); String currentRootDirectoryPath = currentJavaJarFilePath.replace(currentJavaJarFile.getName(), "");
我希望我能对你有所帮助。
wkftcu5l6#
令人沮丧的是,当您在eclipse中开发时 MyClass.class.getProtectionDomain().getCodeSource().getLocation() 返回 /bin 目录,但当您将其编译为jar时,路径包含 /myjarname.jar 给你非法文件名的部分。为了让代码在ide中工作,并且在编译成jar之后,我使用以下代码:
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"); }
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”,我注意到它是有效的。
r1zhe5dt8#
您还可以使用:
CodeSource codeSource = YourMainClass.class.getProtectionDomain().getCodeSource(); File jarFile = new File(codeSource.getLocation().toURI().getPath()); String jarDir = jarFile.getParentFile().getPath();
flvlnr449#
如果您从gnome桌面环境(而不是从任何脚本或终端)单击jar来运行它,那么上面选择的答案将不起作用。相反,我喜欢以下解决方案在任何地方都有效:
try { return URLDecoder.decode(ClassLoader.getSystemClassLoader().getResource(".").getPath(), "UTF-8"); } catch (UnsupportedEncodingException e) { return ""; }
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"));
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
htzpubme12#
提到它只在 Windows 但我认为这很管用
Windows
zu0ti5jz13#
在我最终找到一个有效的(短期的)解决方案之前,我不得不做了很多事情。有可能 jarLocation 前缀如下 file:\ 或者 jar:file\ ,可以使用 String#substring() .
jarLocation
file:\
jar:file\
String#substring()
URL jarLocationUrl = MyClass.class.getProtectionDomain().getCodeSource().getLocation(); String jarLocation = new File(jarLocationUrl.toString()).getParent();
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教程。
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中确实发生了多路径问题)。
25条答案
按热度按时间bjp0bcyl1#
我很惊讶地看到最近没有人提议使用
Path
. 下面是一段引文:“thePath
类包括各种方法,这些方法可用于获取有关路径的信息、访问路径的元素、将路径转换为其他形式或提取路径的部分“因此,一个好的选择是获得
Path
目标为:igsr9ssn2#
路径总是指向jar文件中的资源。
tktrz96b3#
试试这个:
50few1ms4#
其他答案似乎指向代码源,即jar文件位置,而不是目录。
使用
3df52oht5#
我也有同样的问题,我这样解决了:
我希望我能对你有所帮助。
wkftcu5l6#
令人沮丧的是,当您在eclipse中开发时
MyClass.class.getProtectionDomain().getCodeSource().getLocation()
返回/bin
目录,但当您将其编译为jar时,路径包含/myjarname.jar
给你非法文件名的部分。为了让代码在ide中工作,并且在编译成jar之后,我使用以下代码:
gdx19jrr7#
我试着用
c:\app>java-jar应用程序.jar
在windows上运行名为“application.jar”的jar应用程序时,文件夹“c:\app”中字符串变量“folder”的值是“\c:\app\application.jar”,我在测试路径的正确性时遇到问题
所以我试着把“测试”定义为:
以正确的格式获取路径,比如“c:\app”而不是“\c:\app\application.jar”,我注意到它是有效的。
r1zhe5dt8#
您还可以使用:
flvlnr449#
如果您从gnome桌面环境(而不是从任何脚本或终端)单击jar来运行它,那么上面选择的答案将不起作用。
相反,我喜欢以下解决方案在任何地方都有效:
czq61nw110#
以下是其他评论的升级版本,在我看来,这些评论对于
在.jar文件外使用相对的“文件夹”(在jar的相同位置):
xkftehaa11#
适用于windows
htzpubme12#
提到它只在
Windows
但我认为这很管用zu0ti5jz13#
在我最终找到一个有效的(短期的)解决方案之前,我不得不做了很多事情。
有可能
jarLocation
前缀如下file:\
或者jar:file\
,可以使用String#substring()
.lztngnrs14#
使用classloader.getresource()查找当前类的url。
例如:
(这个例子取自一个类似的问题。)
要找到目录,您需要手动拆分url。有关jar url的格式,请参阅jarclassloader教程。
d7v8vwbk15#
为了得到jar文件的运行路径,我研究了上述解决方案,并尝试了各种不同的方法。如果这些代码在eclipseide中运行,那么它们都应该能够找到文件的路径,包括指定的类,并使用找到的路径打开或创建指定的文件。
但这很棘手,当直接或通过命令行运行可运行的jar文件时,会失败,因为从上述方法得到的jar文件路径会在jar文件中给出一个内部路径,即它总是给出一个
rsrc:project-name (也许我应该说它是主类文件的包名-指定的类)
我无法转换rsrc:... 指向外部路径的路径,即在eclipseide外部运行jar文件时无法获取jar文件的路径。
获取在eclipseide外部运行jar文件的路径的唯一可能方法是
这个代码行可能会返回正在运行的jar文件的活动路径(包括文件名)(注意,返回路径不是工作目录),正如java文档和一些人所说,它会返回同一目录中所有类文件的路径,但是作为我的测试,如果同一目录中包含许多jar文件,它只返回运行jar的路径(在eclipse中确实发生了多路径问题)。