如何在 kscript (Kotlin) 中使用外部存储库?

Posted

技术标签:

【中文标题】如何在 kscript (Kotlin) 中使用外部存储库?【英文标题】:How to use external repository in kscript (Kotlin)? 【发布时间】:2019-12-06 19:26:50 【问题描述】:

什么是让 kscript 从外部 maven 存储库加载 jdbc 的正确方法?

我的脚本开头有:

#!/usr/bin/env kscript
@file:DependsOn("oracle.jdbc:ojdbc8:12.2.0.1")
@file:MavenRepository("infosynergi","http://maven.infosynergi.no" )

import java.sql.*

我收到此错误:

[kscript] 解析依赖... [kscript] 解析 oracle.jdbc:ojdbc8:12.2.0.1 ...线程“主”中的异常 java.lang.NoClassDefFoundError: org/ietf/jgss/GSSException 在 com.ning.http.client.providers.netty.NettyAsyncHttpProvider.(NettyAsyncHttpProvider.java:177) 在 org.sonatype.aether.connector.async.AsyncRepositoryConnector.getDefaultProvider(AsyncRepositoryConnector.java:246) 在 org.sonatype.aether.connector.async.AsyncRepositoryConnector.getProvider(AsyncRepositoryConnector.java:241) 在 org.sonatype.aether.connector.async.AsyncRepositoryConnector.(AsyncRepositoryConnector.java:154) 在 org.sonatype.aether.connector.async.AsyncRepositoryConnectorFactory.newInstance(AsyncRepositoryConnectorFactory.java:106) 在 org.sonatype.aether.impl.internal.DefaultRemoteRepositoryManager.getRepositoryConnector(DefaultRemoteRepositoryManager.java:346) 在 org.sonatype.aether.impl.internal.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:453) 在 org.sonatype.aether.impl.internal.DefaultArtifactResolver.resolveArtifacts(DefaultArtifactResolver.java:216) 在 org.sonatype.aether.impl.internal.DefaultArtifactResolver.resolveArtifact(DefaultArtifactResolver.java:193) 在 org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.loadPom(DefaultArtifactDescriptorReader.java:281) 在 org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.readArtifactDescriptor(DefaultArtifactDescriptorReader.java:186) 在 org.sonatype.aether.impl.internal.DefaultDependencyCollector.collectDependencies(DefaultDependencyCollector.java:191) 在 org.sonatype.aether.impl.internal.DefaultRepositorySystem.resolveDependencies(DefaultRepositorySystem.java:333) 在 com.jcabi.aether.Aether.fetch(Aether.java:228) 在 com.jcabi.aether.Aether.resolve_aroundBody2(Aether.java:180) 在 com.jcabi.aether.Aether$AjcClosure3.run(Aether.java:1) 在 org.aspectj.runtime.reflect.JoinPointImpl.proceed(JoinPointImpl.java:149) 在 com.jcabi.aspects.aj.MethodLogger.wrap(MethodLogger.java:208) 在 com.jcabi.aspects.aj.MethodLogger.ajc$inlineAccessMethod$com_jcabi_aspects_aj_MethodLogger$com_jcabi_aspects_aj_MethodLogger$wrap(MethodLogger.java:1) 在 com.jcabi.aspects.aj.MethodLogger.wrapClass(MethodLogger.java:136) 在 com.jcabi.aether.Aether.resolve(Aether.java:177) 在 com.jcabi.aether.Aether.resolve_aroundBody0(Aether.java:163) 在 com.jcabi.aether.Aether$AjcClosure1.run(Aether.java:1) 在 org.aspectj.runtime.reflect.JoinPointImpl.proceed(JoinPointImpl.java:149) 在 com.jcabi.aspects.aj.MethodLogger.wrap(MethodLogger.java:208) 在 com.jcabi.aspects.aj.MethodLogger.ajc$inlineAccessMethod$com_jcabi_aspects_aj_MethodLogger$com_jcabi_aspects_aj_MethodLogger$wrap(MethodLogger.java:1) 在 com.jcabi.aspects.aj.MethodLogger.wrapClass(MethodLogger.java:136) 在 com.jcabi.aether.Aether.resolve(Aether.java:156) 在 kscript.app.DependencyUtilKt.resolveDependenciesViaAether(DependencyUtil.kt:77) 在 kscript.app.DependencyUtilKt.resolveDependencies(DependencyUtil.kt:51) 在 kscript.app.KscriptKt.main(Kscript.kt:158) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native 方法) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:566) 在 org.jetbrains.kotlin.runner.AbstractRunner.run(runners.kt:61) 在 org.jetbrains.kotlin.runner.Main.run(Main.kt:109) 在 org.jetbrains.kotlin.runner.Main.main(Main.kt:119) 引起:java.lang.ClassNotFoundException:org.ietf.jgss.GSSException 在 java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:471) 在 java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588) 在 java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ... 38 更多

【问题讨论】:

【参考方案1】:

您的脚本是正确的。这是 kscript 中的一个已知错误,请参阅 https://github.com/holgerbrandl/kscript/issues/239。目前唯一的解决方法是使用 java8。

更新 此问题已在 kscript v3.0 中修复

【讨论】:

其实我改用 Go :-P.

以上是关于如何在 kscript (Kotlin) 中使用外部存储库?的主要内容,如果未能解决你的问题,请参考以下文章

Java 中的 Kotlin 内部类公开可见

前端每周清单: Dojo 2.0,Excel支持JavaScript了,Kotlin使用率已达35%

如何在 AWS Glue pyspark 脚本中合并两个节点

Kotlin 语言中标识符的命名规则

Kotlin的静态常量写法

Kotlin的静态常量写法