IDEA 能以“模块”作为基本单位。如下所示,一个 Demo 项目下有 Module0、Module1 两个模块:
Demo
|-- .idea
|-- Module0
|-- Module0
在每个模块下,至少包含一个 src 目录和一个 .iml 文件:
Module0
|-- src
|-- Module0.iml
.iml 文件也可以替换为 .classpath 文件
所有的 java 源代码(.java 文件)都必须放在 src 目录下。之所以要放在 src 目录下,是因为 src 目录被标记为了 Sources。事实上:
- 源代码要放在标记为 Sources 的目录下;
- 源代码的资源文件要放在标记为 Resources 的目录下;
- 测试代码要放在标记为 Tests 的目录下;
- 测试代码的资源文件要放在标记为 Test Resources 的目录下。
编译后,.class 文件、资源文件等,都会被放到项目的 out 目录下。其中:
- 源代码及其资源文件,被放在 out/production/Module0 下(Module0 为模块名)(因此,资源文件直接放在源代码所在的目录下也是没问题的);
- 测试代码及其资源文件,被放在 out/test/Module0 下。
自己生成的 jar 包被放在 /out/artifacts/Module0_jar 下。
编译后的代码:
out 目录的设置:
假设在 src 目录下有一个文件 jdbc.properties,其内容如下:
driver = com.mysql.cj.jdbc.Driver
同时在 src 目录下有一个 Demo0.java,其内容如下:
import java.io.IOException;
import java.io.FileInputStream;
import java.util.Properties;
public class Demo0 {
public static void main(String[] args) throws IOException {
Properties props = new Properties();
props.load(new FileInputStream("Module0/src/jdbc.properties")); // 注意路径的写法
String driver = props.getProperty("driver");
System.out.println(driver);
}
}
上述代码中,路径要从 Demo 项目的根目录开始写起。
查看根目录:
System.out.println(System.getProperty("user.dir"));
事实上,当在 IDEA 中运行 java 程序时,就是在命令行中运行如下命令:
java -cp D:/……/Demo/out/production/Module0 Demo0
--cp 用于指定 .class 文件、.jar 文件所在的目录。
而且,IDEA 中命令行的当前工作目录就是项目的根目录。所以,路径才需要从项目根目录写起。
当你直接在 out/production/Module0 目录下执行 java Demo
,肯定会出错,因为按之前的相对路径,已经找不到文件了。
由此可见,脱离了 IDEA,该程序就无法正常运行了。即使是打成 jar 包,照样报错。
解决方法:使用 Class 类的 getResourceAsStream() 方法。该方法会从 .class 文件所在的目录查找文件,而编译时,资源文件与 .class 文件会放在同一个目录,所以一定可以找到文件。
将 Demo0.java 修改为如下:
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class Demo1 {
public static void main(String[] args) throws IOException {
Properties props = new Properties();
/* 改动起始位置 */
InputStream rs = Demo1.class.getResourceAsStream("jdbc.properties");
props.load(rs);
/* 改动结束位置 */
String driver = props.getProperty("driver");
System.out.println(driver);
}
}
getResourceAsStream() 更多详见:Java 获取资源文件的输入流 - 知乎 (zhihu.com)
其它
Maven 标准结构
Module0
|-- src
|-- main
|-- java
|-- resources
|-- test
|-- java
|-- resources