Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.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
IntelliJ和Java读取文件的默认路径_Java_Maven_Intellij Idea - Fatal编程技术网

IntelliJ和Java读取文件的默认路径

IntelliJ和Java读取文件的默认路径,java,maven,intellij-idea,Java,Maven,Intellij Idea,我对IntelliJ和Java中默认文件搜索路径的设置有点困惑。我将IntelliJ作为一个标记,因为这个IDE肯定会修改/添加一些额外的搜索路径 考虑以下虚拟代码: File ff = new File("test.txt"); if(ff.exists() && !ff.isDirectory()) { System.out.println("Exist"); LabelReader lr = new LabelReader(f

我对IntelliJ和Java中默认文件搜索路径的设置有点困惑。我将IntelliJ作为一个标记,因为这个IDE肯定会修改/添加一些额外的搜索路径

考虑以下虚拟代码:

    File ff = new File("test.txt");
    if(ff.exists() && !ff.isDirectory()) {
        System.out.println("Exist");
        LabelReader lr = new LabelReader(ff);
    } else {
        System.out.println("Missing");
    }
在IntelliJ中,如果
test.txt
将被放置在项目最顶层目录中(即与
src
pom.xml
e.c.t一起),这将只起作用

第一个问题:
哪个设置负责添加/修改此虚拟起始路径

现在是
ClassLoader
,它是
getResource

    ClassLoader cl = DayTwoMain.class.getClassLoader();
    URL pathURL = cl.getResource("test.txt");
    File ff = new File(pathURL.getPath());
    if(ff.exists() && !ff.isDirectory()) {
        System.out.println("Exist");
        LabelReader lr = new LabelReader(ff);
    } else {
        System.out.println("Missing");
    }
将产生
NullPointerException
,因为
URL
被设置为
null
,但以下是伪调用:

    ClassLoader cl = DayTwoMain.class.getClassLoader();
    URL pathURL = cl.getResource("");
提供指向
[ProjectRoot]/target/classes

第二个问题:
为什么
ClassLoader
path设置为生成后目录?它是否与编译源代码后从此目录开始的实际JVM相关?如何以及在何处对其进行更改/修改

现在有了资源。我假设IntelliJ/Maven项目文件、图像、配置和其他静态文件应存储在resources文件夹中。因此,IntelliJ中标记为resources root的文件夹应按原样复制到目标目标,但对我来说,情况并非如此,目标仅包含类文件夹,未复制任何资源。我必须手动将带有参考资料的部分添加到
pom.xml
中,如下所示:

    <resources>
        <resource>
            <directory>src/main/resources/*</directory>
        </resource>
    </resources>

src/main/resources/*
强制IntelliJ将其复制到目标

第三个问题
这不是IntelliJ自动完成的任务吗?所有这些巨大的IDE都是通过点击的乐趣和乐趣来自动化这些任务的工具吗?还是我做错了什么?

新文件(“test.txt”)
将尝试从当前工作目录中读取文件。在IntelliJ中,每个运行配置允许根据指定工作目录选项

这可能是特定于平台的,例如,如果通过
cmd/c java
而不是
cmd
配置在windows上启动了带有
java
可执行文件的自定义运行配置,例如注册表项适用

此外,如果您使用插件特定的运行配置,例如Maven或Gradle,他们可能会应用自己的规则和设置。尤其是在子模块的多模块项目中,路径可能不同于父模块


这与您提出的与
ClassLoader
和Maven资源筛选相关的问题完全不同。这不是IntelliJ管理的,IDE只方便使用运行配置运行。

运行/调试配置中的工作目录设置会影响从中读取文件的默认路径。
test.txt
在输出路径中丢失,因此NPE。它必须放在资源根目录中才能复制到类路径中,您可以找到数百个类似的问题和答案。类加载器从类路径加载资源,您在IDE中开发的项目中的类路径就是输出路径。默认情况下,它应该使用默认的Maven目录布局。您不需要将此目录添加到资源中。如果它不起作用,请将一个bug与一个示例项目一起归档以在中复制。您似乎混淆了工作目录和类路径。这些是完全不同的概念。