Spring application with embedded jetty can't find webdefault.xml if running from jar

前端 未结 6 486
伪装坚强ぢ
伪装坚强ぢ 2021-02-03 15:19

I have spring application which uses embedded Jetty instance.

project
   | src
      | controller
      | webapps
          | jsp
          | WEB-INF
                    


        
相关标签:
6条回答
  • 2021-02-03 15:37

    Found this github project : https://github.com/steveliles/jetty-embedded-spring-mvc

    This gives a basic startup template project based on maven. It embedded jetty with spring mvc. Good place to start from scratch or to compare and debug what's wrong with current implementation.

    The author has done a nice documentation here : http://steveliles.github.io/setting_up_embedded_jetty_8_and_spring_mvc_with_maven.html

    0 讨论(0)
  • 2021-02-03 15:46

    Probably a little bit out-dated. However I recently encountered this problem in the context of embedding Jetty in an Eclipse OSGi application using the version of Jetty packaged with Eclipse (Jetty 8.x).

    The way I sorted this out is the following :

    1. Get the URL of the webdefault.xml relative to the org.eclipse.jetty.webapp bundle
    2. Pass this URL to the context default descriptor
    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);
    

    Hope it helps

    seb

    0 讨论(0)
  • 2021-02-03 15:47

    From @Trein's post, setting the WAR_LOCATION is important. I have seen jetty failing to deploy the web app when this is missing.

    Assuming that you are using Jetty to test your app, if you are using Maven POM below is how I test my web app

    pom.xml

     <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>
    

    To run the webapp you can either run mvn jetty:start or run mvn package. This starts the Jetty server on port 9090 and runs the tests (run your http based tests here) and shutdown the server/webapp. If you want to run as standalone webapp, use mvn jetty:start and use your webapp just like any webapp container.

    This all assumes you are using Maven. The code above provided by @Trein does the same programatically and the one I provided is the maven configuration equivalent of the above.

    Note: You shouldn't worry about webdefault.xml as the default is already packaged in the jetty jar file. You should use your own webdefault.xml only when you need to extend/alter the defaults. There is either something wrong with your Jetty jar (if its reporting this or something to do with your CLASSPATH settings)

    0 讨论(0)
  • 2021-02-03 15:50

    I had a similar problem and I solve it with this main class implementation:

    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);
    }
    
    0 讨论(0)
  • 2021-02-03 15:54

    Your webdefault.xml (Jetty) is missing:

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

    see "What is webdefault.xml?"

    If you have a custom location, you need to add it:

    context.setDefaultsDescriptor("/my/path/to/webdefault.xml");
    
    0 讨论(0)
  • 2021-02-03 15:56

    It seems that jetty's trying to parse the web.xml (descriptor) file, but thinks its in

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

    or something like that.

    You should explicitly set the web.xml path:

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

    or, assuming that your jar really does include the aformentioned 'project' dir (which isn't standard jar intrernal layout):

    context.setDescriptor("project/src/webapps/WEB-INF/web.xml");
    
    0 讨论(0)
提交回复
热议问题