Creating service builder mvc portlet in Liferay 7 with Liferay IDE 3.

Liferay IDE Download Page: https://web.liferay.com/downloads/liferay-projects/liferay-ide

Liferay IDE 3 has massive change regarding to Liferay 7.0(Liferay DXP). One of the change is it streamlines the creation of OSGi module portlet by utilizing Liferay Blade tool, gradle elipse plugin and bnd tool.

One of the most concerned question by the Liferay developers is how we develop Service Builder with MVC portlet in new Liferay 7 development pattern.

With Liferay IDE 3 it's quite easy!

First we need to create a Liferay Space project.

A Liferay Workspace is a project container for Liferay porjects, within the Liferay workspace, we can develop and manage Liferay plugins.

And next we need to create a new Module Project by clicking File -> New -> Liferay Module Project, and choose the Project Template Name servicebuilder.

In the Liferay Workspace perspective 

We can see there are 2 gradle project under the service builder project. API project containse the service definition and interfaces, as the service path folder in 6.2. Service project contains the actual implementation of the service, as the service code in src folder in 6.2.

It contains a default service.xml. You can change the xml according to your need. After that, you can run buildservice task of service-builder-project-service in Gradle Task Window. 

After running buildService then run build task, the service will be ready to use.

 

How can we reference this service module in a mvc portlet module?

We use gradle to manage dependency.

We can create a mvc portlet Liferay Module Project. And modify build.gradle file. In our case we can add the following code to the dependency declaration.

compile project(":modules:service-builder-project:service-builder-project-api")

The service will be available to the mvc portlet. If the editor still complain about the dependency you can right click to the project -> gradle -> refreash gradle project to refreash the project.

When you deploy the project, remember to deploy 3 jars for api, service and mvc portlet.

 

You can download an example project here.

Blogs
I haven't encounter null pointer error. Make sure you have dependency in build.gradle and you have refreashed the gradle project.
I have updated the blog with an example attachment in the bottom.
Hi Neil,
I am facing one issue while build the services that,

:SB-service:buildServicePOM relocation to an other version number is not fully supported in Gradle : xml-apis#xml-apis;2.0.2 relocated to xml-apis#xml-apis;1.0.b2.

Please update your dependency to directly use the correct version 'xml-apis#xml-apis;1.0.b2'.

Thanks In advance !!!
I have the same message, but it doesn't interrupt the build service process. It will repoint the dependenty to xml-apis#xml-apis;1.0.b2.
Thanks Neil !!
One more issue i m facing that,
I make connection with mysql .After connection ,I am adding the data into the table but it showing me error in popup window
is :
Unable to build output
Could not execute build using Gradle distribution 'https://services.gradle.org/distributions/gradle-2.13-bin.zip'

Thanks in Advance !!!
Hi Neil,
I have created liferay 7 Service builder and MVC portlets and have followed your steps for adding service dependencies in portlet and refreshed gradle module.
Now there is no compile time erros and able to import all service classes in my mvc portlet
I deployed <modulename>-api,<modulename>-service, and mvc portlets in tomcat server
when i checked logs , mvc portlet status is installed and getting below error.

org.osgi.framework.BundleException: Could not resolve module: module1 [592]
Unresolved requirement: Import-Package: com.bookservice.model.impl

I dont know why dependencies not resolved at run time, please help me
Is module1 is your mvc portlet module?
Yes Neil, module1 is my portlet. Thanks for your response
I got the solution from below link
https://web.liferay.com/community/forums/-/message_boards/view_message/79177774#_19_message_79179381
Hi Neil,

I am using Liferay 7 GA1. I tried to create service builder project as mentioned and using the default service.xml. buildService task succeed but build task failing with following exception. I tried with other service.xml but getting the same error.

