Aplikasi web Javascript dan server Java, buat semua di Maven atau gunakan aplikasi Grunt untuk web?

97

Kami sedang membuat aplikasi web dengan AngularJS dan kami menyukai ide menggunakan Bower untuk Manajemen Ketergantungan dan Grunt untuk membangun, menjalankan tes, dll. ( Yeoman )

Server dilakukan dengan Java menggunakan Maven, jadi tentu saja kami ingin dengan sederhana mvn installmembangun semuanya (aplikasi web + server)

Jadi pendekatan apa yang Anda ambil dan mengapa?

1) Perlakukan mereka sebagai dua aplikasi berbeda, yang sebenarnya memang demikian. Jadi menggunakan metode / alat bangunan yang berbeda dapat diterima.

2) Lupakan tentang Grunt Bower, gunakan plugin Maven untuk membangun, menjalankan pengujian, mengelola dependensi untuk aplikasi web. Jika demikian, yang mana?

3) Gunakan plugin Maven exec untuk memanggil Grunt untuk membuat aplikasi web front-end. Saya melihat ini lebih sebagai peretasan daripada solusi.

4) Lainnya.

Pendekatan yang lebih mudah diintegrasikan dengan Jenkins merupakan nilai tambah.

Terima kasih sebelumnya!

kosong
sumber
2
3 tahun kemudian, integrasi alat jelas meningkat. Plugin maven ini tampaknya memiliki banyak hal yang dibahas: github.com/eirslett/frontend-maven-plugin
earcam

Jawaban:

73

Setelah bekerja dengan tentang setiap alat pipeline aset di toolkit Java untuk sementara waktu, saya sampai pada beberapa kesimpulan:

Perkakas Berbasis Java

Ada beberapa alat di luar sana tetapi yang paling populer adalah JAWR dan Wro4J. Masalah terbesar dengan keduanya adalah bahwa mereka sebagian besar berbasis Rhino (WRO4J sekarang memiliki beberapa dukungan Node) dan Rhino adalah anjing yang lambat dibandingkan dengan alat berbasis Node. Anda juga harus mempertimbangkan bahwa perkakas JavaScript berkembang pesat sehingga Anda harus mencari alat yang dapat bergerak dengan cepat.

  • WRO4J - Dukungannya luar biasa, integrasi Maven DAN Eclipse sangat bagus, daftar plugin sangat luas dan kerangka kerjanya cukup fleksibel sehingga dengan sedikit minyak siku Anda dapat menulis plugin untuk apa pun yang Anda butuhkan. Jika Anda terbatas pada pipa aset berbasis Java, ini pasti cara yang tepat. Masalah dengan Wro4j adalah lambat (bahkan ketika ia memulai proses Node) relatif terhadap alat berbasis Node.
    Untuk memberikan beberapa nomor dunia nyata yang mengumpulkan dan menggabungkan 25 bundel aset yang berisi LESS, CSS CoffeeScript dan JavaScript membutuhkan waktu sekitar ~ 35 detik saat menggunakan Rhino dan ~ 15 detik menggunakan dukungan Node Wro4j pada iMac 2013 dengan RAM 16G. Menggunakan Grunt + Node membutuhkan waktu sekitar 2 detik pada MacBook Air saya yang kecil.

  • JAWR - Integrasi dan daftar fitur cukup bagus tetapi dokumennya tidak bagus dan menulis plugin Anda sendiri bisa sedikit rumit. Ketika saya pertama kali menulis posting ini JAWR berada di tengah-tengah 4 tahun absen tetapi sekarang kembali dalam pengembangan aktif pada Jan 2014. Jika Anda memilih untuk menyelidiki Java Tools, ini patut diselidiki.

Perkakas Berbasis Node (terintegrasi dengan Ant / Maven Builds)

  • Grunt - Mudah, memiliki ekosistem plugin yang fantastis, dan komunitasnya sangat besar. Jika ada sesuatu yang perlu Anda lakukan, Anda bisa bertaruh ada plugin untuk itu - bahkan mungkin yang ditulis oleh pencipta grunt. Kritik utama dari Grunt adalah bahwa ia didorong oleh konfigurasi yang membuat pengaturan menjadi sangat mudah tetapi bukan "Cara Node." Perlu juga disebutkan bahwa tugas Grunt tidak mudah disusun sehingga untuk pipeline build JavaScript yang rumit, Grunt mungkin tidak ideal.

  • Gulp - Gulp adalah alternatif yang berkembang pesat untuk Grunt. Ini bersamaan secara default dan menggunakan aliran untuk menghindari penulisan sementara ke sistem file yang dapat sangat mempercepat pembangunan Anda. Gulp sangat idiomatis dan memiliki penekanan pada kode> konfigurasi dan meskipun ini memberi Anda banyak kekuatan, itu tidak ideal untuk tim yang tidak memiliki kompetensi inti dalam JavaScript.

Satu-satunya kemungkinan menutup telepon untuk perkakas berbasis JavaScript adalah Anda harus memiliki Node , npm dan grunt-cli / gulp pada mesin apa pun yang perlu melakukan kompilasi. Jika Anda tidak memiliki akses ke mesin CI Anda atau tidak menggunakan penerapan berbasis artefak, ini mungkin sulit dijual.

