Статьи

Модуль NPM Browser-Sync в Java / веб-проектах

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
  
browser-sync start --proxy "http://localhost:8080/showcase" --files "src/main/webapp/**/*"

В результате на 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-Sync
gulp.task('browser-sync', function() {
    browsersync.init({
        proxy: "http://localhost:8080/my-showcase"
    });
});
 
// compile changed Java files by Maven "mvn compile"
// compiled classes will be transfered to target/classes automatically
gulp.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 () {
    return gulp.src('src/main/webapp/**/*', since: {gulp.lastRun('webapp')})
     .pipe(gulp.dest('target/webapp'));
});
 
// watch files for changes
gulp.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 task
gulp.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 1 source file to <path>\showcase\target\classes

Я также могу представить некоторые сложные задачи Gulp, такие как компиляция классов Java в зависимых JAR-файлах, сборка JAR-файлов и их копирование в папку WEB-INF / lib развернутой WAR.