2012-05-09 32 views
18

我正在使用Gradle的應用程序插件來爲獨立的Java應用程序生成安裝。我有一個需要放在類路徑中的配置文件,但似乎無法讓它在sh/bat文件中正確生成類路徑。該配置文件需要位於jar外部。使用Gradle的應用程序插件添加類路徑條目

conf文件位於目錄/src/dist/conf/,所以當我運行installApp時,它將它安裝在像這樣的conf目錄下,如$APP_HOME/conf

我想這個目錄添加到claspath這樣的:

startScripts.classpath.add(files('$APP_HOME/conf')) 

,但是當我看到在SH/BAT文件中的類路徑它補充說,像這樣的條目:

$APP_HOME/lib/conf 

如何告訴gradle刪除此條目的lib部分?

回答

3

在我看來,這就是我要做的不應該是遠遠不尋常的,但作爲一種解決方法,我可以有dist目錄src/dist/lib/conf允許conf目錄放置在lib目錄以及gradle爲sh/bat文件生成的類路徑是否正確。

我會接受另一個答案,如果有人有一個更好的。

+0

感謝@Josh,但是如何在運行應用程序窗體IDE時使用'src/dist/lib/conf'中的資源?因爲如果將它們添加到'sourceSets.main.resources',它們將顯示在jar中。 – pgregory

+0

@pgregory您可以將src/dist/lib/conf添加到IDE中的類路徑中,也可以像src/test/resources一樣添加資源。我做的是後者,因爲通常當我在IDE中運行測試時,它可以與Gradle測試環境共享。 – Josh

4

將文件放到類路徑上的最簡單方法是將其放入src/main/resourcessrc/dist用於將文件添加到分發(即zip文件),而不是Jar/class路徑。

+15

感謝@Peter Niederwieser,我會這樣做,但我希望這個配置文件留在罐子外面。如果它位於src/main /資源中,它將放置在jar中。 – Josh

4

對於您的問題,這不是一個特別好的答案,但我發現了一些startScripts任務尚不具備我們所需的靈活性的實例。

我已經通過直接編輯文件內容解決了這些情況中的一些......並不完全利用Gradle的偉大模型,並沒有特別推薦,但至少展示了Gradle是多麼靈活!

所以,你可以砍東西放到這樣的類路徑:

tasks.startScripts { 
    doLast { 
    def scriptFile = file "${outputDir}/${applicationName}" 
    scriptFile.text = scriptFile.text.replace('CLASSPATH=$APP_HOME/lib', 'CLASSPATH=$APP_HOME/conf/:$APP_HOME/lib') 
    } 
} 

要知道這樣做的時候打破了啓動腳本的平臺獨立性。

3

我做了以下馬丁陶氏配方的變體:

我代替「APP_HOME =」在啓動腳本「出口APP_HOME =」。

然後,我的代碼可以執行System.env.get(「APP_HOME」),然後導航到例如conf /文件夾。

這是我的搖籃黑客:

tasks.startScripts { 
    doLast { 
    def scriptFile = file "${outputDir}/${applicationName}" 
    scriptFile.text = scriptFile.text.replaceAll('APP_HOME=', 'export APP_HOME=') 
    } 
} 

在應用程序的Java代碼示例:

String APP_HOME = System.env().get("APP_HOME"); 
Properties p = new Properties(); 
p.load(new FileInputStream(APP_HOME + "/conf/myapp.properties")) 

希望這有助於。

注意:「導出」在Windows中不起作用!

13

此問題的另一個解決方法(GRADLE-2333)由Alexandr Fadeev here提議。

這裏是(有點修改)亞歷山大的解決方案,解決了這個問題,我在搖籃 - 1.6:

startScripts { 
    classpath += files('src/dist/XxxAPlaceHolderForAConfigxxX') 
    doLast { 
    def windowsScriptFile = file getWindowsScript() 
    def unixScriptFile = file getUnixScript() 
    windowsScriptFile.text = windowsScriptFile.text.replace('%APP_HOME%\\lib\\XxxAPlaceHolderForAConfigxxX', '%APP_HOME%\\config') 
    unixScriptFile.text = unixScriptFile.text.replace('$APP_HOME/lib/XxxAPlaceHolderForAConfigxxX', '$APP_HOME/config') 
    } 
} 

它比約什的解決方案醜了一點,但它可以讓你保持精確的目錄佈局(/src/dist/conf和$ APP_HOME/conf)在原始問題中提到。

相關問題