这真的让我很困惑。
在我的Eclipse工作区中,我有一个名为"Java scratchpad"的项目。在"软件包资源管理器"中,您可以看到"src"(源文件夹),然后是"root"(软件包)。在"根"下是一个名为"LoggingTest.java"的.java文件。
所以这个java文件的路径是"G:\My Documents\software projects\workspace\java scratchpad\src\root\LoggingTest.java"。
当我在Eclipse中运行以下代码时:
Path currentRelativePath = Paths.get("");
String s_currRelPath = currentRelativePath.toAbsolutePath().toString();
String pathWithForwardSlashes = s_currRelPath.replace( "\", "/" );
System.out.println( "path " + pathWithForwardSlashes );
结果是
路径G:/My Documents/software projects/workspace/Java scratchpad
但是。。。当我在命令提示符下运行同一段代码时,我必须在以下目录中启动:
G: \我的文档\软件项目\工作空间\ Java草稿页\bin
然后在提示下转到>CCD_ 1。
上述代码位的输出为:
路径G:/My Documents/software projects/workspace/Java scratchpad/bin
换句话说,当你在命令提示符下运行这个东西时,你正在\bin目录下运行一个.class文件,但当你在Eclipse中运行时,Eclipse框架"假装"bin目录不存在。
结果是,我得到了"当前相对路径"(CWD)的不同值,这取决于我是在Eclipse中运行还是在命令提示符下运行。如果我想创建或使用一个相对于CWD的目录,我将获得不同的值,这取决于我是在Eclipse中运行还是在命令提示符下运行。
今晚我感觉很慢。我该怎么办?有没有一种方法可以检测项目是在Eclipse中运行还是在命令提示符下运行?还是应该简单地检测路径是否以"\bin"结尾,并删除这四个字符以使路径等效?
稍后
只是在回复E-Riz的评论时添加了一条注释:
这是一件简单的事情:我想创建日志,我想创建Lucene索引。。。为了把东西放在一个位置(无论如何,在这个阶段),我只想把这个输出分别放在...Java scratchpadoutputindices[name of index]
或...Java scratchpadoutputlogging[name of log]
这样的位置。
是的,当然,目前我确实知道这里涉及的绝对路径。。。然而,顾名思义,这是一个"草稿本"或测试区。。。因此,使用CWD来确定将日志或索引放置或查找到哪里的代码可以更通用地使用,而不必知道所涉及的绝对路径。
但它必须在Eclipse中或在命令提示符下工作。。。!
注意,我目前的解决方法确实是检查pathWithForwardSlashes
是否以"\bin"结尾,如果是,则删除最后4个字符。我不是唯一一个遇到这种怪事的人。肯定有更聪明的解决方案!
有几个事实你应该知道或记住:
- 在运行时,Java(应该)可以被赋予一个类路径来使用;默认的应用程序类路径只是
.
(从中调用java
的当前目录)。这就是为什么在您看来,您必须从项目的bin
目录运行程序;因为您没有告诉JVM在其他地方查找类。在运行应用程序时,您应该设置运行时类路径,这可以通过多种方式完成,但对于简单的程序,通常是通过批处理文件或shell脚本完成的。请注意,当您依赖于任何JAR时,使用-cp
来指定类路径将是至关重要的 - 在Eclipse中,由于应用程序不是通过命令行运行的,因此Eclipse具有"启动配置",它封装了启动程序(在"运行"或"调试"模式下)所需的所有细节。这里有一个不错的教程(虽然有点过时,但你可以在Interweb上找到更多关于启动配置的信息。你要寻找的关键配置是在Arguments选项卡上,在那里你可以指定程序启动配置的工作目录。默认目录是项目的根目录。看看这与你在命令行上运行时有什么不同解释您在输出中看到的差异。您可以在Eclipse启动配置中更改工作目录,但我倾向于将其保留为项目根目录
因此,有几个选项可以使事情保持一致:使用脚本/批处理在命令行上运行应用程序,指定-cp
,这样JVM就知道类文件在哪里(以及以后可能需要的任何其他JAR);或者,重新配置您的Eclipse启动,以匹配您在命令行上的运行位置。我认为(到目前为止)更可取的选择是第一个。
说了这么多,当涉及到Java中的文件/资源时,通常不需要进行任何路径操作。一切都与Java运行的当前工作目录或类路径有关。