在服务器上部署嵌入式 Tocmat 时, 发现了 java.lang.NoClassDefFoundError 异常 org.ietf.jgss.GSSException:

Exception in thread "main" java.lang.NoClassDefFoundError: org/ietf/jgss/GSSExceptionat org.apache.catalina.startup.Tomcat.initSimpleAuth(Tomcat.java:602)at org.apache.catalina.startup.Tomcat.getEngine(Tomcat.java:473)at org.apache.catalina.startup.Tomcat.getHost(Tomcat.java:444)at org.apache.catalina.startup.Tomcat.addContext(Tomcat.java:240)at develon.java.EmbeddedTomcat.init(EmbeddedTomcat.kt:38)at develon.java.EmbeddedTomcatKt.main(EmbeddedTomcat.kt:76)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.base/java.lang.reflect.Method.invoke(Method.java:566)at org.jetbrains.kotlin.runner.AbstractRunner.run(runners.kt:61)at org.jetbrains.kotlin.runner.Main.run(Main.kt:110)at org.jetbrains.kotlin.runner.Main.main(Main.kt:120)
Caused by: java.lang.ClassNotFoundException: org.ietf.jgss.GSSExceptionat java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:471)at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)... 13 more

经过 locate 排查, 发现 Kotlin 似乎是完全有自己的一副运行时类库, 所以还是存在一定程度的不兼容

/snap/kotlin/38/lib/kotlin-reflect-sources.jar
/snap/kotlin/38/lib/kotlin-reflect.jar
/snap/kotlin/38/lib/kotlin-runner.jar
/snap/kotlin/38/lib/kotlin-script-runtime-sources.jar
/snap/kotlin/38/lib/kotlin-script-runtime.jar
/snap/kotlin/38/lib/kotlin-scripting-common.jar
/snap/kotlin/38/lib/kotlin-scripting-compiler-impl.jar
/snap/kotlin/38/lib/kotlin-scripting-compiler.jar
/snap/kotlin/38/lib/kotlin-scripting-jvm.jar
/snap/kotlin/38/lib/kotlin-source-sections-compiler-plugin.jar
/snap/kotlin/38/lib/kotlin-stdlib-jdk7-sources.jar
/snap/kotlin/38/lib/kotlin-stdlib-jdk7.jar
/snap/kotlin/38/lib/kotlin-stdlib-jdk8-sources.jar
/snap/kotlin/38/lib/kotlin-stdlib-jdk8.jar
/snap/kotlin/38/lib/kotlin-stdlib-js-sources.jar
/snap/kotlin/38/lib/kotlin-stdlib-js.jar
/snap/kotlin/38/lib/kotlin-stdlib-sources.jar
/snap/kotlin/38/lib/kotlin-stdlib.jar

那只好用 Java 运行了, Kotlin 的基本类库都是哪些呢?

kotlin-stdlib.jar
kotlin-reflect.jar
kotlin-script-runtime.jar

在我的 Ubuntu 上

/snap/kotlin/38/lib/kotlin-stdlib.jar
/snap/kotlin/38/lib/kotlin-reflect.jar

这些就足以令我的 Tomcat 跑起来了

root@iZfi4626828hfcZ:~/Kotlin# java -cp 'nginx.jar:tomcat-embed-core-7.0.52.jar:tomcat-embed-logging-juli-7.0.52.jar:tomcat-annotations-api-7.0.52.jar:/snap/kotlin/38/lib/kotlin-reflect.jar:/snap/kotlin/38/lib/kotlin-stdlib.jar' develon.java.EmbeddedTomcatKt
请输入主目录
工作目录: /root/Kotlin/.
启用 Spring
Sep 29, 2019 8:00:06 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-bio-80"]
Sep 29, 2019 8:00:07 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Tomcat
Sep 29, 2019 8:00:07 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.52
开始注射 DispatcherServlet -> STARTING_PREP
注射失败: org/springframework/web/servlet/support/AbstractAnnotationConfigDispatcherServletInitializer
Sep 29, 2019 8:00:07 PM org.apache.catalina.loader.WebappLoader buildClassPath
INFO: Unknown loader jdk.internal.loader.ClassLoaders$AppClassLoader@8bcc55f class jdk.internal.loader.ClassLoaders$AppClassLoader
开始注射 DispatcherServlet -> STARTING_PREP
注射失败: org/springframework/web/servlet/support/AbstractAnnotationConfigDispatcherServletInitializer

