Gradle应用程序插件-使用不同的mainClassName为同一项目构建多个启动脚本/区

Gradle应用程序插件-使用不同的mainClassName为同一项目构建多个启动脚本/区,gradle,Gradle,我们有一个使用java插件的Gradle项目,它需要构建两个命令行工具。该项目只是打包成一个带有依赖项的jar。然后,我们需要两个启动脚本来启动该项目中每个工具的各个入口点 当然,应用程序插件是一个不错的选择。因此,我们将java更改为application,并提供了一个mainClassName来创建启动脚本和tar可分发脚本。这可以创建一个应用程序jar,但只能创建一组使用指定mainClassName的启动脚本 如何为不同的入口点创建多个启动脚本?(不同的mainClassName) 我尝

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

当然,应用程序插件是一个不错的选择。因此,我们将java更改为application,并提供了一个
mainClassName
来创建启动脚本和tar可分发脚本。这可以创建一个应用程序jar,但只能创建一组使用指定mainClassName的启动脚本

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

我尝试的一种方法是创建一些应用了应用程序插件的子项目,并分别指定各个main类名

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'
}
并在根项目设置.gradle中引用

include "tools","tools:csvLoader","tools:summariser"
这是可行的——但每个子项目都会创建一个相同的jar(只是用子项目的名称命名),每个子项目构建文件夹都会保存该jar的一个副本以及所有依赖项的另一个副本。那感觉有点浪费。对于一个新开发人员来说,看到子项目中有所有这些任务,而且没有任何代码,这也会让人感到困惑

有没有更好的方法让gradle执行多个与应用程序相关的任务,但更改每个任务的mainClassName而不必创建空的子项目


谢谢

您始终可以下拉到任务级别,自己声明/配置/连接必要的任务,或者在
apply plugin:“application”
提供的基础上声明其他任务。请参阅《Gradle用户指南》中相关任务可用的章节。

以下是使用Gradle的
应用程序
插件生成多个启动脚本的一种方法:

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 t = task(scriptName + "-script",
       group: 'CLI Script Generation',
       type: CreateStartScripts) {
    mainClassName = driverClass
    applicationName = scriptName
    outputDir = startScripts.outputDir
    classpath = startScripts.classpath
  }
  startScripts.dependsOn(t)
}

我的处境与问题中描述的完全相同。Peter,您是否建议扩展应用程序插件中提供的功能,以便能够创建多个启动脚本?你能详细说明一下吗?Neversleepz,你是同意Peter的想法还是接受了“浪费”的jars解决方案?@JesChergui我们实际上放弃了这个要求,但我理解这个解决方案是定义类似于
任务mySecondAppNeedsAStartScript(类型:CreateStartScripts){…}
`CreateStartScripts记录在这里: