Локальный сервер tomcat с автоматической перезагрузкой часов

Проект

У меня есть проект на основе maven, который мне нужно развернуть на локальный сервер tomcat (для разработки).

Теперь, в интерфейсе, я хочу иметь grunt dev-build (jslint, concat, karma, sass и т.д.).

Что мне нужно

  • Решение, которое не привязано только к одной IDE (и должно также работать в командной строке)
  • Я не хочу развернуть файл war только в папке dist.
  • Я не хочу перекомпилировать java каждый раз, когда меняю клиентский ресурс: js, css, html, images и т.д.
  • grunt должен следить за файлами и выполнять предварительную обработку/конкатенацию/lint/tests
  • после того, как часы grunt должны развернуть файлы в локальный tomcat и выполнить автозагрузку страницы
  • Он ДОЛЖЕН быть быстрым! и я имею в виду меньше секунды.

Я просмотрел несколько вопросов, но не могу понять, как сделать все это.

Ответ 1

Это может работать или не работать для вас, поскольку я не уверен, хотите ли вы, чтобы все было полностью интегрировано.

Этот метод позволит вам запускать сервер Tomcat, позволяя вам делать изменения переднего плана с автоматической перезагрузкой (плюс любые дополнительные задачи, которые вы можете запускать), и не перекомпилировать/перезагрузить Java в Tomcat. Я использую его и для разработки интерфейса очень быстро.

Обобщенная идея:

  • Запустите приложение Java с помощью любых средств (плагин maven tomcat, вкладка Eclipse Servers и т.д.). Запустите его на стандартном порту (например, 8080). Предположим, вы знаете, как это сделать.

  • Используйте grunt, grunt-contrib-watch, grunt-contrib-connect, grunt-contrib-proxy. Запустите grunt-contrib-connect на другом порту, чем tomcat, например. 9000. Настройка grunt-contrib-proxy для прокси-запросов от сервера grunt-contrib-connect для резервного копирования tomcat на другом порту, при необходимости переписывая URL.

Чтобы начать работу, вот необходимые части Gruntfile.js(измените ваше приложение):

// Watches files for changes and runs tasks based on the changed files
watch: {
  js: {
    files: ['<%= my.app %>/scripts/**/*.js'],
    tasks: [],
    options: {
      livereload: '<%= connect.options.livereload %>'
    }
  },
  livereload: {
    options: {
      livereload: '<%= connect.options.livereload %>'
    },
    files: [
      '<%= my.app %>/**/*.html',
      '<%= my.app %>/.tmp/styles/**/*.css',
      '<%= my.app %>/images/**/*.{png,jpg,jpeg,gif,webp,svg}'
    ]
  }
},

