我有点困惑如何在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
等一起放置),这才有效
第一个问题:
哪个设置负责添加/修改此虚拟起始路径?
现在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
的URL
第二个问题:
为什么将ClassLoader
路径设置为构建后目录?编译源代码后,是否与从该目录开始的实际JVM有关?如何以及在何处可以更改/修改?
现在有了资源。我认为,IntelliJ / Maven项目文件,图像,配置和其他静态评估应存储在资源文件夹中。因此,在IntelliJ中标记为资源根目录的文件夹应原样复制到目标位置,但对我而言并非如此,目标仅包含classs文件夹,没有资源被复制。我必须手动将带有资源的部分添加到pom.xml
中,如下所示:
<resources>
<resource>
<directory>src/main/resources/*</directory>
</resource>
</resources>
强制IntelliJ将其复制到目标。
第三个问题
这不是IntelliJ自动完成的任务吗?整个大型的IDE都可以通过点选和点击的乐趣来自动完成那些任务?还是我做错了什么?
答案 0 :(得分:0)
new File("test.txt")
将尝试从当前工作目录中的任何一个读取文件。在IntelliJ中,每个运行配置都允许根据documentation: Creating and Editing Run/Debug Configurations
这可以是特定于平台的,例如如果您有一个自定义运行配置,其中在Windows上通过java
比cmd /c java
配置启动了cmd
可执行文件,例如注册表项适用。
此外,如果您使用特定于插件的运行配置,例如Maven或Gradle他们可以应用自己的规则和设置。尤其在子模块的多模块项目中,路径可能与父模块不同。
这与您与ClassLoader
和Maven资源过滤有关的问题完全不同。这些东西不是由IntelliJ管理的,IDE仅使使用“运行配置”运行变得很方便。