2009-09-14 81 views
0

我有一個Java應用程序,並且log4j.properties文件位於src/com/my/path/props中。在編譯的,它被複制到類/ COM /我的/路徑/道具如何在用戶目錄更改時獲取文件的文件路徑?

文件通過PropertyConfigurator.configureAndWatch加載(user.dir來+ 「/classes/com/my/path/props/log4j.properties」)。

這一切都正常工作,雖然它不是理想的,因爲使用user.dir(但我不知道另一種方式來引用文件相對於「應用程序的開始目錄」)。嘗試使用NT Service包裝器運行此應用程序時,會出現此問題。以這種方式完成後,user.dir將從應用程序的根目錄更改爲NTService包裝器的exe文件所在的位置。

我的問題是:什麼是適當的方式來獲得一個log4j.properties文件的字符串文件路徑表示在我的課/ COM /我的/路徑/道具/目錄?我意識到如果道具文件在一個罐子裏,這將完全崩潰;但在這種情況下,它不是,只是文件系統上的一個文件。 ()。getClassLoader()。getResource(「com/my/path/props/log4j.properties」)。getURI())。getAbsolutePath(),但失敗了,因爲在生產中,文件的路徑實際上是UNC路徑,因此會拋出「URI具有權限組件」異常。

如何其他人處理這個問題?

謝謝。

+1

我很困惑,因爲你說該文件被複制到類路徑(即在類目錄中),但後來你提到「user.dir」。如果您正在從類路徑加載文件,那麼「user.dir」是無關緊要的。你想從哪裏加載文件? – SingleShot 2009-09-14 23:10:05

+0

由於Eclipse的正常編譯過程,它被複制到了classes目錄中。所以發生在部署時,prop文件位於classes目錄中 – 2009-09-14 23:13:09

+0

OK,我會嘗試回答... – SingleShot 2009-09-14 23:22:28

回答

0

我拿了singleshot的意見,並保持屬性文件了SRC的,而是在我加入到classpath中一個單獨的目錄。回想起來,這確實是以我最初的方式配置它。

從那裏,我的問題是從URL獲取文件。我最終在Commons IO FileUtils中找到了我需要的方法,其方法爲toFile(URL)

的代碼最終看上去像這樣:同樣

private URL maintenanceConfigPath = this.getClass().getClassLoader().getResource("MaintenanceConfig.properties"); 
.... 
File f = FileUtils.toFile(maintenanceConfigPath); 
.... 

,感謝所有您的反饋,並指着我下來這讓我對答案的路徑

1

好的。所以......你問了別人怎麼處理這個問題。首先,他們不會將它放在Eclipse中放置文件的位置。他們選擇他們想要他們的地方,他們想如何訪問他們,然後讓他們的構建工具(除非他們只是在玩耍,不應該像Eclipse一樣是IDE,而是像Maven或Ant這樣的專用構建工具),在哪裏放好它。

你想要的文件取決於你想用它做什麼的選擇。如果它只是一個在運行時永遠不會編輯的配置文件,那麼通常會將其放置在JAR中(這是另一種做法 - 應用程序放置在一個或多個JAR,WAR或EAR中,而不是類目錄中)。如果文件要在運行時進行編輯,從「看」的情況看起來就是這種情況,通常將它放在JAR外部的config目錄中。

如何訪問它(從文件路徑或類路徑)是另一種選擇。在可能的情況下,我傾向於從類路徑訪問文件,因爲它更便於攜帶 - 而且在JAR中時,幾乎是必需的。如果您的情況沒有意義,那麼選擇除「user.dir」之外的路徑(如果部署時該路徑發生更改)。您可以對其進行硬編碼,使用環境變量,屬性,配置文件,命令行參數等來設置實際路徑。

總是選擇那裏的東西去,你如何訪問它們。不要讓你的工具爲你選擇。它將使你的生活更輕鬆:-)

+0

+1。我猜測OP沒有正確使用類路徑,因爲完全理解了「看」 – ChssPly76 2009-09-14 23:42:40

+0

。我應該已經更清楚了:我正在使用classes目錄,因爲我沒有任何理由去其他地方。其他未觀看的道具文件居住在那裏,我想將所有屬性文件放在這個應用程序中,而不是放在classes目錄中(我喜歡這個習慣),有些放在不同的道具目錄中。 java類中沒有辦法說「給我一個相對於」me「的文件,其中」me「是類嗎?而且這樣做完全不好嗎? – 2009-09-14 23:45:23

+0

類在類路徑上,所以除非你做有些東西很奇怪,你不能訪問相對於類的文件,你可以根據類路徑的根目錄訪問它們,如果你的文件位於類路徑的目錄中,你可以使用上面的類加載器例子訪問它(不要使用「user.dir」style)。請注意,它不是相對於你的類 - 你只是簡單地使用你的類來獲得一個類加載器來訪問類路徑,這應該工作 – SingleShot 2009-09-14 23:51:59

相關問題