前言
這次是有個兩年前的項目吧,不知道為什麼無法啟動了。中間疊代了多個版本,現在另一個同僚接手了,上司讓看一下。因為時間間隔過長,問題處理比較費勁。其中有的是配置問題,比較好解決。
中間有個FileNotFoundException的問題困擾了很長時間,最後找了個簡單法子解決,希望給有碰到的網友提供些方法和靈感。報錯如下:
背景
我用的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>
問題流程:可以正常啟動,中間報錯也可以,但是通路接口就會報錯,然後自動停止(maven啟動)。如下圖:
解決方法
1.直接在下面建立一個名為etc檔案夾的
2.在IDEA中,你可以通過以下步驟設定Maven的工作目錄:
- 在IDEA的右側邊欄中打開 "Maven Projects" 工具視窗。
- 找到你想運作的Maven項目,右鍵點選并選擇 "Run Maven Build..."。
- 在彈出的對話框中,找到 "Working directory" 區域,填入你想設定的目錄路徑,比如
- 之後每次運作該Maven項目時,都會使用你設定的工作目錄。這樣應該就可以解決你的問題了。
提醒一下,使用絕對路徑可能會導緻你的項目在其他環境中無法正常運作。如果可能,建議你使用相對路徑或類路徑來引用資源檔案。
思路:我們在報錯日志中可以明顯看到這個是去尋找的絕對路徑,是以我們如果隻是想本地測試的話,直接使用上面的辦法指定目錄即可。
在代碼中查到引用了一個包,包中的業務邏輯是查詢項目下etc檔案。因為我使用的時候是21年,是以我強烈懷疑是有人後期有改動這個配置的代碼位址,并且我復原後依舊無法正常啟動。
錯誤示例
這些下面是我在網上百度是碰到的一些解決方法,沒有頂用的,供大家參考下。
1.修改配置檔案的路徑: 将
data-cloud-service-client.properties
檔案移動到你的源代碼目錄,如src/main/resources,然後在代碼中使用
classpath:data-cloud-service-client.properties
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);
}
}
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>
說實話這個bug解決倒是不難,難點在于找到bug的源頭,尤其是多年的老代碼,真的是全靠自己扣,真是太費勁了。
今天就到這裡吧,感覺有用的小夥伴可以點個贊,你的支援就是我更新的最大動力!