【发布时间】:2021-09-18 08:42:21
【问题描述】:
我的公司正在转向使用 Ubuntu 的目标架构;我们正在从 Windows 迁移 java 应用程序。我们的第一个应用程序在 Ubuntu 上遇到了这个错误(在 Win 上运行良好):
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: > org/apache/cxf/jaxrs/lifecycle/ResourceProvider
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)
at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:650)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:632)
Caused by: java.lang.ClassNotFoundException: org.apache.cxf.jaxrs.lifecycle.ResourceProvider
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
... 7 more
两个环境都运行 java 1.8 jdk/jre(不是 Ubuntu 上的 OpenJDK)。我们为 git 使用内部 CodeCloud,一切都在 Win 和 Ubuntu 中更新。 Maven 显示所有依赖项都已满足;我什至可以扩展 maven 类,并且可以看到 ResourceProvider 类。
我已阅读有关 Spring 和 CXF 的版本控制问题,但这是指比我们运行的版本更旧的 CXF 版本,我没有看到任何表明代码将在 Windows 环境中运行的原因,但不是'尼克斯环境。还有很多关于 WebLogic 的讨论,我们在服务器端使用带有 CXF 的嵌入式 Jetty。这是一个独立的控制台应用程序,不使用容器,如果这很重要的话。
任何想法或提示将不胜感激。
编辑:在 Eclipse 中使用“run as java”会发生此错误。调试器甚至没有命中 main 中的第一行代码。
【问题讨论】:
-
我们也不应该忘记所有这些微小的差异;小路 :/; 、反斜杠/斜杠、区分大小写、权限。
-
@joop 你是对的。我已经仔细检查了代码和资源文件中的文件系统路径。
-
请编辑您的问题并添加您的产品是如何打包和启动的? (jar 集?传统的类路径?uber-jar?直接命令行?启动它的脚本?启动它的包装器库?等等) - 这个特定问题的过去答案是 uber-jar 打包错误。
-
@JoakimErdfelt 按要求进行了编辑。这是在 eclipse 中使用“run as java”发生的
-
标签: java maven ubuntu cxf embedded-jetty