Kotlin 提供了一个符号链接 /snap/kotlin/current, 那我们必须写一个脚本

#!/bin/bash
kotlin='/snap/kotlin/current/lib'
argc="$#"
CLASSPATH='.'if (($argc<1)); thenecho \
"jk -cp ./target.jar -cp 'tomcat/lib/*spring*.jar' <Class> [参数列表...]使用Java运行时运行Kotlin编译的类, 添加了Kotlin运行时通过-cp 'classpath'来附加类路径, 通配符要用单引号''包装起来形成独立的参数
"exit 0
fifunction startJava() {CLASSPATH="$CLASSPATH:$kotlin/kotlin-stdlib.jar:$kotlin/kotlin-reflect.jar"#echo "类加载路径->$CLASSPATH"#echo "参数数量$#"#echo "参数->""$@"java -cp "$CLASSPATH" "$@"
}i=0
while (($i<$#)); dolet j=i+1arg=$(eval echo "$""$j")#echo $argif [ "$arg" == "-cp" ]; thenshift 1addClassPath=$(eval echo "$""$j")CLASSPATH="$CLASSPATH:${addClassPath// /:}" # 添加类路径, 同时替换空格为':', 方便使用通配符'*'和'?'else # 这里开始是类名javaClass="$(eval echo "$""$j")"#echo "执行类$javaClass"let k=j+1toJava=""while (($k<=$#)); dotoJava="$toJava '$(eval echo "$""$k")'"#echo "$toJava"let k++doneeval startJava '"$javaClass"' $toJavaexit 0filet i++
done

该脚本最新版本请在 Github下载

jk 脚本使用范例:

sudo jk -cp 'nginx.jar:tomcat-embed-core-9.0.24.jar' -cp 'spring/libs/sp*SE.jar'  -cp tomcat-annotations-api-9.0.24.jar develon.java.EmbeddedTomcatKt
请输入主目录
工作目录: /home/ubuntu/www/.
启用 Spring
Sep 29, 2019 5:05:40 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-nio-80"]
Sep 29, 2019 5:05:40 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service [Tomcat]
Sep 29, 2019 5:05:40 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet engine: [Apache Tomcat/9.0.24]
开始注射 DispatcherServlet -> STARTING_PREP
注射完成
Sep 29, 2019 5:05:41 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring DispatcherServlet 'dispatcher'
Sep 29, 2019 5:05:41 PM org.springframework.web.servlet.FrameworkServlet initServletBean
INFO: Initializing Servlet 'dispatcher'
Sep 29, 2019 5:05:42 PM org.springframework.web.servlet.FrameworkServlet initServletBean
INFO: Completed initialization in 1365 ms
Sep 29, 2019 5:05:42 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-nio-80"]
嵌入式tomcat启动完毕!

转载于:https://www.cnblogs.com/develon/p/11609668.html

Kotlin 丢失了一些 JRE 类相关推荐

  1. kotlin 扩展函数_在 Kotlin 中“实现”trait/类型类

    本文原发于我的个人博客:https://hltj.me/kotlin/2020/01/11/kotlin-trait-typeclass.html.本副本只用于知乎,禁止第三方转载. trait 与类 ...

  2. Kotlin学习笔记12——数据类和密封类

    Kotlin学习笔记12--数据类和密封类 前言 数据类 在类体中声明的属性 复制 componentN 解构声明 密封类 尾巴 前言 上一篇,我们学习了Kotlin中的拓展,今天继续来学习Kotli ...

  3. 快速上手 Kotlin 开发系列之数据类和枚举

    本节讨论 Kotlin 的数据类.枚举类和密闭类. 数据类 数据类是 Kotlin 中很特殊的一种类,它可以将我们类中的成员变量自动的生成 getter/setter 方法,以及我们经常需要重写的 t ...

  4. Kotlin学习 PART 3:类,对象和接口

    = =,感觉自己写的东西没什么人看呢= =,算了,本来就是自己写给自己看的东西,尽力了就行,也不指望像鸿神一样出名= = 1. class User constructor(_nickname:Str ...

  5. Kotlin学习笔记 第二章 类与对象 第一节类与继承(补)

    参考链接 Kotlin官方文档 Kotlin docs | Kotlin 本系列为参考Kotlin中文文档 kotlin官方文档2020版.pdf-其它文档类资源-CSDN下载 第二章 第一节 类与继 ...

  6. Kotlin学习笔记 第二章 类与对象 第十四 十五节 委托 委托属性

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  7. Kotlin学习笔记 第二章 类与对象 第十二 十三节 对象表达式与对象声明 类型别名

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  8. Kotlin学习笔记 第二章 类与对象 第十节 内部类嵌套类

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  9. Kotlin学习笔记 第二章 类与对象 第十一节 枚举类 第八节密封类

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  10. Kotlin学习笔记 第二章 类与对象 第七节 数据类

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

最新文章

  1. 有简易通用权限管理后台的快速C# ASP.NET开发的例子应用程序卖给了曾长期开发JAVA银行程序的大哥...
  2. 深度卷积神经网络CNNs的多GPU并行框架及其应用
  3. (转)告别程序员生涯,一点感慨,与诸君共勉
  4. linux下配置Java和Go环境
  5. ios-deploy out of date (1.9.4 is required). To upgrade with Brew: brew upgrade ios-deploy
  6. python计算无穷级数求和,无穷级数求和的积分审敛法
  7. ctfmon是什么启动项_win7系统启动项中没有ctfmon进程的解决方法
  8. Matlab分类识别实战||基于神经网络的深水船水声音数据集的识别与分类(GoogLeNet+SqueezeNet+AlexNet)
  9. 史上最全面实用的工业相机选型,相机速率计算,相机靶面,相机接口,图像格式等参数详解与分析
  10. 定义一个函数,返回整形数组中最大值
  11. 最易学和最难学编程语言排行榜!
  12. linux系统下一页,linux下一页
  13. 我的世界服务器无限重启怎么办,iPhoneX无限重启怎么办?iPhoneX无限重启解决一览...
  14. 2020.10.22--AI--立体图形制作、矛盾空间图形设计、3D文字
  15. 基于权证交易、隐私保护模型的社交概念产品设计
  16. IntelliJ IDEA Remote Development 使用体验
  17. 【网虫】做网站必知的两个命令 活用ping与tracert
  18. MarkdownPad2 不显示插入图片
  19. Redis缓存穿透“新杀招“:布隆过滤器Bloom Filter
  20. 源码方式安装 netconf 开源工具 ncclient 及其基本使用步骤

热门文章

  1. POJ 1330 Nearest Common Ancestors(LCA Tarjan算法)
  2. 动态数据源四种实现方案对比
  3. 一道综合练习题实践list及dictionary集合类
  4. C++标准程序库读书笔记-第二章新的语言特性
  5. c# textbox和listbox多行显示
  6. hMailServer邮件服务器之安装
  7. 通过FreeMarker生成word文档
  8. Linux下编译redis及配置
  9. c bool 类型检查_第3篇:C/C++ 检查数字类型的最高有效位(MSB)
  10. 192.168.8.1手机登陆_192.168.1.1手机登陆