Java – start the embedded jetty server for jar files

What I want to do is build an executable jar file containing my project I have included its dependencies next to it and in the jar file, so my directory list looks like this:

I know and am sure that my problem does not come from dependencies, because my application runs normally until the moment I start jetty embedded

The code I use to start jetty is as follows:

public class ServerExecutionGoal implements ExecutionGoal {    

    private final static Logger logger = Logger.getLogger(ServerExecutionGoal.class);    

    private WebAppContext getWebAppContext() throws IOException {    
        WebAppContext context = new WebAppContext();    
        System.out.println("context = " + context);    
        context.setResourceBase(new PathMatchingResourcePatternResolver().getResource("classpath:/webapp").getURL().toExternalForm());    
        context.setContextPath("/");    
        context.setLogger(new StdErrLog());    
        return context;    
    }    

    @Override    
    public void execute(Map<String,Object> stringObjectMap) throws ExecutionTargetFailureException {    
        logger.info("Instantiating target server ...");    
        final Server server = new Server(8089);    
        final ContextHandlerCollection handlerCollection = new ContextHandlerCollection();    
        try {    
            handlerCollection.setHandlers(new Handler[]{new RequestLogHandler(),getWebAppContext()});    
        } catch (IOException e) {    
            throw new ExecutionTargetFailureException("Could not create web application context",e);    
        }    
        server.setHandler(handlerCollection);    
        try {    
            logger.info("Starting server on port 8089 ...");    
            server.start();    
            server.join();    
            logger.info("Server started. Waiting for requests.");    
        } catch (Exception e) {    
            throw new ExecutionTargetFailureException("Failed to properly start the web server",e);    
        }    
    }    

    public static void main(String[] args) throws ExecutionTargetFailureException {    
        new ServerExecutionGoal().execute(null);    
    }    

}

I can verify that the "webapp" folder is correctly relocated to / webapp in my jar and run the code through my IDE (IntelliJ idea 11) context setResourceBase(new PathMatchingResourcePatternResolver(). getResource(“classpath:/ webapp”) ). getURL(). Toexternalform()) is effectively mapped to related resources In addition, I can prove that it solves problems similar to:

jar:file:~/Projects/Java/web-app/out/web-app.jar!/webapp

And accessible (I've read it)

However, when I start the main method of the application and jetty starts, on http: / / localhost: 8089, I get the following:

What's wrong with me?

I know by setting "resourcebase" to "." The address "http: / / localhost: 8089" will act as the interface for the "~ / projects / Java / web app / out /" location, where I can see the list of all jar files, including "web app. Jar". Click I provide to download it

I have read the following questions and the answer does not apply:

>Embedded jetty application not working from jar: class. Getprotectiondomain() gets NullPointerException Getcodesource() resolves to null. > Embedded jetty webappcontext filepermission issue: not only is this not answered, but the situation obviously doesn't apply because I don't have a license question (the fact that I can get a file list should prove this). > Embedding jetty server problems: there is no answer, nor does it apply, because I don't have any dependency problems (as I pointed out in the comments above)

I think I should somehow enable the jetty access / webapp folder, which is located in my Src / main / resources / directory and bundled into my web application Should I abandon the bundled web application and deploy the exploded context path somewhere that jetty can access (this is not desirable at all because it causes a lot of problems for me and my customers)

Solution

I'm not sure if jetty's webappcontext can be used with pathmatching resourcepatternresolver!

In one of my projects, I wrote my own javax servlet. Filter to solve this problem. It loads the requested resource through class #getresourceasstream Class #getresourceasstream reads resources from inside jar and resource path (such as Maven)

I hope this tip will help you. Cheers, Tiro

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>