我正在尝试设置Jersey 2 servlet应用程序.目标是仅将一些URL映射到Jersey REST API,而其他URL则提供静态内容.
我mvn compile war:war
用来生成战争并部署它.部署工件时会发生以下错误:
[2016-01-09 02:50:21,617] Artifact Test.war: Artifact is being deployed, please wait... 2016-01-09 14:50:25.823:WARN:oejd.DeploymentManager:Scanner-1: Unable to reach node goal: started java.lang.NoClassDefFoundError: org/glassfish/jersey/server/spi/Container at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:760) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) at java.net.URLClassLoader.access$100(URLClassLoader.java:73) at java.net.URLClassLoader$1.run(URLClassLoader.java:368) at java.net.URLClassLoader$1.run(URLClassLoader.java:362) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:361) at org.eclipse.jetty.webapp.WebAppClassLoader.findClass(WebAppClassLoader.java:549) at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:475) at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:428) at org.eclipse.jetty.util.Loader.loadClass(Loader.java:86) at org.eclipse.jetty.servlet.BaseHolder.doStart(BaseHolder.java:95) at org.eclipse.jetty.servlet.ServletHolder.doStart(ServletHolder.java:347) at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:892) at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:346) at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1380) at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1342) at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:772) at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:259) at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:518) at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) at org.eclipse.jetty.deploy.bindings.StandardStarter.processBinding(StandardStarter.java:41) at org.eclipse.jetty.deploy.AppLifeCycle.runBindings(AppLifeCycle.java:188) at org.eclipse.jetty.deploy.DeploymentManager.requestAppGoal(DeploymentManager.java:499) at org.eclipse.jetty.deploy.DeploymentManager.addApp(DeploymentManager.java:147) at org.eclipse.jetty.deploy.providers.ScanningAppProvider.fileAdded(ScanningAppProvider.java:180) at org.eclipse.jetty.deploy.providers.WebAppProvider.fileAdded(WebAppProvider.java:459) at org.eclipse.jetty.deploy.providers.ScanningAppProvider$1.fileAdded(ScanningAppProvider.java:64) at org.eclipse.jetty.util.Scanner.reportAddition(Scanner.java:610) at org.eclipse.jetty.util.Scanner.reportDifferences(Scanner.java:529) at org.eclipse.jetty.util.Scanner.scan(Scanner.java:392) at org.eclipse.jetty.util.Scanner$1.run(Scanner.java:329) at java.util.TimerThread.mainLoop(Timer.java:555) at java.util.TimerThread.run(Timer.java:505) Caused by: java.lang.ClassNotFoundException: org.glassfish.jersey.server.spi.Container at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:487) at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:428) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:760) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) at java.net.URLClassLoader.access$100(URLClassLoader.java:73) at java.net.URLClassLoader$1.run(URLClassLoader.java:368) at java.net.URLClassLoader$1.run(URLClassLoader.java:362) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:361) at org.eclipse.jetty.webapp.WebAppClassLoader.findClass(WebAppClassLoader.java:549) at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:475) at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:428) at org.eclipse.jetty.util.Loader.loadClass(Loader.java:86) at org.eclipse.jetty.servlet.BaseHolder.doStart(BaseHolder.java:95) at org.eclipse.jetty.servlet.ServletHolder.doStart(ServletHolder.java:347) at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:892) at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:346) at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1380) at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1342) at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:772) at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:259) at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:518) at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) at org.eclipse.jetty.deploy.bindings.StandardStarter.processBinding(StandardStarter.java:41) at org.eclipse.jetty.deploy.AppLifeCycle.runBindings(AppLifeCycle.java:188) at org.eclipse.jetty.deploy.DeploymentManager.requestAppGoal(DeploymentManager.java:499) at org.eclipse.jetty.deploy.DeploymentManager.addApp(DeploymentManager.java:147) at org.eclipse.jetty.deploy.providers.ScanningAppProvider.fileAdded(ScanningAppProvider.java:180) at org.eclipse.jetty.deploy.providers.WebAppProvider.fileAdded(WebAppProvider.java:459) at org.eclipse.jetty.deploy.providers.ScanningAppProvider$1.fileAdded(ScanningAppProvider.java:64) at org.eclipse.jetty.util.Scanner.reportAddition(Scanner.java:610) at org.eclipse.jetty.util.Scanner.reportDifferences(Scanner.java:529) at org.eclipse.jetty.util.Scanner.scan(Scanner.java:392) at org.eclipse.jetty.util.Scanner$1.run(Scanner.java:329) at java.util.TimerThread.mainLoop(Timer.java:555) at java.util.TimerThread.run(Timer.java:505) [2016-01-09 02:50:26,121] Artifact Test.war: Error during artifact deployment. See server log for details.
我的pom.xml:
4.0.0 group.id ProjectName 1.0-SNAPSHOT org.glassfish.jersey.containers jersey-container-servlet 2.22.1 provided org.glassfish.jersey.core jersey-server 2.22.1 provided org.glassfish.jersey.core jersey-client 2.22.1 provided org.glassfish.jersey.containers jersey-container-servlet-core 2.22.1 org.glassfish.jersey.containers jersey-container-jetty-http 2.22.1 org.glassfish.jersey.containers jersey-container-jetty-servlet 2.22.1 Test maven-compiler-plugin 1.8 org.apache.maven.plugins maven-war-plugin 2.6 web/WEB-INF/web.xml
我的web.xml:
ApiApplication org.glassfish.jersey.servlet.ServletContainer org.glassfish.jersey.config.property.packages group.id 1 ApiApplication /api/*
Jersey 2应用程序配置ApiApplication.java:
import javax.ws.rs.ApplicationPath; @ApplicationPath("/api") public class ApiApplication extends ResourceConfig { public ApiApplication() { packages(true, "group.id"); } }
测试资源Test.java:
package group.id; import javax.ws.rs.GET; import javax.ws.rs.Path; @Path("/test") public class Test { @GET public String get() { return "Hello world!"; } }
当我查看WAR文件时,WEB-INF/lib中充满了JAR文件.为什么Jetty不能部署WAR文件?
这三个依赖
org.glassfish.jersey.containers jersey-container-servlet 2.22.1 provided org.glassfish.jersey.core jersey-server 2.22.1 provided org.glassfish.jersey.core jersey-client 2.22.1 provided
已经被这种依赖所吸引了
org.glassfish.jersey.containers jersey-container-jetty-servlet 2.22.1
但是当你声明它们时,你会覆盖它将它们拉入的事实.你将它们声明为 provided
provided
这意味着您说服务器具有这些依赖关系,但它没有.如果你查看WEB-INF/lib,你会看到那三个不存在.这就是错误的原因.最好的办法就是摆脱这三个,因为它们已被拉入.
实际上你可以摆脱除最后一个之外的所有东西,因为它会引入你声明的所有东西.