天天看點

FileNotFoundException:xxx(系統找不到指定的路徑)

作者:你可以叫我老白

前言

這次是有個兩年前的項目吧,不知道為什麼無法啟動了。中間疊代了多個版本,現在另一個同僚接手了,上司讓看一下。因為時間間隔過長,問題處理比較費勁。其中有的是配置問題,比較好解決。

中間有個FileNotFoundException的問題困擾了很長時間,最後找了個簡單法子解決,希望給有碰到的網友提供些方法和靈感。報錯如下:

FileNotFoundException:xxx(系統找不到指定的路徑)

背景

我用的idea而上司用的eclipse,這個無論是哪個用tomcat是沒有這個錯誤的。而使用maven啟動就不行,原因大緻如下:

1.當我們使用Maven來運作Spring Boot Application時,它預設會從項目的根目錄下的 /src/main/resources 檔案夾讀取資源檔案。

2.而當我們使用Tomcat來運作Spring Boot Application時,它會從編譯過後的 /target/classes 檔案夾讀取資源檔案。

3.最後還發現了在pom檔案中有相關建立etc檔案夾下的代碼,關鍵代碼和截圖:

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-war-plugin</artifactId>
   <version>2.1.1</version>
   <configuration>
      <!--将類檔案打成war包 -->
      <failOnMissingWebXml>false</failOnMissingWebXml>
      <!--将資源檔案打到classes目錄下 -->
      <webResources>
         <resource>
            <directory>data/poem</directory>
            <targetPath>WEB-INF/data/poem</targetPath>
            <filtering>true</filtering>
         </resource>
         <resource>
            <directory>etc</directory>
            <targetPath>WEB-INF/etc</targetPath>
            <filtering>true</filtering>
         </resource>
      </webResources>
   </configuration>
</plugin>           
FileNotFoundException:xxx(系統找不到指定的路徑)

問題流程:可以正常啟動,中間報錯也可以,但是通路接口就會報錯,然後自動停止(maven啟動)。如下圖:

FileNotFoundException:xxx(系統找不到指定的路徑)
FileNotFoundException:xxx(系統找不到指定的路徑)

解決方法

1.直接在下面建立一個名為etc檔案夾的

FileNotFoundException:xxx(系統找不到指定的路徑)

2.在IDEA中,你可以通過以下步驟設定Maven的工作目錄:

  1. 在IDEA的右側邊欄中打開 "Maven Projects" 工具視窗。
  2. 找到你想運作的Maven項目,右鍵點選并選擇 "Run Maven Build..."。
  3. 在彈出的對話框中,找到 "Working directory" 區域,填入你想設定的目錄路徑,比如
FileNotFoundException:xxx(系統找不到指定的路徑)
  1. 之後每次運作該Maven項目時,都會使用你設定的工作目錄。這樣應該就可以解決你的問題了。

提醒一下,使用絕對路徑可能會導緻你的項目在其他環境中無法正常運作。如果可能,建議你使用相對路徑或類路徑來引用資源檔案。

思路:我們在報錯日志中可以明顯看到這個是去尋找的絕對路徑,是以我們如果隻是想本地測試的話,直接使用上面的辦法指定目錄即可。

在代碼中查到引用了一個包,包中的業務邏輯是查詢項目下etc檔案。因為我使用的時候是21年,是以我強烈懷疑是有人後期有改動這個配置的代碼位址,并且我復原後依舊無法正常啟動。

FileNotFoundException:xxx(系統找不到指定的路徑)

錯誤示例

這些下面是我在網上百度是碰到的一些解決方法,沒有頂用的,供大家參考下。

1.修改配置檔案的路徑: 将

data-cloud-service-client.properties

檔案移動到你的源代碼目錄,如src/main/resources,然後在代碼中使用

classpath:data-cloud-service-client.properties
FileNotFoundException:xxx(系統找不到指定的路徑)

2.使用Spring的@PropertySource注解: 如果你使用Spring,可以用@PropertySource注解來指定配置檔案的位置。它可以支援檔案路徑和類路徑,比如:

@Configuration
@PropertySource("file:E:/Project/unios/unios-skill-bspt/unios-skill-bspt-controller/etc/data-cloud-service-client.properties")
public class Application {

   public static void main(String[] args) {

      SpringApplication.run(Application.class, args);

   }

}           
FileNotFoundException:xxx(系統找不到指定的路徑)

3.在Maven pom.xml檔案中添加資源(有可能可以): 可以在pom.xml檔案中指定額外的資源路徑。下面是一個例子:

<resources>
			<resource>
				<directory>unios-skill-bspt/${project.basedir}/etc</directory>
				<includes>
					<include>data-cloud-service-client.properties</include>
				</includes>
			</resource>
		</resources>           
FileNotFoundException:xxx(系統找不到指定的路徑)

說實話這個bug解決倒是不難,難點在于找到bug的源頭,尤其是多年的老代碼,真的是全靠自己扣,真是太費勁了。

今天就到這裡吧,感覺有用的小夥伴可以點個贊,你的支援就是我更新的最大動力!

繼續閱讀