5

We are using webjars with maven in our project. So we have hundreds of JSPs with code like this:

<%--JSP CODE--%>
<script src="<c:url value="/webjars/jquery/2.2.0/jquery.min.js" />" type="text/javascript"></script>
<script src="<c:url value="/webjars/bootstrap/3.3.6/js/bootstrap.min.js" />" type="text/javascript"></script>
......... 

And as you can guess it's a cumbersome work to update to newer versions of webjars. So I'm looking for the solution which will allow me to import scripts like this:

<%--JSP CODE--%>
<script src="<c:url value="/webjars/jquery/jquery.min.js" />" type="text/javascript"></script>
<script src="<c:url value="/webjars/bootstrap/js/bootstrap.min.js" />" type="text/javascript"></script>
......... 

Basically I want to remove a webjar version from url. Can you propose nice and simple solution for this problem?

So far I come up with resource servlet which can guess which file to return by the url. But this solution involves full resource scanning at the start of an application.

Yurii Bondarenko
  • 3,460
  • 6
  • 28
  • 47
  • 1
    If you use minifying you can create those js files into a separate folder and with a name which does not contain the version... – khmarbaise Feb 21 '16 at 14:23

1 Answers1

5

Take a look at webjars-locator project, you can use it to create proper request controller.

In case of using Spring MVC this would be:

@ResponseBody
@RequestMapping("/webjarslocator/{webjar}/**")
public ResponseEntity locateWebjarAsset(@PathVariable String webjar, HttpServletRequest request) {
    try {
        String mvcPrefix = "/webjarslocator/" + webjar + "/"; // This prefix must match the mapping path!
        String mvcPath = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
        String fullPath = assetLocator.getFullPath(webjar, mvcPath.substring(mvcPrefix.length()));
        return new ResponseEntity(new ClassPathResource(fullPath), HttpStatus.OK);
    } catch (Exception e) {
        return new ResponseEntity<>(HttpStatus.NOT_FOUND);
    }
}

Disclaimer: This is the code from WebJars documentation (section Making dependencies version agnostic).

In this case you can ask for js libraries in following way:

<link rel='stylesheet' href='/webjarslocator/bootstrap/css/bootstrap.min.css'>

Please note that there's no version in this url.

You can also try to optimize this requests (and consequently - filesystem scans) by using cache, but I am almost sure that some kind of cache is already involved in webjars-locator (I haven't checked that).

Maciej Dobrowolski
  • 11,561
  • 5
  • 45
  • 67