The 5.7 branch of Magnolia reached End-of-Life on December 31, 2023, as specified in our End-of-life policy. This means the 5.7 branch is no longer maintained or supported. Please upgrade to the latest Magnolia release. By upgrading, you will get the latest release of Magnolia featuring significant improvements to the author and developer experience. For a successful upgrade, please consult our Magnolia 6.2 documentation. If you need help, please contact info@magnolia-cms.com.
In this tutorial you will get to know about content apps and how are they created.
What is a content app?
See the content app page to know more about content apps.
Create a module
Your content app needs to be deployed as a Magnolia module. Choose from these options depending on your skill level.
Option 1: Clone the project in Git
Choose this option if you know how to work with a Magnolia project and Git. You get a project that you can edit it in your IDE and customize to your needs.
- Clone the
app-tutorialrepository.
git clone https://git.magnolia-cms.com/scm/documentation/app-tutorial.git
- Import the project into your IDE. Here's what the project looks like in IntelliJ IDEA:
- Build the project into a JAR and deploy it to Magnolia instance. Or run the project in your IDE.
Option 2: Download the module JAR
Choose this option if you are new to Magnolia. Download the module JAR and follow the standard module installation instructions. You get the complete content app and can learn how it works.
- Download magnolia-app-tutorial-1.4.8.jar from Nexus.
- Copy the JAR into
<CATALINA_HOME>/webapps/<contextPath>/WEB-INF/libfolder. Typically this is<CATALINA_HOME>/webapps/magnoliaAuthor/WEB-INF/lib. - Restart your Magnolia instance and run the Web update. This will install the App Tutorial module.
Option 3: Run a Groovy Script
If you already have a module, and want to quickly create a new App, you can use the Groovy App:
- Open the Groovy app.
- Edit the script
/createAppScript. - Update the parameters you can see between line 9 and 14:
app_display_name, here you can specify the name of your appparent_module, this is where the app will be created (enter your module name)app_group, the group on the app launcher in which your app should display.app_icon, the icon of your appapp_repository, here you can keep the default repositoryapp_folder_support, if you want to be able to create folders within your app
Module contents
The module contains the following source files:
- Module descriptor:
magnolia-module-app-tutorial.xml - App configuration
products.yaml - App Launcher layout bootstrap:
config.modules.ui-admincentral.config.appLauncherLayout.groups.edit.apps.products.xml - Sample products (cars):
products.cars.xml - Images:
dam.cars.xml - Custom node type
app-tutorial-nodetypes.xml - User interface text in English:
app-products-messages_en.properties - User interface text in Spanish:
app-products-messages_es.properties
App configuration
The app is configured in YAML in products.yaml . Equivalent JCR configuration examples are provided below.
App descriptor
pages since a Pages app already exists.appClass: info.magnolia.ui.contentapp.ContentApp class: info.magnolia.ui.contentapp.ContentAppDescriptor # subapps definition
| Node name | Value |
|---|---|
info.magnolia.ui.contentapp.ContentApp | |
info.magnolia.ui.contentapp.ContentAppDescriptor |
App launcher layout
The app launcher can only be configured in the JCR.
In the app launcher layout we add the app to the Edit group.
| Node name |
|---|
Go to the app launcher and verify that you can see the Products app icon.
If you move the app to another group, log out and back in to see the change.
Browser subapp
The browser subapp allows you to view and organize items. It is part of every content app.
appClass: info.magnolia.ui.contentapp.ContentApp
class: info.magnolia.ui.contentapp.ContentAppDescriptor
subApps:
browser:
subAppClass: info.magnolia.ui.contentapp.browser.BrowserSubApp
class: info.magnolia.ui.contentapp.browser.BrowserSubAppDescriptor
| Node name | Value |
|---|---|
info.magnolia.ui.contentapp.browser.BrowserSubAppDescriptor | |
info.magnolia.ui.contentapp.browser.BrowserSubApp |
Content connector
A content connector tells the app where the content resides. In this case we store products in the repository so we use a JCR content connector. The configuration identifies the workspace and a path. It also configures the node type the app operates on.
appClass: info.magnolia.ui.contentapp.ContentApp
class: info.magnolia.ui.contentapp.ContentAppDescriptor
subApps:
browser:
subAppClass: info.magnolia.ui.contentapp.browser.BrowserSubApp
class: info.magnolia.ui.contentapp.browser.BrowserSubAppDescriptor
contentConnector:
includeProperties: false
workspace: products
rootPath: /
defaultOrder: jcrName
nodeTypes:
- name: mgnl:product
icon: icon-items
- name: mgnl:folder
icon: icon-folder
| Node name | Value |
|---|---|
icon-items | |
mgnl:product | |
icon-folder | |
mgnl:folder | |
| jcrName | |
false | |
| / | |
| products |
Workbench
In this app, the workbench displays two node types: mgnl:folder and mgnl:product.
appClass: info.magnolia.ui.contentapp.ContentApp
class: info.magnolia.ui.contentapp.ContentAppDescriptor
subApps:
browser:
subAppClass: info.magnolia.ui.contentapp.browser.BrowserSubApp
class: info.magnolia.ui.contentapp.browser.BrowserSubAppDescriptor
# contentConnector definition
workbench:
dropConstraintClass: info.magnolia.ui.workbench.tree.drop.AlwaysTrueDropConstraint
editable: false
| Node name | Value |
|---|---|
info.magnolia.ui.workbench.tree.drop.AlwaysTrueDropConstraint | |
false |
Content views
A content view defines how the content is displayed to the user. Under workbench, we have four views: tree, list, thumbnail and search. The tree view defines columns: Name, Status and Modification date. The other views extend the tree view, displaying the same columns.
appClass: info.magnolia.ui.contentapp.ContentApp
class: info.magnolia.ui.contentapp.ContentAppDescriptor
subApps:
browser:
subAppClass: info.magnolia.ui.contentapp.browser.BrowserSubApp
class: info.magnolia.ui.contentapp.browser.BrowserSubAppDescriptor
# contentConnector definition
workbench:
dropConstraintClass: info.magnolia.ui.workbench.tree.drop.AlwaysTrueDropConstraint
editable: false
contentViews:
- name: tree
class: info.magnolia.ui.workbench.tree.TreePresenterDefinition
columns: myColumns
- name: name
editable: true
sortable: true
propertyName: jcrName
class: info.magnolia.ui.workbench.column.definition.PropertyColumnDefinition
- name: status
width: 45
displayInChooseDialog: false
formatterClass: info.magnolia.ui.workbench.column.StatusColumnFormatter
class: info.magnolia.ui.workbench.column.definition.StatusColumnDefinition
- name: moddate
width: 160
sortable: true
displayInChooseDialog: false
formatterClass: info.magnolia.ui.workbench.column.DateColumnFormatter
propertyName: mgnl:lastModified
class: info.magnolia.ui.workbench.column.definition.MetaDataColumnDefinition
- name: list
class: info.magnolia.ui.workbench.list.ListPresenterDefinition
columns: *myColumns
- name: thumbnail
class: info.magnolia.ui.workbench.thumbnail.ThumbnailPresenterDefinition
- name: search
class: info.magnolia.ui.workbench.search.SearchPresenterDefinition
columns: *myColumns
| Node name | Value |
|---|---|
info.magnolia.ui.workbench.column.definition.PropertyColumnDefinition | |
true | |
Product name | |
jcrName | |
true | |
info.magnolia.ui.workbench.column.definition.StatusColumnDefinition | |
false | |
info.magnolia.ui.workbench.column.StatusColumnFormatter | |
Status | |
45 | |
info.magnolia.ui.workbench.column.definition.MetaDataColumnDefinition | |
false | |
info.magnolia.ui.workbench.column.DateColumnFormatter | |
Modification date | |
mgnl:lastModified | |
true | |
160 | |
info.magnolia.ui.workbench.tree.TreePresenterDefinition | |
| ../../tree/columns | |
| info.magnolia.ui.workbench.list.ListPresenterDefinition | |
| info.magnolia.ui.workbench.thumbnail.ThumbnailPresenterDefinition | |
| ../../tree/columns | |
| info.magnolia.ui.workbench.search.SearchPresenterDefinition |
Here's the tree view:
Test the other views too. Search is case sensitive by default.
Actions
Actions allow you to add, edit and delete folders and products. Each action adheres to an action definition.
appClass: info.magnolia.ui.contentapp.ContentApp
class: info.magnolia.ui.contentapp.ContentAppDescriptor
subApps:
browser:
subAppClass: info.magnolia.ui.contentapp.browser.BrowserSubApp
class: info.magnolia.ui.contentapp.browser.BrowserSubAppDescriptor
# contentConnector definition
# workbench definition
actions:
addProduct:
subAppId: detail
icon: icon-add-item
nodeType: mgnl:product
appName: products
class: info.magnolia.ui.contentapp.detail.action.CreateItemActionDefinition
availability:
root: true
nodeTypes:
- mgnl:folder
addFolder:
icon: icon-add-folder
class: info.magnolia.ui.framework.action.AddFolderActionDefinition
availability:
root: true
editFolder:
icon: icon-edit
dialogName: ui-framework:folder
class: info.magnolia.ui.framework.action.OpenEditDialogActionDefinition
deleteFolder:
icon: icon-delete
class: info.magnolia.ui.framework.action.DeleteItemActionDefinition
editProduct:
subAppId: detail
icon: icon-edit
appName: products
class: info.magnolia.ui.contentapp.detail.action.EditItemActionDefinition
availability:
nodeTypes:
- mgnl:product
deleteProduct:
icon: icon-delete
class: info.magnolia.ui.framework.action.DeleteItemActionDefinition
| Node name | Value |
|---|---|
mgnl:folder | |
true | |
products | |
info.magnolia.ui.contentapp.detail.action.CreateItemActionDefinition | |
icon-add-item | |
mgnl:product | |
detail | |
true | |
info.magnolia.ui.framework.action.AddFolderActionDefinition | |
icon-add-folder | |
info.magnolia.ui.framework.action.OpenEditDialogActionDefinition | |
| ui-framework:folder | |
| icon-edit | |
info.magnolia.ui.framework.action.DeleteItemActionDefinition | |
icon-delete | |
mgnl:product | |
products | |
| info.magnolia.ui.contentapp.detail.action.EditItemActionDefinition | |
icon-edit | |
detail | |
info.magnolia.ui.framework.action.DeleteItemActionDefinition | |
| icon-delete |
Action bar
appClass: info.magnolia.ui.contentapp.ContentApp
class: info.magnolia.ui.contentapp.ContentAppDescriptor
subApps:
browser:
subAppClass: info.magnolia.ui.contentapp.browser.BrowserSubApp
class: info.magnolia.ui.contentapp.browser.BrowserSubAppDescriptor
# contentConnector definition
# workbench definition
# actions definition
actionbar:
defaultAction: editProduct
sections:
- name: root
groups:
- name: addActions
items:
- name: addProduct
- name: addFolder
availability:
nodes: false
root: true
- name: folder
groups:
- name: addActions
items:
- name: addProduct
- name: addFolder
- name: editActions
items:
- name: editFolder
- name: deleteFolder
availability:
nodeTypes:
- mgnl:folder
- name: product
groups:
- name: editActions
items:
- name: editProduct
- name: deleteProduct
availability:
nodeTypes:
- mgnl:product
| Node name | Value |
|---|---|
false | |
true | |
mgnl:folder | |
mgnl:product | |
| editProduct |
Image provider
Image provider is a component that renders images used in apps. It generates the portrait image at the bottom of the action bar and the thumbnails for the thumbnail view.
appClass: info.magnolia.ui.contentapp.ContentApp
class: info.magnolia.ui.contentapp.ContentAppDescriptor
subApps:
browser:
subAppClass: info.magnolia.ui.contentapp.browser.BrowserSubApp
class: info.magnolia.ui.contentapp.browser.BrowserSubAppDescriptor
# contentConnector definition
# workbench definition
# actions definition
# actionbar definition
imageProvider:
class: info.magnolia.dam.app.ui.imageprovider.DamLinkImageProviderDefinition
damLinkPropertyName: image
| Node name | Value |
|---|---|
info.magnolia.dam.app.ui.imageprovider.DamLinkImageProviderDefinition | |
image |
Select an item in the browser subapp to test the preview. The preview image is displayed at the bottom of the action bar.
Detail subapp
A detail subapp allows you to edit a product. It is configured with a subapp descriptor just like a browser subapp but the classes are different.
appClass: info.magnolia.ui.contentapp.ContentApp
class: info.magnolia.ui.contentapp.ContentAppDescriptor
subApps:
# browser subapp definition
detail:
subAppClass: info.magnolia.ui.contentapp.detail.DetailSubApp
class: info.magnolia.ui.contentapp.detail.DetailSubAppDescriptor
| Node name | Value |
|---|---|
info.magnolia.ui.contentapp.detail.DetailSubAppDescriptor | |
info.magnolia.ui.contentapp.detail.DetailSubApp |
Content connector
A JCR content connector is also needed in the detail subapp. Here the definition is simpler. You just need to name the workspace.
appClass: info.magnolia.ui.contentapp.ContentApp
class: info.magnolia.ui.contentapp.ContentAppDescriptor
subApps:
# browser subapp definition
detail:
subAppClass: info.magnolia.ui.contentapp.detail.DetailSubApp
class: info.magnolia.ui.contentapp.detail.DetailSubAppDescriptor
contentConnector:
workspace: products
| Node name | Value |
|---|---|
| products |
The rootPath property is omitted because the default value is / which is the same as in browser subapp content connector. If you define these properties they must have the same value in both subapps. However, since / is the default value you could omit the property in both subapps.
We highly recommend using the same
rootPath
in both the detail and browser sub-apps, to benefit from our standard set of actions provided out of the box.
Editor
detail subapp. Define the node types the editor edits, a form for editing them, and actions for saving the edit.Node types
appClass: info.magnolia.ui.contentapp.ContentApp
class: info.magnolia.ui.contentapp.ContentAppDescriptor
subApps:
# browser subapp definition
detail:
subAppClass: info.magnolia.ui.contentapp.detail.DetailSubApp
class: info.magnolia.ui.contentapp.detail.DetailSubAppDescriptor
# contentConnector definition
editor:
nodeType:
icon: icon-items
name: mgnl:product
| Node name | Value |
|---|---|
icon-items | |
mgnl:product |
Form
Your app can edit any kind of content. What you plan to edit determines what fields you need on the form. In this tutorial the items are products so we create a form with three fields: product name, photo and photo credit.
appClass: info.magnolia.ui.contentapp.ContentApp
class: info.magnolia.ui.contentapp.ContentAppDescriptor
subApps:
# browser subapp definition
detail:
subAppClass: info.magnolia.ui.contentapp.detail.DetailSubApp
class: info.magnolia.ui.contentapp.detail.DetailSubAppDescriptor
# contentConnector configuration
editor:
# nodeType definition
form:
tabs:
- name: product
fields:
- name: jcrName
fieldType: text
- name: title
class: info.magnolia.ui.form.field.definition.TextFieldDefinition
- name: image
fieldType: link
targetWorkspace: dam
appName: assets
label: Select image
identifierToPathConverter:
class: info.magnolia.dam.app.assets.field.translator.AssetCompositeIdKeyTranslator
contentPreviewDefinition:
contentPreviewClass: info.magnolia.dam.app.ui.field.DamFilePreviewComponent
- name: description
fieldType: richText
Node name | Value |
|---|---|
text | |
jcrName | |
text | |
title | |
| info.magnolia.dam.app.assets.field.translator.AssetCompositeIdKeyTranslator | |
| info.magnolia.dam.app.ui.field.DamFilePreviewComponent | |
assets | |
link | |
Select image | |
dam | |
richText |
Commit and cancel actions
Commit and cancel are generic reusable actions that save the form data. They are defined under the detail subapp. The corresponding dialog buttons are in the editor (see above).
appClass: info.magnolia.ui.contentapp.ContentApp
class: info.magnolia.ui.contentapp.ContentAppDescriptor
subApps:
# browser subapp definition
detail:
subAppClass: info.magnolia.ui.contentapp.detail.DetailSubApp
class: info.magnolia.ui.contentapp.detail.DetailSubAppDescriptor
# contentConnector definition
editor:
# nodeType definition
# form definition
actions:
- name: commit
- name: cancel
| Node name | Value |
|---|---|
Create a few items. Verify that you can edit existing items too.
Now do it yourself
Here are ways to create your own content app:
Option 1: Copy an app
- Copy the configuration nodes of an existing content app into a new app. You can copy one of Magnolia's native apps such as Contacts.
- Export the copied configuration nodes into XML.
- Open the XML in a text editor. Search and replace the item names. For example, if your app manages apples instead of oranges, replace
applewithorange. - Import the XML back to Magnolia.
- Register a new workspace in the module descriptor and create a new node type.
Option 2: Extend an app
This method works well if one of Magnolia's native apps does almost what you need. You don't need to change much. Extend the native app to get all its functionality and add something special. For example, configure a special Pages app that displays only one website branch. If editors mostly work in that branch the app saves them from having to navigate there.
- Extend an existing app to inherit configuration. For example, see how the JCR Browser app extends the Configuration app by inheriting its subapps.
- Define exceptions in your own app.
See also 3.3.5 Create an app in Magnolia Academy.
Enhancements
Here are ideas for enhancing your content app and making it ready for production use:
Add import and export actions
Add export and import actions so you can export products into XML. See how the actions are implement in the Contacts app. Copy the action configuration to your app. The Magnolia UI framework provides generic export and import actions that you can use out of the box.
/modules/contacts/apps/contacts/subApps/browser/actions/export /modules/contacts/apps/contacts/subApps/browser/actions/import /modules/contacts/apps/contacts/subApps/browser/actionbar/sections/root/groups/importExportActions /modules/contacts/apps/contacts/subApps/browser/actionbar/sections/contact/groups/importExportActions /modules/contacts/apps/contacts/subApps/browser/actionbar/sections/folder/groups/importExportActions
Add publishing actions
To add publishing actions:
- Add
activateanddeactivateactions so that you can publish products to the public instance. Copy the actions from the Contacts app. - Add the
activateanddeactivateactions in the action bar. You can copy these also from the Contacts app. - Add a subscription to the
productsworkspace so that public instances receive the content.
Don't forget to install your module also on the public instance! You may not need the app on the public instance but you will need the
products workspace so that products can be activated.
Add deletion approval
Prevent editors from deleting products with a single click. The best practice is to mark an item for deletion and require the editor to publish the change:
- Display a confirmation message, asking if the user really wants to delete the item.
- Mark the item as deleted.
- Activate the change. This finally deletes the item.
See how the Contacts app handles this and replicate the actions in your app. See also how the info.magnolia.ui.api.availability.IsNotDeletedRule action availability rule is used in the activate action to make sure that the activatable item is not marked for deletion.
Display products on the website
You may want to display product images on the website or in a shop. Add a URI2RepositoryMapping for the products workspace. The mapping tells Magnolia to serve content from the products workspace when the request URL contains the /products prefix.
To add a URI2RepositoryMapping:
- Go to Configuration >
/server/URI2RepositoryMapping/mappings. Map the /products URI prefix to the
productsworkspace.Node name Value serverURI2RepositoryMappingmappingsproductsURIPrefix/products
handlePrefixrepositoryproducts
- Activate the
productsnode and its properties to the public instance. - Optional: Grant the
anonymousrole permission to read theproductsworkspace. This allows visitors to view the images on the public instance.
Photo credits:
- Riley Brooklands 1930 and Fiat Cinquecento, Pedro Ribeiro Simões. Creative Commons Attribution 2.0 Generic (CC BY 2.0)
- Pontiac 1952, Continental Mark II and Hudson 1927, John Lloyd. Creative Commons Attribution 2.0 Generic (CC BY 2.0)
Aston Martin DB5, Aston Martin Works
Aston Martin V8, Beltane43, Creative Commons Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
- Lotus Esprit S1, Don Griffin








