我们有一个使用java插件的Gradle项目,它有几个需要构建的命令行工具.该项目只是打包成一个带有依赖项的jar.然后,我们需要几个启动脚本来启动该项目中每个工具的各个入口点.
自然,应用程序插件是一个不错的选择.所以我们将java改为application并提供了一个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'
}
Run Code Online (Sandbox Code Playgroud)
并在根项目settings.gradle中引用
include "tools","tools:csvLoader","tools:summariser"
Run Code Online (Sandbox Code Playgroud)
这工作 - 但每个子项目创建一个相同的jar(只用子项目的名称命名),每个subdir构建文件夹保存该jar的副本以及所有依赖项的另一个副本.多数民众赞成感觉有点浪费.对于那些看到子项目的新开发人员来说,所有这些任务都没有任何代码,这也可能会令人困惑.
有没有更好的方法来告诉gradle做多个与应用程序相关的任务,但是为每个任务更改mainClassName而不必求助于创建空子项目?
谢谢!
这是使用 Gradleapplication
插件生成多个启动脚本的一种方法:
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)
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4057 次 |
最近记录: |