我使用最新的 Gradle (v. 6.6.1) 和最新的 Kotlin (v. 1.4)。
buildSrc项目定义了所有 Kotlin 版本。不幸的是,它收到以下错误。
The `kotlin-dsl` plugin applied to project ':buildSrc' enables experimental Kotlin compiler features. For more information see https://docs.gradle.org/6.6.1/userguide/kotlin_dsl.html#sec:kotlin-dsl_plugin
w: Runtime JAR files in the classpath should have the same version. These files were found in the classpath:
/xxx/.gradle/wrapper/dists/gradle-6.6.1-all/43pddabvuyfjfvs8uyekonb98/gradle-6.6.1/lib/kotlin-stdlib-1.3.72.jar (version 1.3)
/xxx/.gradle/wrapper/dists/gradle-6.6.1-all/43pddabvuyfjfvs8uyekonb98/gradle-6.6.1/lib/kotlin-stdlib-common-1.3.72.jar (version 1.3)
/xxx/.gradle/wrapper/dists/gradle-6.6.1-all/43pddabvuyfjfvs8uyekonb98/gradle-6.6.1/lib/kotlin-stdlib-jdk7-1.3.72.jar (version 1.3)
/xxx/.gradle/wrapper/dists/gradle-6.6.1-all/43pddabvuyfjfvs8uyekonb98/gradle-6.6.1/lib/kotlin-stdlib-jdk8-1.3.72.jar (version 1.3)
/xxx/.gradle/wrapper/dists/gradle-6.6.1-all/43pddabvuyfjfvs8uyekonb98/gradle-6.6.1/lib/kotlin-reflect-1.3.72.jar (version 1.3)
/xxx/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-reflect/1.4.0/aa2101a19d8688e368ae6e35e8967550ced73884/kotlin-reflect-1.4.0.jar (version 1.4)
/xxx/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jdk8/1.3.72/916d54b9eb6442b615e6f1488978f551c0674720/kotlin-stdlib-jdk8-1.3.72.jar (version 1.3)
/xxx/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jdk7/1.3.72/3adfc2f4ea4243e01204be8081fe63bde6b12815/kotlin-stdlib-jdk7-1.3.72.jar (version 1.3)
/xxx/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.4.0/63e75298e93d4ae0b299bb869cf0c627196f8843/kotlin-stdlib-1.4.0.jar (version 1.4)
/xxx/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.4.0/1c752cce0ead8d504ccc88a4fed6471fd83ab0dd/kotlin-stdlib-common-1.4.0.jar (version 1.4)
Run Code Online (Sandbox Code Playgroud)
buildSrc项目有以下 …
有没有办法获取 kotlin 脚本中当前脚本位置的目录?
我可以在 bash 中实现这一点
dirname $0
Run Code Online (Sandbox Code Playgroud)
或者
# Absolute path to this script. /home/user/bin/foo.sh
SCRIPT=$(readlink -f $0)
# Absolute path this script is in. /home/user/bin
SCRIPTPATH=`dirname $SCRIPT`
Run Code Online (Sandbox Code Playgroud) 我想要:
.kts里面有文件的目录src/main/kotlin/my/package模块并有如下用法:
kotlin my-script.main.kts
Run Code Online (Sandbox Code Playgroud)
my-script.main.kts脚本在示例中看起来像这样
#!/usr/bin/env kotlin
@file:Repository("https://jcenter.bintray.com")
@file:DependsOn("org.jetbrains.kotlinx:kotlinx-html-jvm:0.6.11")
import kotlinx.html.*; import kotlinx.html.stream.*; import kotlinx.html.attributes.*;
import my.package.*;
val addressee = args.firstOrNull() ?: "World"
print(createHTML().html {
body {
h1 { +"Hello, $addressee! from ${my.package.Greater.hello()}" }
}
})
Run Code Online (Sandbox Code Playgroud)
限制:
如何配置 kotlin 脚本项目依赖于当前模块?到目前为止,最佳实践是什么?
Kotlin 脚本 ( .main.kts) 文件的想法是在一个独立文件中提供可执行的 Kotlin 代码,这对于编写脚本或在 StackOverflow 上共享代码片段时非常方便。与此相反,目前几乎所有 Java/Kotlin 都使用具有神秘构建文件和深层文件夹结构的构建系统(例如 gradle)。
虽然我非常喜欢 Kotlin 脚本的想法,但它似乎很少被使用,StackOverflow 上只有 22 个问题,文档极其稀疏,Google 结果也很少。我可以使用@file:DependsOn实际脚本内部而不是传统的构建文件来引入依赖项:
build.gradle:
dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.0'
}
Run Code Online (Sandbox Code Playgroud)
foo.main.kts:
@file:DependsOn("org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.0")
Run Code Online (Sandbox Code Playgroud)
但是,我找不到在我的.main.kts文件中使用“应用插件”的方法。我在网上找到的任何代码片段都没有使用它。
build.gradle:
apply plugin: 'kotlinx-serialization'
Run Code Online (Sandbox Code Playgroud)
foo.main.kts:
???
Run Code Online (Sandbox Code Playgroud)
作为参考,我在下面附上了 MWE。错误消息表示该类不可序列化,但正如在这个问题中Node指出的那样,该消息具有误导性并且缺少实际问题,我不知道如何在文件之外使用: apply pluginbuild.gradle
dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.0'
}
Run Code Online (Sandbox Code Playgroud)
在 Ubuntu 上运行:
@file:DependsOn("org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.0")
Run Code Online (Sandbox Code Playgroud) 我想在我的 Android 项目中使用Kotlin 工作表,以便添加如下代码草稿:
草稿.ws.kts
package com.example.app
val a = 1 + 1
a
Run Code Online (Sandbox Code Playgroud)
工作表本身正在工作:
val a: Int
2
Run Code Online (Sandbox Code Playgroud)
但是构建我的 Android 应用程序失败并显示以下输出:
> Task :appicals:compileDebugKotlin FAILED
e: org.jetbrains.kotlin.util.KotlinFrontEndException: Front-end Internal error: Failed to analyze declaration Draft_ws
File being compiled: (1,43) in /Users/me/secretproject/app/src/main/java/com/example/app/draft.ws.kts
The root cause org.jetbrains.kotlin.resolve.lazy.NoDescriptorForDeclarationException was thrown at: org.jetbrains.kotlin.resolve.lazy.BasicAbsentDescriptorHandler.diagnoseDescriptorNotFound(AbsentDescriptorHandler.kt:18)
at org.jetbrains.kotlin.resolve.ExceptionWrappingKtVisitorVoid.visitDeclaration(ExceptionWrappingKtVisitorVoid.kt:43)
at org.jetbrains.kotlin.psi.KtVisitorVoid.visitDeclaration(KtVisitorVoid.java:453)
at org.jetbrains.kotlin.psi.KtVisitorVoid.visitDeclaration(KtVisitorVoid.java:21)
at org.jetbrains.kotlin.psi.KtVisitor.visitScript(KtVisitor.java:78)
at org.jetbrains.kotlin.psi.KtVisitorVoid.visitScript(KtVisitorVoid.java:73)
at org.jetbrains.kotlin.psi.KtVisitorVoid.visitScript(KtVisitorVoid.java:519)
at org.jetbrains.kotlin.psi.KtVisitorVoid.visitScript(KtVisitorVoid.java:21)
at org.jetbrains.kotlin.psi.KtScript.accept(KtScript.java:69)
at org.jetbrains.kotlin.psi.KtElementImplStub.accept(KtElementImplStub.java:59)
at org.jetbrains.kotlin.resolve.LazyTopDownAnalyzer$analyzeDeclarations$1.registerDeclarations(LazyTopDownAnalyzer.kt:78)
at org.jetbrains.kotlin.resolve.LazyTopDownAnalyzer$analyzeDeclarations$1.visitKtFile(LazyTopDownAnalyzer.kt:96)
at org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtFile(KtVisitorVoid.java:513)
at org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtFile(KtVisitorVoid.java:21)
at org.jetbrains.kotlin.psi.KtFile.accept(KtFile.kt:242) …Run Code Online (Sandbox Code Playgroud) 我想从我的 kotlin 脚本文件中分离出一些通用代码,以便可以重用它。
我这样做了:
// MyLib.kt
package myLib
fun say_hello(name : String)
{
println("hello $name")
}
Run Code Online (Sandbox Code Playgroud)
我编译这个文件来创建一个 jar 文件:
kotlinc myLib.kt -include-runtime -d myLib.jar
Run Code Online (Sandbox Code Playgroud)
然后我创建了一个脚本文件:
// myScript.kts
import myLib.*
say_hello("Arvind")
Run Code Online (Sandbox Code Playgroud)
但我无法编译脚本文件,因为它既不识别 myLib 包也不识别 say_hello() 函数。
执行此操作的正确方法是什么。
问题更新: 我正在使用 kscript 来运行我的脚本。打字很多,例如,
kotlin -cp myLib.jar myScript.kts
Run Code Online (Sandbox Code Playgroud)
每次我都必须运行脚本,从而破坏了使用 kscript 的动机。
有没有什么方法可以让我不必每次命令行都给出 jar 的路径。相反,我想以 kscript 的方式使用它,即
./myScript
Run Code Online (Sandbox Code Playgroud) 我想在不依赖 Gradle 项目的情况下在 CI 中运行 Kotlin 脚本,这样我就可以轻松地执行使用 shell/bash/batch 难以编程的操作,并且在需要时可以使用库。
让 Kotlin 脚本仅在 Ubuntu/Linux 上运行很好,但理想情况下,有一种方法可以让它在 Windows 和 macOS 目标以及特定于平台的项目上运行。
我正在尝试使用 Kotlin 作为脚本语言。根据他们的文档,您应该能够在 Kotlin 脚本中运行顶级代码。
我使用他们的官方示例编写的一个简单的“Hello,World”程序不输出任何文本。它编译/解释,成功终止,但 println() 语句似乎没有执行任何操作
fun main(args: Array<String>) {
println("Hello, World!")
}
Run Code Online (Sandbox Code Playgroud)
有谁知道在哪里可以找到使用 Kotlin 作为脚本语言时实际支持的内容的表格/摘要?我在让它做一个简单的打印语句时缺少什么。
我正在 Ubuntu 上使用通过 sdkman 安装的 Kotlin SDK 运行。从 Ubuntu 提供的普通终端运行。预期的输出将是一行“Hello, World!” 显示,但根本没有输出。
我正在学习 Kotlin 如何评估脚本,我在BasicJvmScriptEvaluator 中看到了如下代码:
val ctor = java.constructors.single()
val saveClassLoader = Thread.currentThread().contextClassLoader
Thread.currentThread().contextClassLoader = this.java.classLoader
return try {
ctor.newInstance(*args.toArray())
} finally {
Thread.currentThread().contextClassLoader = saveClassLoader
}
Run Code Online (Sandbox Code Playgroud)
我不明白代码java.constructors.single(),没有名为 java.constructors 的包。我应该如何理解这段代码?
我正在尝试将kotlin-main-kts与 Ktor 客户端一起使用。
这是我的简单 Kotlin 脚本,位于名为 的文件中ktor_tests.main.kts:
@file:Repository("https://repo1.maven.org/maven2")
@file:DependsOn("io.ktor:ktor-client-core-jvm:1.5.3")
@file:DependsOn("io.ktor:ktor-client-cio:1.5.3")
import io.ktor.client.HttpClient
import io.ktor.client.engine.cio.CIO
println("Hello")
HttpClient(CIO).use {
println("In client scope.")
}
Run Code Online (Sandbox Code Playgroud)
我运行它
kotlinc -cp ~/.m2/repository/org/jetbrains/kotlin/kotlin-main-kts/1.4.21/kotlin-main-kts-1.4.21.jar -script ktor_tests.main.kts
Run Code Online (Sandbox Code Playgroud)
输出是
OpenJDK 64-Bit Server VM warning: Ignoring option MaxPermSize; support was removed in 8.0
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.intellij.util.ReflectionUtil …Run Code Online (Sandbox Code Playgroud)