如果从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的上下文中遇到了这个问题。
我对此进行排序的方式如下:
- 获取相对于org.eclipse.jetty.webapp包的webdefault.xml的URL
- 将此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");