// The actual grunt server settings
connect: {
  options: {
    port: 9000,
    // Change this to '0.0.0.0' to access the server from outside.
    hostname: 'localhost',
    livereload: 35729
  },
  proxies: [{
    context: '/rest',
    host: 'localhost',
    port: 8080,
    https: false,
    changeOrigin: true,
    rewrite: {
      '^/rest': '/myapp/rest'
    }
  }],
  livereload: {
    options: {
      open: true,
      middleware: function(connect) {
        return [
          require('grunt-connect-proxy/lib/utils').proxyRequest,
          connect.static('src/main/webapp/.tmp'),
          connect.static('src/main/webapp/'),
        ];
      }
    }
  },

Чтобы разработать, вы запускаете свое приложение Tomcat, а затем используете консоль, запустите: grunt. Внесите необходимые изменения переднего плана, и они будут автоматически перезагружены, и любые связанные с ними задачи grunt будут выполняться с каждым изменением. Ваше приложение будет работать так же нормально, как и все бэкэнд-запросы, проксированные в Tomcat, и запросы на интерфейс обрабатываются с помощью grunt-contrib-connect.

Ответ 2

Ваш макет почти такой же, как у многих проектов. Это общепринято, смею сказать, типично, что Grunt обрабатывает ресурсы на стороне клиента, а Maven - для создания бэкэнда Java. Как говорит @wallace-sidhree, Grunt также делает большую часть вещей, которые вам нужны из коробки.

Я предлагаю вам сначала прочитать Grunt. Часть Grunt, которая бросала меня за цикл, представляла собой нечетную конфигурационную структуру, поэтому руководство по настройке является обязательным для чтения. Короче говоря, вам нужно загрузить плагин grunt-contrib-watch, и этот плагин ожидает конкретного объекта Javascript для конфигурации в вашем initConfig.

Очень простой пример из руководства -

// Simple config to run jshint any time a file is added, changed or deleted
grunt.initConfig({
  watch: {
    files: ['**/*'],
    tasks: ['jshint'],
  },
});

Что касается Tomcat, то вывод результатов Grunt под контролем Tomcat, по крайней мере во время разработки, просто вызовет головные боли. Например, Tomcat перезапишет любые ресурсы на стороне клиента. Grunt помещает внутри взорванной WAR, когда Tomcat взрывает измененную бэкэнд-WAR. И чтобы этого не случилось, вам нужно будет размещать ресурсы на стороне клиента в другой WAR. Но если вам все равно придется разбить их, вам лучше разместить ресурсы на стороне клиента с помощью lighttpd или httpster, по крайней мере, во время разработки. Это должно помочь выполнить ваши обновления для второй части.

Я не уверен в независимой от IDE автоматической перезагрузке страницы, для этого я использую расширение Chrome JetBrains; другие ответы могут покрыть его лучше.

Ответ 3

Моя стратегия для такого рода проектов заключается в том, чтобы отделить клиентскую сторону от бэкэнд, обновив мою копию. Делая это, я могу использовать любой клиент для моей внутренней поддержки. Это было резюме, вдаваясь в подробности.

Бэкэнд: Предположим, что вы используете Spring MVC для своего проекта. Сначала вы можете спроектировать свою модель и часть контроллера. Ваши сопоставления url должны быть в удобной для пользователя структуре, например:

/user/update/{userId}

У вас есть службы для разных операций, и это означает, что ваш контроллер не зависит от ваших просмотров. Вы не возвращаете ModelAndView, вы возвращаете данные json из своих служб. Вы можете использовать эту услугу у веб-клиента, мобильного клиента или настольного клиента. Я думаю, у вас есть вопросы вроде "Что относительно части ограничения?". В этой модели вы не будете использовать java-сессии, вы также получите аутентификацию как услугу, например Oauth или Oauth2. Просто у вас есть форма входа, пользователь вводит имя пользователя и пароль. Когда вы нажимаете кнопку "Логин", имя пользователя и пароль отправляются на бэкэнд и оцениваются с помощью db. Вы создаете уникальный токен, срок действия которого истекает. С этого момента вы сделаете свой запрос с этим токеном. Вы также можете определить перехватчик, чтобы проверить его актуальность для каждого запроса. Вы можете сохранить этот токен в клиенте, используя локальное хранилище. Наконец, у вас есть механизм аутентификации и службы. Это не зависит от клиентских приложений.

Frontend:. Предположим, что у вас есть клиентское приложение, в котором есть много взаимодействия с пользователем. Вы можете использовать AngularJS для веб-приложения и Twitter Bootstrap для тематики. Например, на странице списка статей вы можете совершать вызовы ajax при загрузке страницы в свои внутренние службы. Вы можете сделать это с помощью AngularJS легко. Кроме того, вы можете привязать возвращенные данные к вашим моделям страниц. Хорошо, вы открываете клиентское приложение и можете запросить ваши услуги для получения конкретных данных. Например, проект AngularJS, вы можете сослаться на здесь. Вы можете использовать yeoman для создания проекта AngularJS. Вы также можете использовать grunt для minify, uglify, ваших статических файлов, вы также можете посмотреть здесь.

Резюме:

  • Вы можете развернуть свой внутренний код отдельно от своего клиентского приложения.
  • Вы можете создавать несколько клиентских приложений для своих нужд. Сегодня создайте веб-приложение, когда-нибудь создайте мобильное приложение.
  • Вы запустите свой сервер, а затем откроете приложение на стороне клиента. Вам не нужен контейнер или приложение для клиентской стороны. Вы можете обслуживать свое клиентское приложение с помощью веб-сервера, такого как apache

Ответ 4

Вы знакомы с Grunt? Вы бы выполнили большую часть того, что вы просите с ним, из коробки, если вы его правильно настроите.

  • Вы можете разделить свои задачи и запустить только те, которые вы хотите запустить, т.е. только скомпилировать ресурсы, относящиеся к задачам.
  • Grunt основан на командной строке и будет работать при изменении файла (не требуется IDE).
  • Задача watch не будет внедрять что-либо, она просто будет следить за изменениями файлов и запускать задачи, которые вы указали в нем. Это задачи, которые будут развертывать конкатенированные, украшенные/минированные, литые, проверенные файлы в указанные вами каталоги.
  • Скорость сборки будет зависеть от того, сколько задач вы выполняете, и от того, насколько глубоко в приложении задачи нужно пережевывать, чтобы выплевывать свой вывод. Если вы хотите меньше, чем две сборки, вам нужно будет легко разделить свои задачи и запустить только несколько за раз.

Вот один из моих проектов. Он сильно опирается на Grunt, худой и быстрый.:)

Это может быть не разжевавшееся решение, которое вы ожидаете от щедрости, но это лидерство. Попытайтесь решить некоторые проблемы, которые вы пытаетесь решить и построить там, следуя моим предложениям.