我的应用程序适用于java 1.8(及更早版本),但是当我重新构建应用程序以使用java 9时,我会收到以下堆栈跟踪。更新的原因是因为我需要使用早期版本中不存在的新ProcessHandle.current()
。
c:\>java -jar ./build/bin/DataMover.jar
DataMover Service: starting...
Exception in thread "main" java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.lang.NoClassDefFoundError: org/glassfish/jersey/server/ResourceConfig
at dataMoverServerPackage.Main.main(Unknown Source)
... 5 more
Caused by: java.lang.ClassNotFoundException: org.glassfish.jersey.server.ResourceConfig
at java.base/java.net.URLClassLoader.findClass(Unknown Source)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
... 6 more
对于任何好奇的人来说,这是java版本输出。
c:\>java -version
java version "9.0.1"
Java(TM) SE Runtime Environment (build 9.0.1+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.1+11, mixed mode)
这是相关的main()函数。
public static void main(String[] args)
{
try
{
...
final ResourceConfig resourceConfig = new ResourceConfig(DataMoverServerResource.class);
我做过研究并读到Java 6,7,8和Java 9之间的巨大差异是模块。特别是早期版本的Java包括Java EE JDK,而Java 9包括java.se模块,而不是EE。正如我所读,Java 9中的所有com.sun。*类都无法访问。这些信息可能相关也可能不相关。我不知道jersey.server API的内部构成,只是一些文章谈到了这一点。
我在jar装载机中使用了一个罐子,因此球衣的东西就在底座罐中。
我在泽西岛或球衣罐上的内部依赖问题之间徘徊。加载器似乎很高兴后来在java.base/jdk.internal
失败了,这告诉我模块可能会丢失。
如果有一个内部模块,例如java.xml.bind,就像我在Java EE中包含的one post中读到的那样,那么异常跟踪将表明我会知道添加该模块使用java的--add-module
选项,例如--add-module java.xml.bind
,但这不是这种情况,至少使用该模块。
以下是link到一篇可能相关的文章。也许java.net
是问题,就像堆栈跟踪底部的at javax.xml.bind
一样,问题是根本原因。我在this问题中打了ext
文件夹的答案,因为这个问题与1.8有关,这对我有用,而且我有jar-in-jar。我在这里注意到这个问题,因为它不断出现在搜索上。虽然相似,但question也没有相关性。名单还在继续。
我使用Eclipse,但使用ant构建。 Jersey东西库位于我的Maven .m2文件夹中。我右键单击了我的项目并选择了Maven>更新。那是2.7。
我遇到了这个site,它谈到了Java 9迁移。在该站点中,我读到如果添加java.se.ee
,您将可以访问所有Java EE模块。该建议失败,输出相同。我试过的命令是:
java --add-modules java.se.ee -jar ./build/bin/DataMover.jar
我确实检查了SO和其他一些网站,但到目前为止已经空了。想法?