如何使用嵌入式Jetty打包和部署Web应用程序

时间:2016-06-26 12:41:28

标签: java maven intellij-idea web-applications embedded-jetty

我正在开发必须在嵌入式Jetty 上运行的Web应用程序(没有外部Web应用程序容器)。所有的逻辑和内容都准备好了。我只想了解如何使用Maven打包和部署嵌入式Jetty的Web应用程序。以下是详细问题:

  1. 目前我在 Intellij IDEA 中的 Jetty 9.x 上运行我的网络应用程序,但我想无论如何它都是外部Jetty。什么是jetty嵌入式服务器。我怎样才能考虑我的网络应用程序的结构(见下文)?

  2. 我认为包文件必须不是war-file beacuase,它必须在嵌入式jetty服务器上运行。我认为它必须是可执行jar 。但我如何使用Maven获取它?

  3. 如何在目标计算机上部署它(它只是本地PC而不是服务器)?

  4. 以下是我的项目结构,供您了解情况并在您的回答中提及:

    Project folder structure

    我真的需要你的帮助。

    2016年7月4日更新

    我创建了spring boot demo应用程序,我已经完成了@techtabu给我的spring boot docs中写的所有内容,但我得到的只是下一个错误:

    enter image description here

    我还没有打包并部署我的演示应用程序。只需按下“运行'MySpringBootDemoApp'”按钮。

    enter image description here

    不仅如此,我的春季启动应用程序不会像通常的外部码头那样打开浏览器。

    是什么原因。请帮帮我!

    2016年7月6日更新

    package com.dvdexchange.controller;
    
    
    import com.dvdexchange.model.Disk;
    import com.dvdexchange.model.MyDisk;
    import com.dvdexchange.model.Takenitem;
    import com.dvdexchange.service.impl.DiskServiceImpl;
    import com.dvdexchange.service.impl.TakenItemServiceImpl;
    import com.dvdexchange.service.impl.UserServiceImpl;
    import org.springframework.security.authentication.BadCredentialsException;
    import org.springframework.security.authentication.LockedException;
    import org.springframework.security.core.context.SecurityContextHolder;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import java.util.*;
    
    /**Главный контроллер, отвечающий за обработку запросов пользователя по доступу
     **на разные адреса веб-сервиса**/
    
    @Controller
    public class MainController {
        private UserServiceImpl userService = new UserServiceImpl();
        private DiskServiceImpl diskService = new DiskServiceImpl();
        private TakenItemServiceImpl takenItemService = new TakenItemServiceImpl();
    
        @RequestMapping(value = "/", method = RequestMethod.GET)
        public String home() {
            return "login";                                 /*Первая страница, которую должен видеть пользователь - это страница авторизации и она же страница приветствия*/
        }
    
        @RequestMapping(value = "/login", method = RequestMethod.GET)
        public ModelAndView login(@RequestParam(value = "error", required = false) String error,               /*данные о предыдущей неудачной авторизации из предыдущей попытки*/
                                  @RequestParam(value = "logout", required = false) String logout, HttpServletRequest request) {   /*или об успешном выходе из аккаунта с данными о запросе на сервер*/
    
            ModelAndView model = new ModelAndView();
            if (error != null) {
                model.addObject("error", getErrorMessage(request, "SPRING_SECURITY_LAST_EXCEPTION"));         /*Получение сообщения об ошибке и запись в модель для отображения пользователю*/
            }
    
            if (logout != null) {
                model.addObject("msg", "Вы успешно вышли из учетной записи.");                                /*Запись данных об успешном выходе из аккаунта в модель для отображения пользователю*/
            }
            model.setViewName("login");
    
            return model;
        }
    
        @RequestMapping(value = "/diskLib")
        public ModelAndView diskLib() {
            String loggedUserEmail = SecurityContextHolder.getContext().getAuthentication().getName();
            List<MyDisk> diskList = new ArrayList<MyDisk>();
            List<MyDisk> testDiskList;                     /*Для предварительной проверки множества на валидность*/
            int givenDisksCount = 0;                       /*Количество взятых у пользователя дисков нужно для того, чтобы корректно блокировать кнопку "удалить диск",
                                                           **если все диски пользователя отданы*/
    
            testDiskList = userService.getUserDisksWithStatus(loggedUserEmail);
    
    
            if (testDiskList != null) {             //Множество может быть пустым и нужно позаботиться о валидности результата при таком исходе,
                diskList = testDiskList;            //поэтому используется testDiskList. Валидное пустое множество это не null, а множество( или список), в котором 0 элементов
    
                //Сортировка дисков по id по возрастанию
                Collections.sort(diskList, new Comparator<MyDisk>() {
                    public int compare(MyDisk o1, MyDisk o2) {
                        return o1.getId() - o2.getId();
                    }
                });
            }
    
            for (MyDisk disk : diskList) {
                if (disk.isGiven()) {
                    givenDisksCount++;
                }
            }
    
            ModelAndView modelAndView = new ModelAndView();
            modelAndView.addObject("CurrentUserEmail", loggedUserEmail);
            modelAndView.addObject("AllDisksOfTheUser", diskList);
            modelAndView.addObject("GivenDisksCount", givenDisksCount);
            modelAndView.setViewName("diskLib");             /*Указываем для какой страницы предназначены данные (модель). Аналогично в остальных методах*/
            return modelAndView;
        }
    
        @RequestMapping(value = "/borrowDisk")
        public ModelAndView borrowDisk() {
            String loggedUserEmail = SecurityContextHolder.getContext().getAuthentication().getName();
            List<Disk> allFreeDisks = new ArrayList<Disk>();
            List<Disk> testDisks;
    
            testDisks = diskService.getAllFreeDisksForCurrentUser(loggedUserEmail);
    
            if (testDisks != null) {             //Множество может быть пустым и нужно позаботиться о валидности результата при таком исходе,
                allFreeDisks = testDisks;        //поэтому используется testDisks. Валидное пустое множество это не null, а множество( или список), в котором 0 элементов
    
                //Сортировка дисков по id по возрастанию
                Collections.sort(allFreeDisks, new Comparator<Disk>() {
                    public int compare(Disk o1, Disk o2) {
                        return o1.getId() - o2.getId();
                    }
                });
            }
    
            int borrowCount = 0;                                                      /*Количество взятых пользователем дисков*/
            testDisks = diskService.getAllDisksTakenByLoggedUser(loggedUserEmail);
    
            if (testDisks != null) {
                borrowCount = testDisks.size();
            }
    
            ModelAndView modelAndView = new ModelAndView();
            modelAndView.addObject("CurrentUserEmail", loggedUserEmail);
            modelAndView.addObject("AllFreeDisks", allFreeDisks);                            /*Множество всех свободных для аренды дисков для текущего пользователя*/
            modelAndView.addObject("BorrowCount", borrowCount);
            modelAndView.addObject("BorrowLimit", TakenItemServiceImpl.maxBorrowedDiskCount);         /*Существует лимит на количество дисков, которые может взять каждый пользователь в аренду*/
            modelAndView.setViewName("borrowDisk");
    
            return modelAndView;
        }
    
        @RequestMapping(value = "/takenDisks")
        public ModelAndView takenDisks() {
            String loggedUserEmail = SecurityContextHolder.getContext().getAuthentication().getName();
            List<Disk> takenDisks = new ArrayList<Disk>();
            List<Disk> testTakenDisks;
    
            testTakenDisks = diskService.getAllDisksTakenByLoggedUser(loggedUserEmail);
    
            if (testTakenDisks != null) {             //Множество может быть пустым и нужно позаботиться о валидности результата при таком исходе,
                takenDisks = testTakenDisks;          //поэтому используется testFreeDisks. Валидное пустое множество это не null, а множество( или список), в котором 0 элементов
    
                //Сортировка дисков по id по возрастанию
                Collections.sort(takenDisks, new Comparator<Disk>() {
                    public int compare(Disk o1, Disk o2) {
                        return o1.getId() - o2.getId();
                    }
                });
            }
    
            ModelAndView modelAndView = new ModelAndView();
            modelAndView.addObject("CurrentUserEmail", loggedUserEmail);
            modelAndView.addObject("TakenDisks", takenDisks);                        /*Кол-во дисков, отданных пользователем в аренду*/
            modelAndView.addObject("BorrowCount", takenDisks.size());
            modelAndView.addObject("BorrowLimit", TakenItemServiceImpl.maxBorrowedDiskCount);          /*Существует лимит на количество дисков, которые может взять каждый пользователь в аренду*/
    
            modelAndView.setViewName("takenDisks");
            return modelAndView;
        }
    
        @RequestMapping(value = "/givenDisks")
        public ModelAndView givenDisks() {
            String loggedUserEmail = SecurityContextHolder.getContext().getAuthentication().getName();
            List<Takenitem> givenDisks = new ArrayList<Takenitem>();
            List<Takenitem> testGivenDisks;
            testGivenDisks = takenItemService.getAllDisksGivenByLoggedUser(loggedUserEmail);
    
            if (testGivenDisks != null) {             //Множество может быть пустым и нужно позаботиться о валидности результата при таком исходе,
                givenDisks = testGivenDisks;          //поэтому используется testFreeDisks. Валидное пустое множество это не null, а множество( или список), в котором 0 элементов
    
                //Сортировка дисков по id по возрастанию
                Collections.sort(givenDisks, new Comparator<Takenitem>() {
                    public int compare(Takenitem o1, Takenitem o2) {
                        return o1.getIddisk() - o2.getIddisk();
                    }
                });
            }
    
            ModelAndView modelAndView = new ModelAndView();
            modelAndView.addObject("CurrentUserEmail", loggedUserEmail);
            modelAndView.addObject("GivenDisks", givenDisks);                    /*Множество отданных дисков*/
            modelAndView.addObject("GivenCount", givenDisks.size());             /*Кол-во отданных дисков*/
            modelAndView.addObject("TotalCount", userService.getUserDisksWithStatus(loggedUserEmail).size());         /*Общее кол-во дисков собственных пользователя*/
    
            modelAndView.setViewName("givenDisks");
            return modelAndView;
        }
    
        /*Получаем исключение с необходимым текстом*/
        private String getErrorMessage(HttpServletRequest request, String key) {
    
            Exception exception = (Exception) request.getSession().getAttribute(key);
    
            String error = "";
            /*Получение понятного для пользователя текста ошибки в зависимостит от причин отказа в доступе*/
            if (exception instanceof BadCredentialsException) {           /*Если неверно введен пароль, а логин верный и аккаунт исправен и не заблокирован*/
                error = "Неверные \"Логин\" и/или \"Пароль\"!";         /*Но для безопасности все-равно нельзя указывать, что именно введено неправильно*/
            } else if (exception instanceof LockedException) {            /*Если аккаунт заблокирован*/
                error = exception.getMessage();
            } else {
                error =  "Неверные \"Логин\" и/или \"Пароль\"!";          /*если неверны логин и пароль или только логин*/
            }
    
            return error;
        }
    
    }
    

    不要注意评论 - 它们是俄语。

2 个答案:

答案 0 :(得分:3)

我同意deffymo的评论。使用Spring-boot。使用嵌入式服务器要容易得多。如果您使用的是IntelliJ,请在“创建新项目”窗口中选择“Spring Initializr”以创建Spring启动项目。另请参阅spring-boot documentation

Spring Boot Initializr

但是,请记住spring-boot使用Tomcat作为默认嵌入式服务器。您应该排除Tomcat并在依赖项中添加jetty。请查看有关如何操作的docs

  

但是如何使用Maven获取它?

在pom文件中将包装定义为jar。

<groupId>your-group</groupId>
<artifactId>your-project-name</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
  

如何在目标计算机上部署它(它只是本地PC而不是服务器)?

将jar文件作为java jar运行。

java -jar your-project-name.jar

答案 1 :(得分:3)

您可能还想查看maven shade plugin

来自说明

&#34;这个插件提供了将工件包装在超级罐中的功能,&#34;

你可以用java -jar yourapp.jar

启动你的应用程序