9 Comments
Brice Nzuakue
Hi,
is there a better tutorial for creating a content app from an exisiting one? I want to create a content app from the native tours app and make it available on the app launcher. But the instructions you are giving here is not really helpful.
Thanks.
Christoph Meier
Hi
There is no better tutorial available so far. We will provide a better one in the mid-term future.
Sorry for this inconvenience.
Kind regards,
Christoph
Brice Nzuakue
Ok, I understand. Anyway, can you explain me how I can realise the following instruction for creating a content app from copyng the configuration node of an axisting one:
Christoph Meier
Here you go:
1)
Create an xml file describing / defining the node-type.
Have a look at the example used for
app-tutorialhttps://git.magnolia-cms.com/projects/DOCUMENTATION/repos/app-tutorial/browse/src/main/resources/mgnl-nodetypes/app-tutorial-nodetypes.xml
2) Register a workspace and the node type in the module descriptor:
See https://git.magnolia-cms.com/projects/DOCUMENTATION/repos/app-tutorial/browse/src/main/resources/META-INF/magnolia/magnolia-module-app-tutorial.xml
Lines 30-38
Further readings:
- https://documentation.magnolia-cms.com/display/DOCS57/XML-based+module+descriptor#XML-basedmoduledescriptor-Workspaces
- https://documentation.magnolia-cms.com/display/DOCS57/Workspaces#Workspaces-Addingacustomworkspace
I hope this helps.
Cheers,
Christoph
Ravindra Kumar Verma
Brice Nzuakue Christoph Meier is it possible to generate content app using light module and show it in app launcher. I am using magnolia 5.7 version. ?
Christoph Meier
Ravindra Kumar Verma
Yes, it is possible.
The quickest/fastest way is to create a content app based on a content type.
Within the content type you also can define "JCR params" (workspace, nodetype(s), namespace(s)).
If you already have a JCR workspace (and node type), defined somewhere else, which you want to use with your content app, define the app wothout content type.
The app descriptor (that's an app definition), for the app named foobar must be stored at:
your-light-module/apps/foobar.yamlTo get an app launcher tile, add a new node to
/modules/ui-admincentral/config/appLauncherLayout/groups/edit/apps.Links
I hope this helps,
cheers,
Christoph
Ravindra Kumar Verma
Thanks Christoph Meier As suggested I am successfully able to create app using light module and added the same to Applauncherlayut but when I click on the app icon I got the following exception , Please suggest , I am stuck tried a lot but didn't got the success.
is it possible to create workspace using light module yaml or any other way ?
javax.jcr.NoSuchWorkspaceException: dxpapp
at info.magnolia.repository.DefaultRepositoryManager.getSession(DefaultRepositoryManager.java:309) ~[magnolia-core-5.7.jar:?]
at info.magnolia.context.DefaultRepositoryStrategy.internalGetSession(DefaultRepositoryStrategy.java:61) ~[magnolia-core-5.7.jar:?]
at info.magnolia.context.AbstractRepositoryStrategy.getSession(AbstractRepositoryStrategy.java:75) ~[magnolia-core-5.7.jar:?]
at info.magnolia.context.AbstractContext.getJCRSession(AbstractContext.java:124) ~[magnolia-core-5.7.jar:?]
at info.magnolia.context.MgnlContext.getJCRSession(MgnlContext.java:642) ~[magnolia-core-5.7.jar:?]
at info.magnolia.ui.vaadin.integration.jcr.JcrItemUtil.getItemId(JcrItemUtil.java:177) ~[magnolia-ui-vaadin-integration-5.7.jar:?]
at info.magnolia.ui.vaadin.integration.contentconnector.JcrContentConnector.getDefaultItemId(JcrContentConnector.java:170) [magnolia-ui-vaadin-integration-5.7.jar:?]
at info.magnolia.ui.framework.availability.AvailabilityCheckerImpl.prepareShorthandRules(AvailabilityCheckerImpl.java:136) [magnolia-ui-framework-5.7.jar:?]
at info.magnolia.ui.framework.availability.AvailabilityCheckerImpl.prepareRules(AvailabilityCheckerImpl.java:119) [magnolia-ui-framework-5.7.jar:?]
at info.magnolia.ui.framework.availability.AvailabilityCheckerImpl.isAvailable(AvailabilityCheckerImpl.java:92) [magnolia-ui-framework-5.7.jar:?]
at info.magnolia.ui.contentapp.browser.BrowserSubApp.isSectionVisible(BrowserSubApp.java:355) [magnolia-ui-contentapp-5.7.jar:?]
at info.magnolia.ui.contentapp.browser.BrowserSubApp.getVisibleSection(BrowserSubApp.java:348) [magnolia-ui-contentapp-5.7.jar:?]
at info.magnolia.ui.contentapp.browser.BrowserSu
Christoph Meier
Dear Ravindra Kumar Verma
I have overlooked one of your earlier statements, where you said that you are using Magnolia 5.7.
Sorry!
With 5.7 you can not create workspaces via light module.
To create a workspace via light module utilizing the content-types module (by defining a content type), you need Magnolia 5.7.2 or higher (or Magnolia 6.0 or 6.1).
On the 5.7-series, 5.7.3 is the latest.
Regards,
Christoph
Ravindra Kumar Verma
Thanks Christoph Meier I have taken other way and able to create the content app using above mentioned app-tutorial project sample , and deploy the generated Jar in WEB-INF lib folder.
Now I have two questions