2014-01-20 61 views
7

我有一個可用的Maven構建版本(如下所示),它準備了幾個可執行文件作爲兩個獨立的進程啓動。使用Gradle的多個啓動腳本

雖然這工作正常,那麼如何使用Gradle做到這一點?我發現Gradle提供了一個名爲application的插件,但我很難找到一個很好的例子,告訴它在輸入時:gradle stage,它應該創建2個可執行文件。

現在,當我打電話stage只在我gradle這個腳本中定義的 「根」 mainclass提供了一個可執行文件:

apply plugin: 'java' 
apply plugin: 'application' 

mainClassName = 'SpringLauncher' 
applicationName = 'foo' 
compileJava.options.encoding = 'UTF-8' 
targetCompatibility = '1.7' 
sourceCompatibility = '1.7' 

task stage(dependsOn: ['clean', 'installApp', 'hello']) 

而且Maven構建:

<build> 
<plugins> 
    <plugin> 
    <groupId>org.codehaus.mojo</groupId> 
     <artifactId>appassembler-maven-plugin</artifactId> 
     <version>1.1.1</version> 
     <configuration> 
     <assembleDirectory>target</assembleDirectory> 
     <programs> 
      <program> 
       <mainClass>foo.bar.scheduler.SchedulerMain</mainClass> 
       <name>scheduler</name> 
      </program> 
      <program> 
       <mainClass>SpringLauncher</mainClass> 
       <name>web</name> 
      </program> 
     </programs> 
     </configuration> 
     <executions> 
      <execution> 
       <phase>package</phase><goals><goal>assemble</goal></goals> 
      </execution>    
     </executions> 
    </plugin> 
</plugins> 

回答

9

不幸的是,gradle應用程序插件沒有爲多個可執行腳本提供一流的支持。

幸運的是,由於gradle腳本很流行,您可以更改應用程序插件的合理操作。

documentation for the Application plugin表明startScripts任務是CreateStartScripts型的,所以嘗試創建自己的同類型

task schedulerScripts(type: CreateStartScripts) { 
    mainClassName = "foo.bar.scheduler.SchedulerMain" 
    applicationName = "scheduler" 
    outputDir = new File(project.buildDir, 'scripts') 
    classpath = jar.outputs.files + project.configurations.runtime 
} 

的第二個任務則包括任務的輸出在分發

applicationDistribution.into("bin") { 
      from(schedulerScripts) 
      fileMode = 0755 
} 
+2

將'duplicatesStrategy ='exclude''添加到複製任務將消除'bin /'目錄內的重複腳本。 – Whymarrh

2

它可能會更好使用JavaExec

task scheduler(type: JavaExec) { 
    main = "foo.bar.scheduler.SchedulerMain" 
    classpath = sourceSets.main.runtimeClasspath 
} 

task web(type: JavaExec) { 
    main = "SpringLauncher" 
    classpath = sourceSets.main.runtimeClasspath 
} 

然後您可以運行gradle scheduler web

+0

這不會幫助他在腳本上使用Heroku,儘管... –

相關問題