Gradle项目中典型的静态编程语言配置是非常样板的,我正在寻找一种将其抽象成外部构建脚本的方法,以便可以重用。
我有一个可行的解决方案(见下文),但它感觉有点像黑客,因为kotlin gradle插件不是这样开箱即用的。
从外部脚本应用任何非标准插件都很麻烦,因为您无法通过id应用插件,即。
apply plugin:'kotlin'
将导致找不到id为'kotlin'的插件
简单(通常)的解决方法是使用插件的完全限定类名,即。
应用插件:org。喷气式飞机。科特林。格拉德尔。插件。KotlinPluginWrapper
在本例中,它抛出了一个很好的小异常,表明插件可能不是以这种方式调用的:
Failed to determine source cofiguration of kotlin plugin.
Can not download core. Please verify that this or any parent project
contains 'kotlin-gradle-plugin' in buildscript's classpath configuration.
所以我设法拼凑了一个插件(只是真实插件的一个修改版本),迫使它从当前的构建脚本中找到插件。
科特林。格拉德尔
buildscript {
ext.kotlin_version = "1.0.3"
repositories {
jcenter()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
}
apply plugin: CustomKotlinPlugin
import org.jetbrains.kotlin.gradle.plugin.CleanUpBuildListener
import org.jetbrains.kotlin.gradle.plugin.KotlinBasePluginWrapper
import org.jetbrains.kotlin.gradle.plugin.KotlinPlugin
import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider
/**
* Wrapper around the Kotlin plugin wrapper (this code is largely a refactoring of KotlinBasePluginWrapper).
* This is required because the default behaviour expects the kotlin plugin to be applied from the project,
* not from an external buildscript.
*/
class CustomKotlinPlugin extends KotlinBasePluginWrapper {
@Override
void apply(Project project) {
// use String literal as KOTLIN_COMPILER_ENVIRONMENT_KEEPALIVE_PROPERTY constant isn't available
System.setProperty("kotlin.environment.keepalive", "true")
// just use the kotlin version defined in this script
project.extensions.extraProperties?.set("kotlin.gradle.plugin.version", project.property('kotlin_version'))
// get the plugin using the current buildscript
def plugin = getPlugin(this.class.classLoader, project.buildscript)
plugin.apply(project)
def cleanUpBuildListener = new CleanUpBuildListener(this.class.classLoader, project)
cleanUpBuildListener.buildStarted()
project.gradle.addBuildListener(cleanUpBuildListener)
}
@Override
Plugin<Project> getPlugin(ClassLoader pluginClassLoader, ScriptHandler scriptHandler){
return new KotlinPlugin(scriptHandler, new KotlinTasksProvider(pluginClassLoader));
}
}
然后,这可以应用于任何项目(即从“kotlin.gradle”
应用),您就可以开始运行kotlin开发了。
它是有效的,我还没有遇到任何问题,但我想知道是否有更好的方法?我并不是真的热衷于在每次有新版本的Kotlin时合并对插件的更改。
这里的问题是,有一个已知的gradle错误,即无法通过初始化脚本的id应用插件。这就是为什么您需要使用完全限定类名作为解决方案。
例如,我在初始化脚本中有以下内容,它可以工作:
apply plugin: org.jetbrains.kotlin.gradle.plugin.KotlinPlatformJvmPlugin
顺便说一句,我创建了一个gradle插件,用于准备自定义gradle发行版,其公共设置在init script-custom-gradle-dist中定义。它非常适合我的项目,例如构建。库项目的gradle如下所示(这是一个完整的文件,所有存储库、应用插件、依赖项等的设置都在init脚本中定义):
dependencies {
compile 'org.springframework.kafka:spring-kafka'
}
查看nebula kotlin插件。这似乎非常接近你想要达到的目标。
我试图用OkHttp和Cucumber在静态编程语言中设置一个Spring启动项目,并且在运行Cucumber任务时遇到以下错误。如何修复? 还有build gradle kts片段 我看到了这个错误https://github.com/square/okio/issues/647看起来可能是它,并修复了这个build.gradle,我如何将其翻译为kotlinbuild.gradle.kts?
标题中的问题。这里提出了一个类似的问题,当时唯一的解决办法是将项目发布到本地Maven存储库中。 这个问题在Android Studio 0.5中修复了吗(正如一些人所声称的)?在其发行说明中有一条声明说“支持模块内容根目录之外的源文件夹”。这是否意味着我们最终可以从项目文件夹外部导入库? 我试过文件- 编辑2:查看最新解决方案的接受答案(截至0.8。) 编辑: 我的项目目录结构只有一个模块,如下
正如标题所说,我正在尝试将Java和Kotlin混合在一个项目中。这里有一个很好的例子。混合java kotlin hello world。除了kotlin在src/main/Java/somepackage/SomeClass中找不到我的任何Java类之外,所有的东西都正常工作。Java语言 这是什么原因? 我的身材。gradle看起来像这样 而不是开始尝试在更大的项目上实现这一点。我试图通过创
我试图在Kotlin中创建一些功能测试,以使用Rest-Assured库向Cart Java服务发出请求。 因为我希望测试按程序进行,所以我希望能够存储第一个API请求的结果,并将其传递给下一个单元测试。 即 createCartTest()-- 从来没有真正使用过静态编程语言,所以寻找测试所有APIendpoint的最佳方法的建议。 还是在同一个函数中发出另一个请求并将结果传递给下一步更好? 跨
我有一个使用Kotlin DSL的Gradle 5.3构建脚本,类似于: 在这里, 解析为 。 现在,再往下,我想这样做(从Groovy DSL构建文件移植): 在这里,解析为——不是我想要的(也不推荐使用)! 计算我可以使用静态编程语言的合格,我尝试使用 相反(注意:额外的字符串换行消除了一个额外的类型错误),但是我现在得到了< code > Unresolved reference:@ Pro
我是一个初学静态编程语言的学生,正在学习一个示例回收人员视图。我开始编码,但没有得到我应该得到的结果,即使在检查和重新检查代码之后也是如此。然后我注意到,即使使用非常基本的代码,它仍然没有按照应有的方式运行。我将包含基本代码,当使用时,它应该显示一个通用列表。我只得到列表中的一项。我怀疑代码以外的其他东西正在影响结果;但是我还没有达到知道的水平。 请看活动内容。xml: 注意它有行。 下面是列表(