Exception in thread "main" com.liferay.source.formatter.SourceMismatchException
at com.liferay.source.formatter.BaseSourceProcessor.processFormattedFile(BaseSourceProcessor.java:2488)
at com.liferay.source.formatter.BaseSourceProcessor.format(BaseSourceProcessor.java:1024)
at com.liferay.source.formatter.BaseSourceProcessor$1.call(BaseSourceProcessor.java:106)
at com.liferay.source.formatter.BaseSourceProcessor$1.call(BaseSourceProcessor.java:101)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
:modules:service-builder-project:service-builder-project-service:checkSourceFormatting FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':modules:service-builder-project:service-builder-project-service:checkSourceFormatting'.
> Process 'command 'C:\Program Files\Java\jdk1.8.0_51\bin\java.exe'' finished with non-zero exit value 1

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Thanks.
Hi Neil,
Thanks for this blog it provide a great help.
But I was facing the same issue as Harish Kumar was facing. I tried by executing the deploy command instead the build. Command executed successfully.
But when I checked DB there were no tables created.
Please suggest where I have to do changes. I am using
1) Liferay 7.0 with community edition
2) mysql version-14.14 Distrib 5.6.30
3)IDE -3.0.1-ga2-linux32
Thanks a lot.
Hi Neil,
Thanks for this blog it provide a great help.
But I was facing the same issue as Harish Kumar was facing. I tried by executing the deploy command instead the build. Command executed successfully.
But when I checked DB there were no tables created.
Please suggest where I have to do changes. I am using
1) Liferay 7.0 with community edition
2) mysql version-14.14 Distrib 5.6.30
3)IDE -3.0.1-ga2-linux32
Thanks a lot.
1, make sure the compiled jar has beed deployed into Liferay
2, make sure the module has been activated
3, makre sure there's no error during running
4, check the db table(s), if not exists, try using control panel -> sys admin to regenerate the table(s).
Hi Neil,
Thanks for your replies.
I came across an issue that if i add an entity in a service builder, or modify an existing Entity in that service builder, The corresponding classes are being created but the Tables in DB are not reflected with the changes(NO new table, and no new field in the table if added.). To achieve the changes I need to do the three steps which were discussed here "https://issues.liferay.com/browse/LPS-67688" under "Only during the development phase". Please suggest any other way if possible, in which I don't need to delete the already created tables in that namespace
Hi Neil,
Thanks for your replies.
I came across an issue that if i add an entity in a service builder, or modify an existing Entity in that service builder, The corresponding classes are being created but the Tables in DB are not reflected with the changes(NO new table, and no new field in the table if added.). To achieve the changes I need to do the three steps which were discussed here "https://issues.liferay.com/browse/LPS-67688" under "Only during the development phase". Please suggest any other way if possible, in which I don't need to delete the already created tables in that namespace
Hi Neil,

Thanks for the post.

I created a service builder project, (using the command line entirely), then created an MVC Portlet using the command line. I deployed the 2 jars just fine, but when I add the dependency to my portlet's build.gradle file, and build within Eclipse, I get errors:

Project with path ':modules:tasks:tasks-api' could not be found in root project 'TaskPortlet'.

My project structure is this:
ParentDir
+TaskPortlet
+tasks
+tasks-api
+tasks-service

So what do I need to change so my TasksPortlet can see my service jars?

Thanks much.
Sorry, just saw your reply.
Please if you used the correct method compile project(":modules:tasks:tasks-api") in your TaskPortlet

Second, please make your tasks-api and tasks-serverce are sub projects of tasks project

hope it helps
Hi I am getting this error

:modules:tasks:tasks-service:buildService FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':modules:tasks:tasks-service:buildService'.
> Could not resolve all dependencies for configuration ':modules:tasks:tasks-service:serviceBuilder'.
> Could not resolve com.liferay:com.liferay.portal.tools.service.builder:1.0.133.
Required by:
com.liferay.docs.tasks:tasks-service:1.0.0
> Could not resolve com.liferay:com.liferay.portal.tools.service.builder:1.0.133.
> Could not get resource 'https://cdn.lfrs.sl/repository.liferay.com/nexus/content/groups/public/com/liferay/com.liferay.portal.tools.service.builder/1.0.133/com.liferay.portal.tools.service.builder-1.0.133.pom'.
> Could not GET 'https://cdn.lfrs.sl/repository.liferay.com/nexus/content/groups/public/com/liferay/com.liferay.portal.tools.service.builder/1.0.133/com.liferay.portal.tools.service.builder-1.0.133.pom'.
> sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED
Total time: 1.068 secs

What is it related to. Can Anybody please help me.
it looks like you don't have internet connection for IDE.
Hi Neil thanks for your posts. Is there any way to download jars externally to create a liferay plugin project or module in liferay DXP.

Thanks & Regards
Karthik
Hi Karthik, basically, you want to manage jars manually rather than using gradle to download the dependencies. Am I correct?
Hi Neil,
Yes I want to manage jars rather than connecting to internet when using eclipse IDE. I am able to download the required jars. Is there any way to configure manually to communicating with Gradle?

Thanks & Regards
karthik
I has run into the same problem. But when I change to use Liferay workspace instead of creating those projects stand-alone, it works. So do u use Liferay workspace?
hi neil, can we build service builder portlet and mvc portlet under same under same project like we done in 6.2.
tq

I think its not a good approach to have a service builder portlet and mvc portlet under same dir.

You can have a  service builder portlet that you can include in your mvc portlet (like this compileOnly project(":modules:MyPortlet-SB:MyPortlet-SB-api")) which will give your mvc portlet complete access to services.