maven項目具有特定的項目結構,所以自定義的一些文件需要通過特殊的訪問方式才能在代碼中訪問,而不能通過簡單的絕對路徑或相對路徑就能訪問。
maven打包項目的時候,其實改變了原有編碼時的結構,如圖:
編碼時的項目結構:

maven打包時的項目結構:

其實maven項目在運行的時候,其實執行的是target目錄下的class代碼。但是編碼的時候如果按照原有的文件路徑訪問本項目中的文件,那么會找不到文件。
所以需要換一個方式
以該項目結構為例

- 訪問1號文件
- 方式一
-
ClassLoader classLoader = DocOperator.class.getClassLoader(); URL resource = classLoader.getResource("00000.docx"); String path = resource.getPath(); System.out.println(path);
-
- 方式二
-
URL resource1 = DocOperator.class.getResource("/00000.docx"); System.out.println(resource1.getPath()); String path = resource1.getPath();
-
訪問2號文件
訪問2號文件時,需要修改pom文件,因為maven會忽略「case」這個文件夾,也就是target目錄中會沒有「case」目錄,自然在Java代碼中也就訪問不到了。
所以需要在pom文件中新增一個配置
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<!--包含文件夾以及子文件夾下所有資源-->
<include>**/*.*</include>
</includes>
</resource>
</resources>
</build>
新增之后

然后就可以按照訪問文件1的方式訪問文件2,只需要將路徑改成「case/00000.docx」。
注意事項:
- 路徑前面加「/」和不加的區別
URL resource1 = DocOperator.class.getResource("/");
URL resource2 = DocOperator.class.getResource("");
System.out.println("帶斜杠: " + resource1.getPath());
System.out.println("不帶斜杠: " + resource2.getPath());

帶有「/」訪問的是根目錄,不帶「/」訪問的是所有類的公共包名。
