簡體   English   中英

覆蓋 Bash 腳本中的 ClassPath 以運行 Java 應用程序

[英]Override ClassPath in Bash script to run Java application

我正在嘗試在 Unix 中運行一個簡單的 Java 應用程序。 我的 Java 應用程序在運行時從目錄中讀取配置文件。 我將文件放在 /tmp/paddy/ 中。 我創建了一個簡單的 bash 腳本來運行應用程序。

我像下面這樣嘗試,它給了我“app.jar 中沒有主要清單屬性”錯誤

#!/bin/bash    
java -cp ".:./config/*.*" -jar "app.jar" com.test.MainClass

並嘗試使用以下命令這次我的應用程序正在運行但找不到 aconfig 文件,因此它向我拋出NullPointerException -(因為它無法加載配置文件)

#!/bin/bash
java -cp app.jar com.test.MainClass

Java -cp命令中覆蓋類路徑的正確方法是什么? 我在互聯網上搜索,但沒有得到任何好的答案。 我在 Windows 中運行沒有任何問題。 僅在 linux 中,我對 linux 環境還很陌生。

這里有四個不同的問題。

-jar 和 -cp 不能一起工作

如果您使用 -jar 開關,則類路徑取自 jar 清單中的Class-Path清單條目,這就是將發生的全部- 完全忽略-cp開關(和 CLASSPATH 環境變量)。 解決方案是修復您的 jarfile,它應該具有該類路徑條目。

這不是 bash 的工作方式。

與該問題不同的是,您的-cp參數已損壞。

*.*在.. linux ...? 那是 90 年代后期的 DOS,伙計!

它是 java 解析那個 *,這是獨一無二的,因為在 linux 中它通常是 bash 這樣做,但這在這里不起作用,因為 bash 將添加空格,而 java 需要冒號/分號,這就是 java 這樣做的原因本身。 關鍵是,java 相當有限,只能理解一個 *. 哪個 bash 會搞砸。 因此,實際上只有一種方法可以做到這一點。

  • 單引號。
  • 一顆星。

例如:

java -cp '.:./config/*' com.test.MainClass

你似乎不明白類路徑是如何工作的

在類路徑中每個個體的條目必須

  • 包含類文件的目錄。
  • 一個 jar 文件

請注意,它不能是“包含 jar 文件的目錄”,也不能是“類文件”; 那不是一回事。 * 是通常的處理方式:它獲取您用/*填充的目錄中的每個文件,並將它們全部視為類路徑的一部分。

所以,如果你寫: java -cp . ,這將不包括app.jar 如果您編寫java -cp './config/*' ,則不會包含掛在 ./config 上的任何類或配置文件(僅位於那里的 jar 文件)。

這不是配置文件的工作方式

在類路徑上包含配置文件不是它的完成方式。 你當然可以。 這不會做任何事情,除非您使用SomeClass.class.getResourcegetResource其他一些變體(那些不好,您應該使用SomeClass.class.getResourceSomeClass.class.getResourceAsStream ,但我離題了),在這種情況下,不要這樣做。 這些不是用於配置文件,而是用於靜態文件(永遠不會更改的文件,例如,您的 Swing 用戶界面應用程序的“保存到雲”圖標)。 如果你這樣做,你需要在你的類路徑中包含./config (而不是'./config/*' ),但修復你的代碼會是一個更好的主意。

配置文件應該在用戶的主目錄 - System.getProperty("user.home") 您應該將包含 jar 文件的目錄視為可執行文件所在的位置,而這些目錄不一定可由用戶編輯,而配置文件的重點當然是您可以編輯它們。 因此,為什么對這些使用類路徑不是如何完成的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM