2015-05-05 21 views
3

TL; DR:在Java世界中,是否有一種標準方式讓構建工具安裝他們剛剛構建的可執行文件(如C世界的make install)?Java世界中的「make install」的等價物

(我將很高興與該會在Linux上只工作溶液)

更多細節

我必須通過github上分佈的Java項目。編譯和依賴關係使用Maven 2.運行mvn package管理建立與我的罐子壓縮包,並在運行時所需要的依賴關係,加上其設置類路徑和啓動主要的廣口瓶中的可執行腳本:

#!/bin/bash 
cpBase="$(dirname "$0")" 
java -cp "$cpBase/*" dw.cli.Program [email protected] 

所以,如果有人想她的計算機上安裝此,一個需要:

  • 運行mvn package
  • ,然後解壓壓縮包,並在目錄中的內容複製在她的PATH

在另一方面我喜歡的自動工具的工作方式:用戶並不需要手動複製任何東西,因爲構建步驟make install處理安裝她。

我可以使用cp通過我的pom.xml中的ant任務來模擬此行爲,但我更感興趣的是學習Java的最佳實踐,而不是提供非標準的行爲。

看起來好像是maven doesn't provide this behavior。另一方面,我完全不知道其他Java構建工具可以做些什麼。


編輯:

據我瞭解mvn installmvn deploy不適合我的需要,因爲他們會在我的本地或遠程倉庫安裝我的罐子。而我想對我的PATH安裝我的可執行文件(例如:安裝我的包裝腳本/usr/local/bin

+0

我可能只是不明白這個問題,但你爲什麼不寫一個'Makefile'並把它放到你的項目的根目錄?有了這個,你可以將所有需要的步驟封裝在'install'任務中,以便確實只需編寫'make install'。 – jeromegamez

+0

當然,我可以添加一個Makefile(或一個特別的shell腳本)。我從來沒有見過這種設置的Java回購,我想堅持Java通用實踐。我的意思是:當我克隆一個C庫時,我很少需要查看README以瞭解如何編譯和安裝它,因爲它總是相同的。我想知道Java是否也有這種規則。 – gturri

回答

-1

您還有其他MVN目標,如「MVN部署」和「MVN安裝」是你所需要的。

+0

恐怕不能滿足我的需求。我剛剛編輯我的問題來解釋原因。 – gturri

+0

安裝將工件安裝到本地存儲庫並將其傳輸到遠程存儲庫。 – khmarbaise

1

您可以創建一個發佈檔案(zip,tar.gz),它可以由用戶下載,只需要解包並將bin文件夾添加到路徑。

問題是你不能自動增強你的路徑環境變量。但是,如果使用appassembler-maven-plugin中生成的腳本,則可以直接調用生成的腳本而不增強路徑。這適用於Linux以及Windows。

這可以通過組合appassembler-maven-pluginmaven-assembly-plugin來實現。

appassembler-maven-plugin將爲您創建相應的shell/bat/cmd文件,而maven-assembly-plugin可以爲您創建相應的歸檔文件(tar.gz,zip)。

舉個例子,你可以在這裏看看:

https://github.com/khmarbaise/supose/tree/master/supose-assembly

+0

它並沒有真正回答我的問題(因爲我發佈了一個存檔,而不是讓構建工具安裝可執行文件),但是appassembler插件看起來很有趣。 +1這個指針。 – gturri

0

「使安裝」的工作原理是複製你的內置文物到他們的目標位置。這種現象是很容易在ANT效仿,因爲喜歡使它允許你指定你自己構建邏輯:

你必須
<target name="install" description="Copy binaries into install location"> 
    <mkdir dir="/opt/myapp/bin"/> 
    <copy file="${dist.dir}/myproject.jar" todir="/opt/myapp/bin"/> 
    <copy file="${dist.dir}/myproject.sh" todir="/opt/myapp/bin"/> 
    <chown owner="${install.owner}"> 
    <fileset dir="/opt/myapp" include="**/*"/> 
    </chown> 
</target> 

課程來運行這個目標爲根:

ant build 
sudo ant install 

的Maven另一方面卻是一種高度自以爲是的構建工具,不支持這種工作流程。爲什麼?這實際上是一個部署操作。當然,您可以使用ANT ANT插件自定義Maven安裝程序,但我建議您只需運行一個shell腳本。地塊更容易理解:

mvn install 
sudo install_myapp.sh 

該腳本可以拾取器Maven的本地倉庫「$ HOME/.m2目錄/庫」或更好內置罐子從Maven倉庫下載吧!

1

問題標記爲「gradle」,所以我會提供Gradle答案。

我認爲你正在構建一個應用程序,而不是一個庫。在這種情況下,Gradle精心提供了application插件。

apply plugin: 'application' 

該插件將提供給您rundistZipdistTarinstallDist任務,怎麼做他們聽起來像。請查看 the official web site的文檔。

請注意,installDist任務默認情況下不會將軟件置於系統的任何位置。相反,它將安裝在保存臨時文件的子目錄build中。您可以在任務上設置destinationDir屬性來糾正此問題。

+0

我將它標記爲「Gradle」,因爲我懷疑它可能會帶來解決方案。感謝這些指針。我對你的回答感到滿意,因爲這個鏈接很有價值,我會潛入文檔中。 – gturri