2013-11-20 73 views
4

我有一個多包的gradle項目。構建完成後,每個包在build/libs中生成它的jar文件。外部jar依賴被拉入〜/ .gradle。我現在想通過適當的類路徑從命令行本地運行服務。爲此,我正在編寫構建類路徑的腳本。問題是腳本不理解所有的外部依賴關係,因此不能構造類路徑。有沒有一種方法可以幫助Gradle?理想情況下,我想在構建結束時將所有依賴關係轉儲到文件夾中。如何爲Gradle項目生成類路徑?

回答

1

你可以嘗試這樣的事情在你的構建腳本:

// add an action to the build task that creates a startup shell script 
build << { 
    File script = file('start.sh') 

    script.withPrintWriter { 
     it.println '#!/bin/sh' 
     it.println "java -cp ${getRuntimeClasspath()} com.example.Main \"\[email protected]\"" 
    } 

    // make it executable 
    ant.chmod(file: script.absolutePath, perm: 'u+x') 
} 

String getRuntimeClasspath() { 
    sourceSets.main.runtimeClasspath.collect { it.absolutePath }.join(':') 
} 
+0

謝謝。那看起來很有希望我可以將它添加到build.gradle文件的任何位置嗎?另外,我想理想地將類路徑轉存到某處並讓腳本引用文件中的內容。這使我可以有一個腳本來完成一堆事情,而不需要成爲Gradle腳本的一部分。 –

+0

我更新了問題以顯示我所嘗試的以及我看到的錯誤。 –

+0

'sourceSets.main.runtimeClasspath'基本上是一個['FileCollection'](http://www.gradle.org/docs/current/javadoc/org/gradle/api/file/FileCollection.html),它包含File對象到1)構建輸出文件夾('build/classes/main','build/references/main'等),以及2)外部jar依賴關係到他們所在的任何存儲庫。您可以輕鬆地迭代這個集合並複製jar在一個有趣的文件夾中。 – zagyi

10

首先,我會建議使用application plugin如果可以的話,因爲它注意到了這一問題了。

如果你想在classpath自己轉儲到一個文件中,最簡單的方法是一樣的東西:

task writeClasspath << { 
    buildDir.mkdirs() 
    new File(buildDir, "classpath.txt").text = configurations.runtime.asPath + "\n" 
} 

如果你想真正的類路徑上的所有庫複製到一個目錄,你可以這樣做:

task copyDependencies(type: Copy) { 
    from configurations.runtime 
    into new File(buildDir, "dependencies") 
} 
+0

感謝您的回答。如果我使用應用程序插件,如何控制JVM設置?我想通過在命令行中傳遞的特定設置啓動JVM。如果應用程序插件可以幫助我配置它,這將是有用的。 –

+1

我發現這個-http://www.gradle.org/docs/current/dsl/org.gradle.api.Project.html#N13953。讓我玩這個,看看我能不能做到我想要的。 –

+0

我沒有成功地開始工作。我添加了應用程序插件並指定了主類名稱。在運行gradle運行時,我得到了class not found錯誤。此外,類和資源文件夾不會創建,因此我假設的錯誤。命令gradle運行問題是 - /Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home/bin/java -Dfile.encoding = UTF-8 -cp/Users/name/gradleproject/build/classes/main :/ Users/name/gradleproject/build/resources/main MainClass –

相關問題