如果从jar运行,带有嵌入式jetty的Spring应用程序找不到webdefault.xml

我有使用嵌入式Jetty实例的spring应用程序。

project | src | controller | webapps | jsp | WEB-INF | web.xml | applicationContext.xml | spring-servlet.xml 

我的jar子有相同的树状结构,但我一直都在

  d:\test>java -jar springtest.jar 2011-11-22 15:37:02.576:INFO::jetty-7.xy-SNAPSHOT 2011-11-22 15:37:02.686:WARN::Failed startup of context oejwWebAppContext{/,[file:/C:/Users/me/AppData/Local/Temp/jetty-0.0.0.0-8080-webapps-_-any-/webinf /, jar:file:/d:/test/springtest.jar!/org/jcvi/webapps/]} java.io.FileNotFoundException: d:\test\org\eclipse\jetty\webapp\webdefault.xml (The system cannot find the path specified) at java.io.FileInputStream.open(Native Method) at java.io.FileInputStream.(FileInputStream.java:106) at java.io.FileInputStream.(FileInputStream.java:66) at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:70) at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:161) at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:653) at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:186) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:772) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522) at javax.xml.parsers.SAXParser.parse(SAXParser.java:395) at org.eclipse.jetty.xml.XmlParser.parse(XmlParser.java:188) at org.eclipse.jetty.xml.XmlParser.parse(XmlParser.java:204) at org.eclipse.jetty.webapp.Descriptor.parse(Descriptor.java:60) at org.eclipse.jetty.webapp.WebDescriptor.parse(WebDescriptor.java:140) at org.eclipse.jetty.webapp.MetaData.setDefaults(MetaData.java:141) at org.eclipse.jetty.webapp.WebXmlConfiguration.preConfigure(WebXmlConfiguration.java:46) at org.eclipse.jetty.webapp.WebAppContext.preConfigure(WebAppContext.java:412) at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:448) at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:58) at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:89) at org.eclipse.jetty.server.Server.doStart(Server.java:258) at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:58) at org.jcvi.ServerRunner.startServer(ServerRunner.java:83) at org.jcvi.MainServer.main(MainServer.java:18) 2011-11-22 15:37:02.748:INFO::Started SelectChannelConnector@0.0.0.0:8080 STARTING 

我有以下运行jetty服务器实例的java类

 String webDir = this.getClass().getClassLoader().getResource("webapps").toExternalForm(); Server server = new Server(8080); WebAppContext context = new WebAppContext(); context.setContextPath("/"); context.setResourceBase(webDir); context.setParentLoaderPriority(true); HandlerList handlers = new HandlerList(); handlers.setHandlers(new Handler[] { context, new DefaultHandler() }); server.setHandler(context); server.start(); 

我的web.xml看起来像

  index.jsp   contextConfigLocation /WEB-INF/applicationContext.xml    org.springframework.web.context.ContextLoaderListener    spring  org.springframework.web.servlet.DispatcherServlet  2   spring /  

如果我在IDE中运行,这个应用程序运行正常,但它与JAR失败。 如何解决此问题,以便我可以拥有包含Web应用程序的单个jar文件?

我有一个类似的问题,我用这个主类实现解决它:

 private static final int PORT = 8080; private static final String WAR_LOCATION = "src/webapps"; //in your case I guess private static final String CONTEXT_PATH = "/movence"; //change it if you want public static void main(String[] args) throws Exception { Server server = new Server(); WebAppContext context = new WebAppContext(); SocketConnector connector = new SocketConnector(); setupConnector(connector); setupContext(server, context); setupServer(server, context, connector); startServer(server); } private static void startServer(Server server) throws Exception, InterruptedException { server.start(); server.join(); } private static void setupServer(Server server, WebAppContext context, SocketConnector connector) { server.setConnectors(new Connector[] { connector }); server.addHandler(context); } private static void setupConnector(SocketConnector connector) { connector.setPort(PORT); } private static void setupContext(Server server, WebAppContext context) { context.setServer(server); context.setContextPath(CONTEXT_PATH); context.setWar(WAR_LOCATION); } 

似乎jetty试图解析web.xml(描述符)文件,但认为它在

 .../...../...../webdefault.xml 

或类似的东西。

您应该显式设置web.xml路径:

 context.setDescriptor("WEB-INF/web.xml"); ` 

或者,假设您的jar确实包含了前面提到的’项目’目录(这不是标准的jar内部布局):

 context.setDescriptor("project/src/webapps/WEB-INF/web.xml"); 

从@Trein的post来看,设置WAR_LOCATION非常重要。 我看到jetty在缺少这个应用程序时无法部署Web应用程序。

假设您使用Jetty测试您的应用程序,如果您正在使用Maven POM,那么我将如何测试我的Web应用程序

的pom.xml

   org.springframework spring-test ${spring.version} test   org.mortbay.jetty jetty-servlet-tester 6.1.22 test   org.mortbay.jetty maven-jetty-plugin 6.1.19 test     tomcat    org.mortbay.jetty maven-jetty-plugin 6.1.22  10 foo 9999 / src/main/webapp   RESOURCE_PATH ${project.build.outputDirectory}     9090 60000      test-compile  run   0 true    stop-jetty package  stop         

要运行webapp,您可以运行mvn jetty:start或运行mvn package。 这将在端口9090上启动Jetty服务器并运行测试(在此处运行基于http的测试)并关闭服务器/ webapp。 如果您想作为独立的webapp运行,请使用mvn jetty:start并使用您的webapp,就像任何webapp容器一样。

这一切都假设您正在使用Maven。 @Trein提供的上述代码以编程方式执行相同的操作,而我提供的代码是与上述相同的maven配置。

注意 :您不必担心webdefault.xml,因为默认值已经打包在jetty jar文件中。 只有在需要扩展/更改默认值时,才应使用自己的webdefault.xml。 您的Jetty jar有任何问题(如果它报告此或与您的CLASSPATH设置有关)

找到这个github项目: https : //github.com/steveliles/jetty-embedded-spring-mvc

这给出了一个基于maven的基本启动模板项目。 它嵌入了带有弹簧mvc的docker。 从头开始或比较和调试当前实现的错误的好地方。

作者在这里做了一个很好的文档: http : //steveliles.github.io/setting_up_embedded_jetty_8_and_spring_mvc_with_maven.html

可能有点过时了。 但是我最近在使用与Eclipse(Jetty 8.x)打包的Jetty版本在Eclipse OSGi应用程序中嵌入Jetty的上下文中遇到了这个问题。

我对此进行排序的方式如下:

  1. 获取相对于org.eclipse.jetty.webapp包的webdefault.xml的URL
  2. 将此URL传递给上下文默认描述符
 Bundle bundle = FrameworkUtil.getBundle(WebAppContext.class); Enumeration urls = bundle.findEntries("/", "webdefault.xml", true); String webdefaultURL = urls.nextElement().toExternalForm(); // Should check returned value mycontext.setDefaultsDescriptor(webdefaultURL); 

希望能帮助到你

SEB

您的webdefault.xml (Jetty)丢失了:

java.io.FileNotFoundException:d:\ test \ org \ eclipse \ jetty \ webapp \ webdefault.xml

请参阅“什么是webdefault.xml?”

如果您有自定义位置,则需要添加它:

 context.setDefaultsDescriptor("/my/path/to/webdefault.xml");