【问题标题】:Gradle Application Plugin - Building multiple start scripts / dists for the same project with different mainClassNameGradle 应用程序插件 - 为具有不同 mainClassName 的同一项目构建多个启动脚本/dist
【发布时间】:2014-01-11 06:12:27
【问题描述】:

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

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

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

我尝试的一种方法是创建一些应用了 application 插件并单独指定各个 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 而不必诉诸于创建空子项目?

谢谢!

【问题讨论】:

    标签: gradle


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我的情况与问题中描述的情况完全相同。 Peter,您是否建议扩展应用程序插件中提供的功能以便能够创建多个启动脚本?你能详细说明一下吗? Neversleepz,你是接受彼得的想法还是接受“浪费”的罐子解决方案?
      • @JesChergui 我们实际上放弃了这个要求,但我理解解决方案是定义类似task mySecondAppNeedsAStartScript(type: CreateStartScripts) { ... } ` CreateStartScripts 记录在这里:gradle.org/docs/current/dsl/…
      猜你喜欢
      • 2023-03-21
      • 2020-03-05
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 2023-03-08
      • 2019-04-20
      • 2019-03-18
      • 2014-06-22
      相关资源
      最近更新 更多