Mengintegrasikan ini ke dalam proyek Maven Anda cukup mudah dan Anda memiliki beberapa opsi. Anda dapat menggunakan plugin ant-run Maven , Anda dapat menjalankan tugas ant exec dan memanggilnya dari Maven atau yang terbaik dari semuanya, Anda dapat menggunakan tugas maven exec .
Di bawah ini adalah kode untuk mengintegrasikan ini ke dalam siklus hidup Maven menggunakan plugin exec jika ini berguna bagi siapa saja.

    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>exec-maven-plugin</artifactId>
      <version>1.2.1</version>
      <executions>
        <execution>
          <phase>prepare-package</phase>
          <goals>
            <goal>exec</goal>
          </goals>
        </execution>
      </executions>
      <configuration>
        <executable>grunt</executable>
      </configuration>
    </plugin>
Baer
sumber
1
Terima kasih atas jawaban mendetailnya. Saya rasa saya akan memilih opsi Node Based Tooling. Baru di Grunt Saya menyukai apa yang saya lihat sejauh ini, dan akan lebih bagus lagi jika saya bisa mendapatkan yang terbaik dari dua dunia. Saya tidak tahu tentang keberadaan WRO4J dan JAWR. Terima kasih lagi.
batal
wro4j mengintegrasikan prosesor less4j yang merupakan implementasi berbasis java dari less.js yang kinerjanya sebanding dengan node.js asli.
Alex Objelean
1
Alasan mengapa wro4j tidak secepat itu dengan node.js, sebagian besar karena ia membutuhkan operasi IO disk untuk setiap eksekusi. Ini dapat ditingkatkan hanya jika proses berbasis node.js (seperti lessc) akan memungkinkan kompilasi sumber daya dalam memori.
Alex Objelean
12
Apakah proses ini mendukung kegagalan Mavenbuild jika gruntbuild gagal?
Snekse
6
Setiap tugas exec yang tidak ditampilkan dengan benar seharusnya gagal dalam build. stackoverflow.com/questions/3480162/…
Baer
24

Bagi siapa pun yang masih mencari informasi lebih lanjut tentang topik ini, salah satu pencipta Yeoman memiliki artikel bagus (ditulis beberapa bulan setelah pertanyaan ini awalnya diajukan) yang memperluas jawaban asli dengan sedikit lebih detail:

Jeff Smith
sumber
Terima kasih ganda! Saya menemukan posting ini sangat membantu dan lebih dari apa yang saya cari,
Ryan J. McDonough
13

Lalu ada juga frontend-maven-plugin: https://stackoverflow.com/a/19600777/320399 Ini mengunduh Node dan NPM untuk Anda (secara lokal ke proyek Anda), mengunduh Grunt melalui NPM itu (dijalankan oleh Node itu) dan kemudian menjalankan Grunt (melalui Node itu). Ini self-bootstrap, dan Anda tidak perlu Node diinstal pada mesin untuk membangun proyek. Hanya satu perintah; mvn install.

Eirik Sletteberg
sumber
13

Anda mungkin ingin memeriksa http://jhipster.github.io/ : ini adalah generator Yeoman, yang menghasilkan aplikasi yang memiliki Maven, Grunt, dan Bower yang semuanya bekerja sama.

Ini agak seperti opsi ketiga Anda, tetapi semuanya dikonfigurasi untuk Anda, yang tidak semudah itu. Ini juga menghasilkan layanan AngularJS dan Java REST dasar untuk Anda.

Julien Dubois
sumber
1
Sudah terlambat bagi proyek saya untuk memulai dengan aplikasi yang baru dibuat. Tapi ini bagus dan sangat membantu, saya akan meminjamkan beberapa solusi dari aplikasi yang dihasilkan dan digunakan dalam proyek saya. Terima kasih!
Matsemann
2
Sebenarnya, Anda hanya perlu memasukkan plugin yeoman-maven dan ini memungkinkan Anda untuk meletakkan semua hal konfigurasi JavaScript (bower, npm, grunt) sebagai saudara ke pom.xml (persis di mana file-file ini seharusnya dimiliki IMO), dan setelahnya. mvn install itu akan membangun segalanya - termasuk webapp Anda di bawah src / main / webapp. Butuh waktu kurang dari setengah jam untuk memindahkan proyek yang ada ke struktur itu. Tentu saja Anda harus melihat aplikasi contoh di github.com/jhipster/jhipster-sample-app
raven_arkadon
4

setelah beberapa jam dihabiskan untuk mengatasi masalah ini, saya dapat mengatakan ini:

maven dan grunt tidak bermain bagus, tapi bisa dipaksakan ..

Berikut adalah deskripsi plugin untuk menjalankan Grunt via Maven build

saya harap ini membantu :)

Nadav Leshem
sumber
terima kasih atas jawabannya, ada baiknya ya tapi saya akan mencobanya sesuai jawaban @Baer.
tidak berlaku
9
inti dimaksud sudah mati
Peter Butkovic