Thursday, 26 February 2015

Maven-Scr-Plugin Error in AEM

In this blog, I will explain an error occurred when we build an AEM project using -

mvn clean install -P <Profile Name>, maven command.

Error description is as shown below - 

[ERROR] Failed to execute goal org.apache.felix:maven-scr-plugin:1.7.4:scr (generate-scr-descriptor) on project blog-bundle: SCR Descriptor parsing had failures (see log) -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
[ERROR] 
[ERROR] After correcting the problems, you can resume the build with the command


[ERROR]   mvn <goals> -rf :blog-bundle

Cause of this error - 

Most of the time this error occur because of the use of these two annotations - 
@SlingServlet & @Component same class.


For Example, If your coding syntax is  - 

@SlingServlet(path="/bin/blog" extension="html")
@Component
Class TestServlet extends SlingSafeMethodsServlet { /*  ----------------------- */ }

In this case you will get that error, because @SlingServlet have a property "generateComponent" by default it's value is "true" so ideally you don't provide the @Component annotation.

How to Resolve this issue - 

There are two ways to resolve this issue - 

1). Remove @Component annotation while creating Sling Servlet.

2). The issue with first solution are - 

2.1). We are not able to activate this Sling Servlet immediately, It is totally dependent on Felix implementation when it will activate this Sling Servlet. i.e. it may or may not be in active state after deploying the package.

2.2). We are not able to use immediate, enabled metatype & other properties provided by  @Component

preferred way to use these annotations is -

@SlingServlet(path="/bin/blog" extension="html", generateComponent=false)
@Component
Class TestServlet extends SlingSafeMethodsServlet { /*  ----------------------- */ }






Happy Coding
Namah Shivay