2012-12-03 32 views
6

我有一個Java控制檯應用程序,我準備將其部署到Unix服務器上。我正在編寫一個shell腳本來運行該應用程序。什麼是適用於java控制檯應用程序的良好部署目錄結構

我打算將我的shell腳本放入一個文件夾,我的應用程序jar和相關的jar文件(spring等)到不同的文件夾和屬性文件(需要保持'live'的文件夾) 。然後,我的shell腳本遍歷'jar'和'properties'文件夾中的文件,將它們附加到classpath中,然後再最終調用java ...

這是一個'很好'的部署結構嗎?是否有任何指導如何安排文件以最大限度地提高可維護性和穩定性?是否存在明顯的「錯誤」方法來避免這種情況?

我應該補充一點,對於以前的項目,我將所有shell腳本(啓動java進程和不啓動java進程的那些腳本)放到腳本文件夾中,我的應用程序將jar放入庫中的一個文件夾中子文件夾和外部資源放入配置子文件夾中。然後我寫了一個明確加載所有文件的腳本。當我升級一個圖書館罐子時,它已經很長時間的寫下來了,需要維護。這一次我希望做得更好。另外,感覺沒有必要將我的應用程序JAR從庫中分離出來。

+1

對此使用Maven。 – djechlin

+1

Maven可以爲您的jar創建一個Manifest文件,並引用您的庫jar,然後java本身會找到這些文件。同樣取決於你如何「查看」屬性文件,你可以得到一個單獨的類路徑條目。編寫shell腳本的工作將大大減少。 – Konstantin

+0

謝謝。我將使用maven-jar-pluging來調查我的工作量。我忘記了清單文件可以做到這一點。 –

回答

2

爲什麼它的價值,這是我們使用;

/ 
    /class 
     //package hierarchy here, raw .class files 
    /lib 
     //library jars here, apache commons, gson etc, all .jars 
    /conf 
     //.properties files go here, including ones for libraries 
    /doc 
     //program documentation files, typically .txt 
     /javadocs 
      //java doc html root 
    /sh 
     //shell scripts including execute.sh and compile.sh 

我們使用ant建築,如果有必要經常有源碼樹一個src文件夾。通過這種方式,您只需將/class/lib添加到您的類路徑中,並且永遠不會改變。

+0

這是我的想法。我想很高興看到它在其他地方使用。 –

1

你的情況良好的結構是所謂的uberJar或oneJar,可以使用utils的數量,只是谷歌它。此外,我可以推薦這樣一個很好的代碼作爲http://www.jdotsoft.com/JarClassLoader.php

+0

我可以看到這將如何使類路徑和部署更容易。我擔心的是它隱藏了部署中使用的實際庫。雖然理論上可以確定哪些版本的jar包包含在uberjar中,但我可以看到普通的維護者需要關注。 –

+0

檢查JarClassloader,它允許嵌套的罐子。 – xeye

1

坦率地說,如果它只是一個小應用程序,我會把它放在/opt/<my_java_app>之下,並且在那裏有一個目錄子結構,就像你在開發中一樣。

如果你想更符合UNIX的建議的做法,然後把你的可執行文件(包括您jar)在/usr/local/bin/<my_java_app>,配置文件在/etc/<my_java_app>,登錄/var/<my_java_app>文件和其他數據文件。您也可以參考this document

0

構建系統本地程序包,並使用系統默認值。如果使用Debian,請從您的構建系統直接創建.deb(例如,使用ant deb task)。如果使用rpms,請使用rpm task。這樣,您可以像任何其他應用程序一樣輕鬆地部署,取消部署和更新應用程序。

系統軟件包應該分開庫(我用我的罐子使用/usr/share/java/AppName)和配置(到/etc/AppName/home/UserName/.AppName);啓動腳本我符號鏈接到/usr/bin。除此之外,讓事情沒有太大的複雜性。我建議您在發行版中找到着名的基於java的軟件包並複製它們的啓動腳本(特別是他們的虛擬機定位魔法)。

相關問題