Gradle Application Plugin - 为具有不同mainClassName的同一项目构建多个启动脚本/ dists

时间:2013-12-23 03:19:06

标签: gradle

我们有一个使用java插件的Gradle项目,它有几个需要构建的命令行工具。该项目只是打包成一个带有依赖项的jar。然后,我们需要几个启动脚本来启动该项目中每个工具的各个入口点。

自然,应用程序插件是一个不错的选择。因此,我们将 java 更改为应用程序,并提供了mainClassName来创建启动脚本和tar distributable。这有助于创建单个应用程序jar,但只有一组使用指定的 mainClassName 的启动脚本。

我们如何为不同的入口点创建多个启动脚本? (不同mainClassName的?)

我尝试过的一种方法是创建一些应用了应用程序插件的子项目,并单独指定了各个mainClassNames

allprojects {
    apply plugin: 'java'

    repositories { 
        // maven repos           
    }

    dependencies {
        compile 'com.thirdparty:somejar:1.0'
    }

    sourceCompatibility = 1.7
}


subprojects {
    apply plugin: 'application'
}


project(':tools:csvLoader') {
    mainClassName = 'com.demo.tools.csvLoader.Loader'
}

project(':tools:summariser') {
    mainClassName = 'com.demo.tools.summary.Summarise'
}

并在根项目settings.gradle

中引用
include "tools","tools:csvLoader","tools:summariser"

这很有效 - 但是每个子项目都创建了一个相同的jar(只是用子项目的名称命名),每个subdir构建文件夹都包含该jar的副本以及所有依赖项的另一个副本。多数民众赞成感觉有点浪费。对于那些看到子项目的新开发人员来说,所有这些任务都没有任何代码也可能会让人感到困惑。

有没有更好的方法可以告诉gradle创建多个与应用程序相关的任务,但更改每个的mainClassName而不必求助于创建空子项目?

谢谢!

2 个答案:

答案 0 :(得分:3)

这是使用Gradle的application插件生成多个启动脚本的一种方法:

mainClassName = "com.example.PrimaryEntryPoint"

startScripts {
  applicationName = 'primary'
}

// For convenience, define a map of additional start scripts.
// Key is script name and value is Java class.
def extraStartScripts = [
    'secondary' : 'com.example.SecondaryEntryPoint',
    'tertiary'  : 'com.example.TertiaryEntryPoint'
]

// Create a task for each additional entry point script.
extraStartScripts.each { scriptName, driverClass ->
  task(scriptName + "-script",
       group: 'CLI Script Generation',
       type: CreateStartScripts) {
    mainClassName = driverClass
    applicationName = scriptName
    outputDir = startScripts.outputDir
    classpath = startScripts.classpath
  }
}

// Include the additional start scripts in the distribution
applicationDistribution.into("bin") {
  from(tasks.withType(CreateStartScripts))
  fileMode = 0755
}

答案 1 :(得分:2)

您可以随时下拉到任务级别并自行声明/配置/连接必要的任务,或者在apply plugin: "application"提供的内容之外声明其他任务。请参阅Gradle用户指南中的application plugin章节,了解相关任务的可用性。