2014-01-20 40 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,尽管... –

相关问题