我有使用嵌入式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.x.y-SNAPSHOT
2011-11-22 15:37:02.686:WARN::Failed startup of context o.e.j.w.WebAppContext{/,[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.<init>(FileInputStream.java:106)
at java.io.FileInputStream.<init>(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
我有以下java类运行jetty服务器实例
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看起来像
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
如果我在IDE中运行,这个应用程序运行正常,但它与JAR失败。 如何解决此问题,以便我可以拥有包含Web应用程序的单个jar文件?
答案 0 :(得分:2)
似乎jetty试图解析web.xml(描述符)文件,但认为它在
.../...../...../webdefault.xml
或类似的东西。
您应该显式设置web.xml路径:
context.setDescriptor("WEB-INF/web.xml"); `
或者,假设您的jar确实包含了前面提到的'project'dir(这不是标准的jar内部布局):
context.setDescriptor("project/src/webapps/WEB-INF/web.xml");
答案 1 :(得分:2)
我有类似的问题,我用这个主类实现来解决它:
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);
}
答案 2 :(得分:2)
从@Trein的帖子中,设置WAR_LOCATION非常重要。我看到jetty在缺少Web部署时无法部署。
假设您正在使用Jetty测试您的应用,如果您正在使用Maven POM,那么我将如何测试我的网络应用
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-servlet-tester</artifactId>
<version>6.1.22</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.19</version>
<scope>test</scope>
</dependency>
</dependencies>
<profiles>
<profile>
<id>tomcat</id>
<build>
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.22</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<stopKey>foo</stopKey>
<stopPort>9999</stopPort>
<contextPath>/</contextPath>
<webAppSourceDirectory>src/main/webapp</webAppSourceDirectory>
<systemProperties>
<systemProperty>
<name>RESOURCE_PATH</name>
<value>${project.build.outputDirectory}</value>
</systemProperty>
</systemProperties>
<connectors>
<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<port>9090</port>
<maxIdleTime>60000</maxIdleTime>
</connector>
</connectors>
</configuration>
<executions>
<execution>
<phase>test-compile</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<scanIntervalSeconds>0</scanIntervalSeconds>
<daemon>true</daemon>
</configuration>
</execution>
<execution>
<id>stop-jetty</id>
<phase>package</phase>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
要运行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设置有关)
答案 3 :(得分:1)
找到这个github项目: https://github.com/steveliles/jetty-embedded-spring-mvc
这提供了一个基于maven的基本启动模板项目。它嵌入了带有弹簧mvc的码头。 从头开始或比较和调试当前实现的错误的好地方。
作者在这里做了一个很好的文档: http://steveliles.github.io/setting_up_embedded_jetty_8_and_spring_mvc_with_maven.html
答案 4 :(得分:1)
可能有点过时了。但是我最近在使用与Eclipse(Jetty 8.x)打包的Jetty版本在Eclipse OSGi应用程序中嵌入Jetty的环境中遇到了这个问题。
我对此进行排序的方法如下:
Bundle bundle = FrameworkUtil.getBundle(WebAppContext.class);
Enumeration<URL> urls = bundle.findEntries("/", "webdefault.xml", true);
String webdefaultURL = urls.nextElement().toExternalForm(); // Should check returned value
mycontext.setDefaultsDescriptor(webdefaultURL);
希望有所帮助
SEB
答案 5 :(得分:0)
您的webdefault.xml
(码头)丢失了:
java.io.FileNotFoundException:d:\ test \ org \ eclipse \ jetty \ webapp \ webdefault.xml
如果您有自定义位置,则需要添加它:
context.setDefaultsDescriptor("/my/path/to/webdefault.xml");