簡體   English   中英

Java -jar:訪問外部配置文件

[英]Java -jar : access external configuration file

我正在尋找一些我認為不會有困難的事情。

我有一個應用程序,我想打包成jar,因為我有~30個依賴項,我希望能夠部署單個文件。

我有一些配置文件 - 屬性文件和彈簧配置文件,以及我的log4道具文件 - 我想在jar外部。 我想我希望如果我將它們放在與jar相同的目錄中,它會在運行時找到它們,但事實並非如此。

在開發過程中,我將這些文件放在我的eclipse項目的類路徑的根目錄下,應用程序發現它們就好了。 我覺得我錯過了jar / classpath理論的一些關鍵方面......

所以我想要的是能夠將配置文件和jar放在同一個目錄中,並讓我的應用程序找到配置文件,當我用標准的java -jar運行它時。

有沒有一種簡單的方法來實現這一目標?

我會為后人保留我對這個問題的解決方案。

我認為我可能期望java -jar做一些它不做的事情。

如果你使用常規java命令,你可以在類路徑中包含jar,你最終會得到與java -jar幾乎相同的東西,只需要專門命名你想要使用的類。 它看起來像這樣:

java -cp .:path/to/Jar.jar com.company.package.Class arg1=val1 arg2=val2 ....

你有可能會為你創建一個腳本來啟動程序,所以命令行調用的額外復雜性實際上並不多,因為你只會構建它一次。

你會看到我包括'。' 作為類路徑中的第一項,這意味着與jar相同的目錄中的任何內容也將包含在類路徑中。 當然jar中的所有內容也包含在類路徑中,因為jar本身也在類路徑中。

您還會看到我已經展示了如何在命令行中輸入args。 這是我不確定什么時候我開始但它按預期工作。

我確信這只是基本的Java部署知識,但由於某種原因我缺乏它。

我希望這有助於其他人。 如果有人能說“不要試圖讓-jar工作 - 只需使用-cp方法”,那肯定會節省我很多時間......

你需要添加“。” 到您為應用程序構建的jar文件的類路徑。

所以在清單中,我希望看到

Main-Class: some.full.Name
Class-Path: . needed-lib.jar other-lib.jar 

然后,當您通過執行運行您的應用程序時

java -jar myapp.jar

它實際上使用

java -classpath .;needed-lib.jar;other-lib.jar some.full.Name

這樣,帶有myapp.jar文件的目錄中的任何文件也將位於類路徑中。 該類路徑是相對於包含它的jar的位置。

Log4j for one期望log4j.xml配置文件位於類路徑上。 如果您不使用名稱log4j.xml,則還必須在啟動命令中添加系統屬性,以告知log4j庫查找其他名稱。

我不確定Spring對配置文件的期望。 屬性文件加載取決於用於加載文件的機制。 使用FileReader或InputStream根本不使用類路徑機制。 在這種情況下,您需要知道應用程序期望文件相對於當前工作目錄的位置。

暫無
暫無

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

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