Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从java类获取项目目录_Java - Fatal编程技术网

从java类获取项目目录

从java类获取项目目录,java,Java,当IDE运行时,以及当我在cmd中手动编译和运行时,System.getProperty(“user.dir”)给出不同的目录时,我遇到了一个问题。我的事情是这样的,我有这样的项目结构: project - exports - src - main - java - Main - file1 - file2 main方法中的args之一是我随后访问的这两个文件之一的名称 当我在IDE中配置我的run时,它就像一个符咒一样工作-我得到的目录是C:\Users\***\*

当IDE运行时,以及当我在cmd中手动编译和运行时,
System.getProperty(“user.dir”)
给出不同的目录时,我遇到了一个问题。我的事情是这样的,我有这样的项目结构:

project
- exports
- src
  - main
    - java
      - Main
- file1
- file2 
main
方法中的
args
之一是我随后访问的这两个文件之一的名称

当我在IDE中配置我的run时,它就像一个符咒一样工作-我得到的目录是
C:\Users\***\***\***\project
,它能够读取和写入文件

但是当我在cmd
javac Main.java
中编译它,然后运行它时,我得到了
C:\Users\***\***\***\project\src\Main\java
,因此,我不必修改路径就无法访问该文件

我的问题是,是否有一条黄金之路,可以在这两种情况下都有效,而无需我改变返回的路径

编辑:

为了清楚地理解,我知道
System.getProperty(“user.dir”)
返回什么,但我的问题是,使用
Path
是否可以获得相同的结果,或者是否必须获取路径并对其进行编辑,以使其在项目目录中结束

在IDE中我得到:
C:\Users\petri\Desktop\CZM\bicycle statistics

cmd中的
C:\Users\petri\Desktop\CZM\bicycle statistics\src\main\java

我希望在cmd中获得与在IDE中相同的路径

我尝试使用
路径.get(“”).toabsolutionPath()
,但都是一样的

所以,我所做的是:

Path path = Paths.get("").toAbsolutePath();
while (!path.endsWith("project")) {
    path = path.getParent();
}

它是有效的,但我想问,是否有更优雅的方法,因为我必须在我的主管面前为我的解决方案辩护。

通常,您的IDE将在
src/main/java
中构建源文件,并将类文件写入其他目录,如
target/classes

如果IDE以这种方式构建项目,则可以通过切换到项目目录(
cd C:\Users\***\***\***\project
使用您的示例)然后运行以下命令行来运行该项目:

java -classpath target/classes Main
假设IDE将文件放置在
target/classes
的位置。如果源目录中确实有类文件,那么使用
-classpath src/main/java

如果始终从项目目录运行程序,则可以假定程序中的当前目录是项目目录。您甚至不必使用
user.dir
然后,只需为所有内容使用相对路径名,例如,
path/to/whatever.dat
将自动解析为
C:\Users\***\***\***\project\path\to\whatever.dat

main方法中的一个参数是这两个文件之一的名称

然后确保您输入的名称正确

例如,如果当前工作目录是
project
文件夹,则name
file1
将引用
file1
文件。如果当前工作目录是
java
文件夹,那么程序的参数必须是
。\..\..\file1

这是因为您提供了相对的文件名,这意味着它们是相对于当前工作目录的

或者,提供一个完全限定的名称,则无论当前工作目录是什么,参数都是相同的:


C:\Users\***\***\***\project\file1

这是否回答了您的问题
C:\Users\..\..\..\project
段实际上是两个点,还是仅仅代表其他目录名?如果它们是文本,则解析为
C:\project
@JimGarrison,它们是普通的文件夹名称,例如
文档
请不要使用
来表示文本目录名称<代码>。表示路径中特定的内容,使用该特定字符集会产生错误的想法。我建议您使用
C:\Users\***\***\foo\bar
或类似的东西。除了
。我的建议是,您永远不要依赖
System.getProperty(“user.dir”)
的结果,也不要依赖任何其他需要代码之外的特定行为的路径。在我看来,只有两种很好的方法可以找到一个特定的文件:1)相对于一个已知的位置,比如在类路径中,或者在当前用户的主目录中,或者2)通过传入的绝对路径。就我的$0.02,但我已经这么做很长时间了,试图使用当前工作目录或系统属性或环境变量的值(您没有显式设置)只是自找麻烦。是的,我确实这样做了,但问题是当我与我的“主管”共享我的工作时,他试图在他的工作场所运行它。这就是为什么我要问是否有可能以特定的方式获得绝对路径,或者我是否必须更改路径。将脚本放入项目目录中,该目录使用类路径(如我的回答所述)运行程序,并告诉您的主管运行该脚本。@AP11当您的主管运行代码时,(s)他应该知道工作目录如何工作,并根据代码的执行方式正确限定文件名。如果supervisor甚至不知道工作目录是如何工作的,那么你就不应该给supervisor源代码,而是给它一个可运行的jar,并且jar和文件紧挨着,运行程序将是轻而易举的事。没错,我的第一个解决方案实际上是手动更改项目路径以减轻我的痛苦,由于带有项目路径的变量解决了我遇到的
IDE&cmd
问题,但他坚持让我自动执行。@AP11 automatically=script,正如威利斯所评论的,所以创建一个
.bat
文件来编译和运行。您也应该考虑使用构建脚本。谢谢,但是在IDE中它工作得很好,我的问题是当我在CMD中运行它时,它返回了我的目录。