与 Eclipse 中的 \bin 目录有关的繁琐事情
Fiddly thing to do with \bin directory in Eclipse
这真是让我百思不得其解。
在我的 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 );
结果是
path G:/My Documents/software projects/workspace/Java scratchpad
但是...当我在命令提示符下 运行 运行同一段代码时,我必须从以下目录开始:
G:\My Documents\software projects\workspace\Java 暂存器\bin
... 然后在提示符处转到 > java root.LoggingTest
。
以上代码的输出是:
path G:/My Documents/software projects/workspace/Java scratchpad/bin
换句话说,当您 运行 命令提示符下的东西时,您 运行 在 \bin 目录下创建一个 .class 文件,但是当您 运行在Eclipse中,Eclipse框架"pretends"bin目录不存在
结果是我得到了不同的 "current relative path" (CWD) 值,这取决于我是在 Eclipse 中还是在命令提示符下 运行ning。如果我想创建或使用与 CWD 相关的目录,我将根据我是 运行 在 Eclipse 中还是在命令提示符下获得不同的值。
今晚我感觉很慢。我应该怎么办?有没有办法检测项目是在 Eclipse 中还是在命令提示符下 运行?或者我应该简单地尝试检测路径是否以“\bin”结尾并删除这四个字符以使路径等效?
以后
只是在回复 E-Riz 的评论时添加注释:
这是一件简单的事情:我想创建日志,我想创建 Lucene 索引...并将内容保存在一个位置(无论如何在这个阶段)我只想将此输出放在一个位置,例如...\Java scratchpad\output\indices\[name of index]
或 ...\Java scratchpad\output\logging\[name of log]
.
而且,是的,目前我确实知道这里涉及的绝对路径...但是,顾名思义,这是一个 "scratchpad" 或测试区域...所以这段代码使用 CWD 来确定在哪里放置或查找日志或索引可以更通用地使用,而不必知道所涉及的绝对路径。
但它必须在 Eclipse 或命令提示符下工作...!
注意,我目前的解决方法确实是检查 pathWithForwardSlashes
是否以“\bin”结尾,如果是,则删除最后 4 个字符。我不可能是唯一遇到这种怪事的人。肯定有更聪明的解决方案!
有几个事实你应该知道或记住:
- 在运行时,Java可以(应该)被赋予一个class工作路径;默认应用程序 classpath 只是
.
(调用 java
的当前目录)。这就是为什么在您看来您必须从项目的 \bin
目录中 运行 您的程序;因为您还没有告诉 JVM 在其他任何地方寻找 classes。当 运行 应用程序时,您应该 setting the runtime classpath,这可以通过多种方式完成,但对于简单的程序,通常通过批处理文件或 shell 脚本完成。请注意,当您依赖任何 JAR 时,使用 -cp
指定 class 路径将是至关重要的。
- 在 Eclipse 中,由于应用程序不是 运行 通过命令行,Eclipse 具有启动配置,它封装了启动程序所需的所有细节(在 "run" 或 "debug" 模式)。 Here's a decent tutorial(虽然有点过时;您可以在互联网上找到更多关于启动配置的信息。您正在寻找的关键配置在 Arguments选项卡,您可以在其中指定程序启动配置的工作目录。默认是项目的根目录。看看这与您在命令行上 运行 时有何不同?这解释了您的不同之处重新查看输出。您可以在 Eclipse 启动配置中更改工作目录,但我倾向于将其保留为项目根目录。
因此,您有几个选项可以使事情保持一致:在命令行上使用 script/batch 到 运行 您的应用程序,指定 -cp
以便 JVM 知道在哪里您的 class 文件是(以及以后可能需要的任何其他 JAR);或者,重新配置您的 Eclipse 启动以匹配您在命令行中 运行 的位置。我认为(到目前为止)最好的选择是第一个。
综上所述,当涉及到 Java 中的 files/resources 时,通常根本不需要进行任何路径操作。一切都与 Java 来自 运行 的当前工作目录或 class 路径有关。
这真是让我百思不得其解。
在我的 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 );
结果是
path G:/My Documents/software projects/workspace/Java scratchpad
但是...当我在命令提示符下 运行 运行同一段代码时,我必须从以下目录开始:
G:\My Documents\software projects\workspace\Java 暂存器\bin
... 然后在提示符处转到 > java root.LoggingTest
。
以上代码的输出是:
path G:/My Documents/software projects/workspace/Java scratchpad/bin
换句话说,当您 运行 命令提示符下的东西时,您 运行 在 \bin 目录下创建一个 .class 文件,但是当您 运行在Eclipse中,Eclipse框架"pretends"bin目录不存在
结果是我得到了不同的 "current relative path" (CWD) 值,这取决于我是在 Eclipse 中还是在命令提示符下 运行ning。如果我想创建或使用与 CWD 相关的目录,我将根据我是 运行 在 Eclipse 中还是在命令提示符下获得不同的值。
今晚我感觉很慢。我应该怎么办?有没有办法检测项目是在 Eclipse 中还是在命令提示符下 运行?或者我应该简单地尝试检测路径是否以“\bin”结尾并删除这四个字符以使路径等效?
以后
只是在回复 E-Riz 的评论时添加注释:
这是一件简单的事情:我想创建日志,我想创建 Lucene 索引...并将内容保存在一个位置(无论如何在这个阶段)我只想将此输出放在一个位置,例如...\Java scratchpad\output\indices\[name of index]
或 ...\Java scratchpad\output\logging\[name of log]
.
而且,是的,目前我确实知道这里涉及的绝对路径...但是,顾名思义,这是一个 "scratchpad" 或测试区域...所以这段代码使用 CWD 来确定在哪里放置或查找日志或索引可以更通用地使用,而不必知道所涉及的绝对路径。
但它必须在 Eclipse 或命令提示符下工作...!
注意,我目前的解决方法确实是检查 pathWithForwardSlashes
是否以“\bin”结尾,如果是,则删除最后 4 个字符。我不可能是唯一遇到这种怪事的人。肯定有更聪明的解决方案!
有几个事实你应该知道或记住:
- 在运行时,Java可以(应该)被赋予一个class工作路径;默认应用程序 classpath 只是
.
(调用java
的当前目录)。这就是为什么在您看来您必须从项目的\bin
目录中 运行 您的程序;因为您还没有告诉 JVM 在其他任何地方寻找 classes。当 运行 应用程序时,您应该 setting the runtime classpath,这可以通过多种方式完成,但对于简单的程序,通常通过批处理文件或 shell 脚本完成。请注意,当您依赖任何 JAR 时,使用-cp
指定 class 路径将是至关重要的。 - 在 Eclipse 中,由于应用程序不是 运行 通过命令行,Eclipse 具有启动配置,它封装了启动程序所需的所有细节(在 "run" 或 "debug" 模式)。 Here's a decent tutorial(虽然有点过时;您可以在互联网上找到更多关于启动配置的信息。您正在寻找的关键配置在 Arguments选项卡,您可以在其中指定程序启动配置的工作目录。默认是项目的根目录。看看这与您在命令行上 运行 时有何不同?这解释了您的不同之处重新查看输出。您可以在 Eclipse 启动配置中更改工作目录,但我倾向于将其保留为项目根目录。
因此,您有几个选项可以使事情保持一致:在命令行上使用 script/batch 到 运行 您的应用程序,指定 -cp
以便 JVM 知道在哪里您的 class 文件是(以及以后可能需要的任何其他 JAR);或者,重新配置您的 Eclipse 启动以匹配您在命令行中 运行 的位置。我认为(到目前为止)最好的选择是第一个。
综上所述,当涉及到 Java 中的 files/resources 时,通常根本不需要进行任何路径操作。一切都与 Java 来自 运行 的当前工作目录或 class 路径有关。