Browser-Sync — это удобный модуль NPM на основе Node.js, который можно использовать для более быстрой веб-разработки.  Browser-Sync синхронизирует изменения файлов и взаимодействия на многих устройствах.  Самая важная особенность — живая перезагрузка.  Мы также можем использовать Browser-Sync в проектах Java / Web.  Cagatay Civici создал отличный 
  видеоурок о том, как использовать этот модуль с демонстрацией PrimeFaces .  Витрина PrimeFaces имеет встроенный сервер Jetty, который смотрит на исходную папку src / main / webapp в качестве корневого веб-контекста.  После установки Browser-Sync через менеджер пакетов Node.js NPM 
| 1 2 |  npm install -g browser-sync | 
мы должны запустить сервер Jetty для демонстрации PrimeFaces по адресу http: // localhost: 8080 / showcase . После этого мы можем использовать этот URL-адрес в качестве прокси для встроенного сервера, включенного в синхронизацию браузера. Browser-Sync должен прослушивать изменения в src / main / webapp
| 1 2 |   | 
В результате на http: // localhost: 3000 / showcase будет запущен браузер по умолчанию с витриной PrimeFaces. Порт 3000 является портом по умолчанию для синхронизации браузера.
Этот подход работает хорошо, пока вы не внесли изменения в файлы Java. Файлы Java не являются веб-ресурсами в src / main / webapp . В проектах Maven они находятся в каталоге src / main / java . Это означает, что изменения в файлах Java не будут распознаваться. Решение взорвано WAR . Разнесенная WAR — это каталог, из которого развертывается веб-приложение. Каждый сервер приложений может развернуть разнесенную WAR. Для проектов Maven этот каталог обычно является target / webapp . Плагин Maven WAR имеет цель войны: тоже взорвался . Если у вас есть IDE, вы можете настроить свое веб-приложение как разнесенную WAR. Несколько лет назад я писал о горячем развертывании с IntelliJ IDEA . В IntelliJ вы можете автоматически копировать измененные файлы (CSS, JS, HTML-ресурсы и скомпилированные файлы Java) в каталог для развернутой WAR.
Теперь, если вы обновите браузер вручную, вы увидите изменения и в классах Java. Но мы хотим сделать это лучше. Мы хотим использовать высоко оцененную живую перезагрузку! Для достижения этой цели установите файлы для просмотра следующим образом
| 1 2 |  browser-sync start --proxy "http://localhost:8080/showcase"--files "target/classes/**/*.class, target/webapp/**/*" | 
Выход выглядит как
| 1 2 3 4 5 6 7 8 9 | [BS] Proxying: http://localhost:8080[BS] Access URLs: ---------------------------------------------------------------------       Local: http://localhost:3000/showcase    External: http://192.168.178.27:3000/showcase ---------------------------------------------------------------------          UI: http://localhost:3001 UI External: http://192.168.178.27:3001 --------------------------------------------------------------------- | 
Теперь я могу вносить любые изменения во все важные файлы и видеть что-то вроде в консоли
| 1 2 3 4 5 | [BS] Watching files...[BS] File changed: target\webapp\META-INF\MANIFEST.MF[BS] File changed: target\webapp\WEB-INF\classes\some\showcase\bean\SomeBean.class[BS] File changed: target\webapp\views\someView.xhtml[BS] File changed: target\webapp\META-INF\MANIFEST.MF | 
Страница браузера автоматически обновляется с помощью функции Browser-Sync (которая, кстати, использует WebSockets). Если у вас есть проблемы с вашей IDE, вы можете использовать Gulp для спасения! Вот моя идея для gulpfile.js (Gulp 4).
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | var browsersync = require('browser-sync').create();// init Browser-Syncgulp.task('browser-sync', function() {    browsersync.init({    });});// compile changed Java files by Maven "mvn compile"// compiled classes will be transfered to target/classes automaticallygulp.task('java', function () {    // use 'spawn' to execute command using Node.js    var spawn = require('child_process').spawn;    // set the working directory to project root where gulpfile.js exists    process.chdir(__dirname);    // run "mvn compile"    var child = spawn('mvn', ['compile']);    // print output    child.stdout.on('data', function(data) {        if(data) {            console.log(data.toString());        }    });});// copy changes from src/main/webapp to target/webapp gulp.task('webapp', function () {    returngulp.src('src/main/webapp/**/*', since: {gulp.lastRun('webapp')})     .pipe(gulp.dest('target/webapp'));});// watch files for changesgulp.task('watch', function () {    gulp.watch('src/main/java/**/*.java', ['java']);    gulp.watch('src/main/webapp/**/*', ['webapp']);    gulp.watch(['target/classes/**/*.class', 'target/webapp/**/*'], browsersync.reload);});// default taskgulp.task('default', gulp.series('browser-sync', 'watch')); | 
Этот файл должен быть помещен в корневую папку проекта. Теперь вы можете выполнить команду (Gulp должен быть установлен, конечно)
| 1 2 |  gulp | 
и наслаждайтесь живой перезагрузкой! Пожалуйста, примите во внимание задачу Gulp java . Maven только компилирует измененные файлы. Работает очень быстро! Без изменений компилировать нечего — выходные данные компиляции mvn выглядят так:
| 1 2 |  [INFO] Nothing to compile - all classes are up to date | 
Если мы внесем изменения в один файл Java, результат будет выглядеть следующим образом:
| 1 2 |  [INFO] Compiling 1source file to <path>\showcase\target\classes | 
Я также могу представить некоторые сложные задачи Gulp, такие как компиляция классов Java в зависимых JAR-файлах, сборка JAR-файлов и их копирование в папку WEB-INF / lib развернутой WAR.
| Ссылка: | Модуль NPM Browser-Sync в Java / веб-проектах от нашего партнера по JCG Олега Вараксина в блоге « Мысли о разработке программного обеспечения» . | 
