IntelliJ和Java读取文件的默认路径
我对IntelliJ和Java中默认文件搜索路径的设置有点困惑。我将IntelliJ作为一个标记,因为这个IDE肯定会修改/添加一些额外的搜索路径 考虑以下虚拟代码: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
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与一个示例项目一起归档以在中复制。您似乎混淆了工作目录和类路径。这些是完全不同的概念。