这让我感到困惑。
在我的Eclipse工作区中,我有一个名为" Java scratchpad"的项目。在" Package Explorer"你看" src" (源文件夹)在此下,然后" root" (包)。在" 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:/我的文档/软件项目/工作区/ Java暂存
但是......当我在命令提示符下运行相同的代码时,我必须从以下目录开始:
G:\ My Documents \ software projects \ workspace \ Java scratchpad \ bin
...然后去>提示时java root.LoggingTest
。
以上代码的输出是:
路径G:/我的文档/软件项目/工作区/ Java暂存器/ bin
换句话说,当您在命令提示符下运行该事物时,您正在\ bin目录下运行.class文件,但是当您在Eclipse中运行时,Eclipse框架"假装" bin目录不存在。
结果是我得到了当前相对路径的不同值#34; (CWD)取决于我是在Eclipse中运行还是在命令提示符下运行。如果我想创建或使用相对于CWD的目录,我将根据我是在Eclipse中运行还是在命令提示符下运行来获得不同的值。
我今晚感觉很慢。我该怎么办?有没有办法检测项目是在Eclipse中运行还是在命令提示符下运行?或者我应该只是尝试检测路径是否以" \ bin"并删除这四个字符以使路径等效?后
只需添加一条注释即可回复E-Riz的评论:
这很简单:我想创建日志,我想创建Lucene索引......并将事物保存在一个位置(无论如何在此阶段)我只想将此输出放在这样的位置分别为...\Java scratchpad\output\indices\[name of index]
或...\Java scratchpad\output\logging\[name of log]
。
而且,是的,当然,目前我确实知道这里涉及的绝对路径......但是,顾名思义,这是一个"暂存器"或者测试区域......所以这个使用CWD来确定放置或查找日志或索引的位置的代码可以更普遍地使用,而不必知道所涉及的绝对路径。
但它必须在Eclipse或命令提示符下工作......!
注意我当前的解决方法确实是检查pathWithForwardSlashes
是否以" \ bin"结束,如果是,则删除最后4个字符。我无法成为唯一遇到这种奇怪现象的人。打赌有更聪明的解决方案!
答案 0 :(得分:1)
您应该了解或记住几个事实:
.
(调用java
的当前目录)。这就是为什么你似乎必须从你项目的\bin
目录运行你的程序;因为你还没有告诉JVM在其他任何地方寻找课程。运行应用程序时应该是setting the runtime classpath,这可以通过多种方式完成,但对于简单程序,通常通过批处理文件或shell脚本完成。请注意,当您依赖任何JAR时,使用-cp
指定类路径将是至关重要的。因此,您有几个选项可以使事情保持一致:使用脚本/批处理在命令行上运行您的应用程序,指定-cp
以便JVM知道您的类文件在哪里(以及任何其他文件)它也可能需要JARs);或者,重新配置Eclipse启动以匹配您在命令行上运行的位置。我认为(到目前为止)更好的选择是第一个。
说了这么多,当谈到Java中的文件/资源时,通常不需要做任何路径操作。一切都与运行Java的当前工作目录或类路径相关。