如何在模块化java项目中使用嵌入式tomcat



我想创建一个java模块化项目,其中有一个内部tomcat服务器。我可以在非模块化java中轻松使用嵌入式tomcat服务器,但在涉及模块时,它有很多错误。这是我的模块info.java文件

module RunMe{
requires tomcat.embed.core;
requires annotations.api;
}

当我运行最简单的tomcat服务器代码时,它会给我这个:

Nov 12, 2019 10:08:26 AM org.apache.catalina.core.StandardContext setPath
WARNING: A context path must either be an empty string or start with a '/' and do not end with a '/'. The path [/] does not meet these criteria and has been changed to []
Nov 12, 2019 10:08:27 AM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-nio-8571"]
Nov 12, 2019 10:08:27 AM org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
INFO: Using a shared selector for servlet write/read
Nov 12, 2019 10:08:27 AM org.apache.catalina.core.StandardService startInternal
INFO: Starting service [Tomcat]
Nov 12, 2019 10:08:27 AM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/9.0.11
Nov 12, 2019 10:08:27 AM org.apache.catalina.loader.WebappLoader startInternal
SEVERE: LifecycleException 
java.lang.NoClassDefFoundError: java/lang/instrument/IllegalClassFormatException
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:333)
at tomcat.embed.core/org.apache.catalina.loader.WebappLoader.createClassLoader(WebappLoader.java:503)
at tomcat.embed.core/org.apache.catalina.loader.WebappLoader.startInternal(WebappLoader.java:388)
at tomcat.embed.core/org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at tomcat.embed.core/org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4955)
at tomcat.embed.core/org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at tomcat.embed.core/org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1429)
at tomcat.embed.core/org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at tomcat.embed.core/org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140)
at tomcat.embed.core/org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:944)
at tomcat.embed.core/org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:839)
at tomcat.embed.core/org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at tomcat.embed.core/org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1429)
at tomcat.embed.core/org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at tomcat.embed.core/org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140)
at tomcat.embed.core/org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:944)
at tomcat.embed.core/org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:261)
at tomcat.embed.core/org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at tomcat.embed.core/org.apache.catalina.core.StandardService.startInternal(StandardService.java:422)
at tomcat.embed.core/org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at tomcat.embed.core/org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:770)
at tomcat.embed.core/org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at tomcat.embed.core/org.apache.catalina.startup.Tomcat.start(Tomcat.java:370)
at RunMe/test.RunMe.main(RunMe.java:48)
Caused by: java.lang.ClassNotFoundException: java.lang.instrument.IllegalClassFormatException
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 29 more

很抱歉再次提出一个旧问题,但我看不到答案。也许这会帮助其他人。

将以下内容添加到module-info.java文件中:

requires java.instrument;

最新更新