Die Nutzung von _ WebJars - Web Libraries in Jars _ ist eine clevere Methode um clientseitige Bibliotheken als Abhängigkeit in javabasierte Anwendungen einzubinden. Auf der Platform webjars.org, die seit Oktober 2012 online ist, werden vorhandene _ Webjars _ veröffentlicht und alle dort gehosteten Jars sind auch im Maven Central Repository verfügbar.

Aufbau

Bei einem _ Webjar _ handelt sich um ein Maven Artifakt bestehend aus nur einer pom.xml Datei. Als kompiliertes Jar stellt es die clientseitig notwendigen Ressourcen über das META-INF Verzeichnis zur Verfügung. Dabei wird die Servlet 3.0 Spec genutzt, in der unter anderem definiert ist, dass alles was unterhalb des META-INF/resource Verzeichnis als statische Resourcen verfügbar ist.

|-pom.xml
|-README.md
|-target
|---classes
|-----META-INF
|-------resources
|---------webjars
|-----------jvectormap
|-------------2.0.1
|---------------jquery-jvectormap.css
|---------------jquery.jvectormap.min.js
|---------------jvectormap.jquery.json
|---------------LICENSE-COMMERCIAL
|---------------LICENSE-GPL
|---------------README.md

“Build your own Webjar” - Beispiel jVectorMap

Gibt es noch kein Webjar für die benötigte JavaScript Bibliothek, kann in wenigen Schritten ein eigenes WebJar erstellt werden. Das Grundgerüst der pom.xml erstellen wir anhand der Anleitung Webjars - Contributing. Danach fügen wir in den Buildprozess die eigentlich Ausführungsschritte ein, um die nötigen Resourcen in den Ziel Ordner zubekommen.

Im Buildprozess kommen in unserem Fall die Maven Plugins wagon-maven-plugin , maven-antrun-plugin und _ yuicompressor-maven-plugin _ bei den folgenden Schritten zum Einsatz.

  • Herunterladen der ZIP Datei ( wagon-maven-plugin )
  • Entpacken der Zip Datei (maven-antrun-plugin)
  • Kopieren der CSS Resourcen und Lizenz Dateien (maven-antrun-plugin)
  • Zusammenfügen der JavaScript Dateien (yuicompressor-maven-plugin)

Die komplette pom.xml Datei ist auf GitHub verfügbar.

Beispiel Integration Spring MVC

Hinzufügen der Maven Dependency

<dependency>
	<groupId>org.webjars</groupId>
	<artifactId>jvectormap</artifactId>
	<version>2.0.1</version>
</dependency>

Einbindung in das Template

<script type='text/javascript' src='${pageContext.request.contextPath}/webjars/jvectormap/2.0.1/jquery.jvectormap.min.js'></script>

Wird zum Beispiel Spring MVC mit Spring Security eingesetzt, dann muss der Pfad zu den Resourcen verfügbar gemacht werden. Zum Beispiel über die _ WebMvcSecurityConfiguration _

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/webjars/**");
}

Die Entscheidung, ob der komplette _ Webjar  _Context Pfad oder nur einzelne _ Webjar  _freischaltet werden sollen liegt beim Entwickler.

Fazit

Mittels _ Webjars _ lassen sich clientbasierte Bibliotheken genauso einfach als Dependency einbinden und verwalten wie geläufige Java Artifakte.

Wird ein neues _ Webjar _ erstellt, bieten sich zwei Möglichkeiten der Verteilung an. Die Beste ist, es an die Community weiterzureichen (Webjars - Contributing, GitHub Webjars).

Ist das nicht möglich kann man es natürlich auch intern über den eigenen Repository Manager (Nexus o.ä.) anderen Entwicklern oder dem Continuous Integration & Build Server (Bamboo, Jenkins o.ä.) zur Verfügung zu stellen.