使用Gradle的多个启动脚本

0h4hbjxa  于 2022-09-20  发布在  Maven
关注(0)|答案(2)|浏览(223)

我有一个正在运行的Maven构建(如下所示),它准备两个可执行文件作为两个单独的进程启动。

虽然这可以很好地工作,但如何使用Gradle来实现这一点?我看到Gradle提供了一个名为application的插件,但我很难找到一个好的例子来告诉它,当输入:gradle stage时,它应该创建两个可执行文件。

现在,当我调用stage时,它只在Gradle脚本中定义的“根”主类上提供一个可执行文件:

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>
jvlzgdj9

jvlzgdj91#

不幸的是,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
}
cbwuti44

cbwuti442#

使用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

相关问题