我在單擊按鈕時啟動的 JavaFX 專案中有一個 exe 檔案。在 IDE 中作業正常,但如果你在 jar 中構建它會停止作業并拋出此錯誤 - java.lang.IllegalArgumentException: The file: src\main\resources\com\application\exeServices\SetProcessWorkingSetSize.exe 不存在。
專案層次結構:

我稱之為exe的代碼
private void useCleaningService() {
final String path = "src/main/resources/com/application/exeServices/SetProcessWorkingSetSize.exe";
File file = new File(path);
try {
Desktop.getDesktop().open(file);
} catch (Exception e){
System.out.println(e);
}
}
uj5u.com熱心網友回復:
前言:這個答案假設您使用 Maven/Gradle 的“標準目錄布局”,基于 和 的src/main/java存在src/main/resources。
下的檔案src/main/resources是資源,而不是檔案。這意味著您必須使用資源查找 API 訪問它們。例如:
URL url = getClass().getResource("/com/application/exeServices/SetProcessWorkingSetSize.exe");
這將為您提供一個指向您的資源的 URL,并且它將以獨立于應用程式位置的方式執行此操作。換句話說,它在類路徑/模塊路徑上找到資源。如果您想閱讀資源,那么您將打開InputStreamusing URL#openStream()(或InputStream直接通過 using獲取Class#getResourceAsStream(String))。請注意,資源是只讀的。另外,請注意上述內容不包含src/main/resources在路徑中。該目錄僅存在于您專案的開發環境中;它在部署后不存在(也不存在于您的構建輸出中)。
如前所述,資源不是檔案。這意味著您無法使用FileAPI 讀取它們。當您將應用程式打包到 JAR 檔案或自定義運行時映像中時尤其如此,因為File不知道如何讀取/參考打包的資源。
但是你還有另一個問題。我強烈懷疑 Windows 是否能夠在將可執行檔案打包在 JAR 檔案或自定義運行時映像中時執行它。就像FileJava 的 API 一樣,Windows 不知道如何讀取打包的Java資源。您必須將資源提取到常規檔案中,然后讓 Windows 執行該檔案。例如:
// uses java.nio.file.Path and java.nio.file.Files
private void useCleaningService() {
Path exe = Path.of(System.getProperty("user.home"), ".app_name", "SetProcessWorkingSetSize.exe");
try {
if (Files.notExists(exe)) {
try (InputStream in = getClass().getResourceAsStream("/com/application/exeServices/SetProcessWorkingSetSize.exe")) {
Files.createDirectories(exe.getParent());
Files.copy(in, exe);
}
}
Desktop.getDesktop().open(exe.toFile());
} catch (Exception ex) {
ex.printStackTrace();
}
}
這會將可執行檔案提取到用戶主目錄(例如,)中的特定于應用程式的目錄(替換.app_name為您想要的該目錄的任何名稱C:\Users\<username>)。如果目標檔案不存在,它只會執行提取。這將防止不必要的作業,但正如當前實施的那樣,它還將防止用新版本替換可執行檔案(除非您更改目標檔案的名稱)。因此,根據您的需要,您可能希望修改代碼以在每個應用程式實體中提取一次資源(可以通過一個簡單的boolean標志來完成)。
uj5u.com熱心網友回復:
首先檢查檔案是否存在exists()函式,你顯然在你的 jar 中使用了錯誤的檔案路徑
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/498147.html
