Expand my Community achievements bar.

Don’t miss the AEM Skill Exchange in SF on Nov 14—hear from industry leaders, learn best practices, and enhance your AEM strategy with practical tips.

Client Library Versioning in AEM 6.1

Avatar

Level 1

Hi All,

I tried to do clientlibs versioning in AEM 6.1 by creating rewriter sling-folder and copying the 'default' node from libs > cq > config > rewriter. But its not working and the whole AEM local instance in getting corrupted. Error log is showing "Unable to get component of class 'interface org.apache.sling.rewriter.Transformer' with type 'versioned-clientlibs'."

Tried from the link http://www.aemcq5tutorials.com/tutorials/versioned-clientlibs-aem/

Any kind of help would be appreciated.

Regards,

Abhijit Chowdhury

17 Replies

Avatar

Employee Advisor

You should have ACS AEM Commons installed to make this work.

Avatar

Level 1

ACS AEM Commons is already installed. Still it is not working.

Avatar

Level 10

If you follow Versioned ClientLibs, then this is all you need. No need for "default" node under rewriter as you mentioned.

/apps/<myapp>/config/rewriter/versioned-clientlibs.xml

The easiest way to configure the rewriter pipline is just to copy /libs/cq/config/rewriter/default to a path inside your application, e.g. /apps/myapp/config/rewriter/versioned-clientlibs. Note that the configuration node must be inside a four-level path that ends in config/rewriter

1703939_pastedImage_11.png

Avatar

Level 1

I have done all the steps with changes and now the instance is up & running. But the issue is, versioning is not reflecting in local AEM instance. Its all the same js & css files without query parameters.

Avatar

Level 10

Could you share the configuration screenshot the way I shared above?

In addition to that, how did you test, could you share a screenshot for the same?

Avatar

Level 1

Below is the screenshot of the configuration done

1704691_pastedImage_4.png

I ran a page from AEM, checked the source code. The js file should be appended with a query parameter, which is not getting done.

Please note, All the bundles are active, and Enforce MD5 is checked in Versioned Clientlibs Transformer Factory.

Avatar

Level 10

What works for me in my local is jcr:primaryType="sling:Folder" 

The same config is mentioned @ Versioned ClientLibs

<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0"

  jcr:primaryType="sling:Folder"
 
contentTypes="[text/html]"
   enabled="{Boolean}true"
   generatorType="htmlparser"
   order="{Long}1"
   serializerType="htmlwriter"
   transformerTypes="[linkchecker,versioned-clientlibs]"/>

I've not enforced MD5 in my local and it works fine. Per docs - Optionally, a filter can registered which checks incoming requests for client libraries and ensures that the hash in the path is the correct value

Avatar

Level 1

Thanks. But in libs > cq > config > rewriter, the default node is nt:unstructured. So when I copied, it became nt:unstructured. If manually I create the default node by choosing jcr:primaryType as sling:Folder then it appears as a folder and NOT as a node.

I am using AEM 6.1.

Avatar

Level 10

I've tested it on 6.1 & 6.4 with sling:Folder and it worked fine.

This feature is agnostic of AEM version. Iconography doesn't matter, you could still configure the properties on that sling:Folder and test.

Avatar

Level 1

Thanks Gaurav. I again tried with sling:Folder. But versioning is not getting reflected. Can you please guide how to check in local whether versioning is working. What I have tried is run a page from content folder, then checked the source code whether any query parameter is appended with the js file.

Avatar

Level 4

why should the node be in 4 level path. In my case its 5 level down as per site structure. What should I do in that case? @Jörg_Hoh  @smacdonald2008 

Avatar

Level 10

See Versioned ClientLibs

YOu can comment at that URL too for questions why its not working.

Avatar

Level 2

Hi

I am on AEM 6.4 too. For me it is even stranger... I seems to work with a node of type nt:unstructured, but only on AUTHOR instance with a url which contains the /editor.html/ for triggering the authoring widgets in it. If I leave out the /editor.html, the md5 hashes disappear from all the clientlib references in the HTML markup.

On PUBLISH the feature doesn't seem to be active either (due to not using editor.html in the url?)

I have no idea why this is happening. Any hints?

Avatar

Level 10

Probably, it is enabled/tied to runmode configuration

Check if you have "config.author" or similar rather than "config" folder in your setup:    /apps/myapp/config/rewriter/versioned-clientlibs.xml

Avatar

Level 2

Sorry, no not at all. As you normally want this feature active in all runmodes (author and publish) this shouldn't be in a runmode specific folder in my opinion. Even if it was, I stated that it works and doesn't work with 2 urls patterns on AUTHOR.

I think I fixed it though. In our project we had another rewriter configuration active next to the 'versioned-clientlibs' node. It had a 'Paths' property value of '/content/...' in it. So I figured, what if that one is overwriting the result of my versioned-clientlibs? If you add the '/editor.html' I assume this no longer matches that path and that second one isn't applied?

The second on had order '10', while my versioned-clientlib config had order '1'. So I figured to see what happens if I reverse the order, so I set the order value on versioned-clientlibs to '11' and making sure it was of type {Long}. And voila, problem disappeared!

So please guys look at http://localhost:4502/system/console/status-slingrewriter and check the order value of your config.

I assume similar rewriters for the [text/html] content type have Paths, Selectors or Resource Types defined so they don't conflict with your config. If you find one with a similar setup, just try to give the 'versioned-clientlibs' a higher order value to see it is applied last.

Hope it works for you guys too! Cheers!

Avatar

Level 10

Good to know that it worked for you, however, I don't see any URI/URL path in this configuration. Its only resource path or resource type. "/editor.html" is not a part of any resource path but url path, that explains why it was broken.

Yes, order/rank would matter.

Avatar

Level 2

I stated in my post "in our project" so ofcourse there is no path in this configuration. The screenshots above are not related to my project and the url I posted points to your own running AEM instance?

Furthermore I believe that the screenshots with the black rectangles is flawed in a sense that it also mentions content types text/javascript and text/css? In my understanding you want to rewrite links inside a text/html response which point to a clientlib. So I don't understand why you would need to mention the other resource types. The ACS Commons feature mentions that it doesn't work for references inside javascript or css files I believe. I guess it doesn't break anything, but as I am getting such nice feedback here I wanted to bounce my idea so hopefully someone can confirm or reject it.