Create a Java application based on Obeo Enterprise for SysON

This guide explains how to create a Java application based on Obeo Enterprise for SysON. The application reuses the frontend provided by the oe4syson-frontend Maven artifact; it does not create, build, or customize a frontend.

Obeo Enterprise for SysON is based on SysON and Obeo Enterprise for Sirius. Both SysON and Obeo Enterprise for Sirius are based on Sirius Web. Obeo Cloud Platform (OCP) is the technical name used in dependencies and configuration properties for Obeo Enterprise for Sirius. See the public product documentation for the documentation of these products.

1. Prerequisites

Use Java 21 and Maven. Before building the application, configure access to the GitHub Packages and AWS CodeArtifact repositories as described in Build applications based on Obeo Enterprise for SysON. In particular, use the settings.xml from that guide when running Maven.

The example below uses a local PostgreSQL database named my-oe4syson-based-app, available on localhost:5432, with the dbuser user and the dbpwd password. Create this database and user with your preferred local PostgreSQL setup before starting the application.

2. Create the Maven project

Create the following project structure:

my-oe4syson-based-app/ (1)
├── pom.xml (2)
└── my-oe4syson-based-app/ (3)
    ├── pom.xml (4)
    └── src/main/
        ├── java/com/example/oe4syson/MyOE4SysONBasedApplication.java (5)
        └── resources/application.properties (6)
1 The root project aggregates the application module.
2 This parent POM imports the Obeo Enterprise for SysON dependency management and declares the application module.
3 This module contains the Java application built and run by Spring Boot.
4 This POM declares the dependencies required by the application module.
5 This class is the Spring Boot entry point.
6 This file configures the application runtime.

2.1. Create the parent POM

Create my-oe4syson-based-app/pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>fr.obeo.enterprise.syson</groupId>
        <artifactId>oe4syson</artifactId>
        <version>2026.7.0</version>
        <relativePath />
    </parent> (1)

    <groupId>com.example</groupId> (2)
    <artifactId>my-oe4syson-based-app-parent</artifactId> (3)
    <version>1.0.0-SNAPSHOT</version> (4)
    <packaging>pom</packaging> (5)

    <modules>
        <module>my-oe4syson-based-app</module>
    </modules> (6)
</project>
1 Inherit Obeo Enterprise for SysON’s dependency management. Change this version to the product version targeted by the application. relativePath makes Maven retrieve this parent from the configured repositories.
2 Replace com.example with the group ID that identifies your organization or application.
3 This artifact identifies the parent project; child modules inherit its configuration.
4 Set the version of your application project. SNAPSHOT identifies a development version.
5 The parent is an aggregator, not a Java artifact, so it uses pom packaging.
6 Declare each application module built as part of this parent project.

2.2. Manage dependencies in your own parent POM

Instead of inheriting from fr.obeo.enterprise.syson:oe4syson, you can manage the dependency versions in your own parent POM. Use this option only when your application must control its own dependency management, and configure the Maven repositories and credentials described in Build applications based on Obeo Enterprise for SysON.

The following POM is an alternative to the parent POM above:

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>4.0.7</version>
        <relativePath />
    </parent> (1)

    <groupId>com.example</groupId>
    <artifactId>my-oe4syson-based-app-parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging> (2)

    <properties>
        <java.version>21</java.version> (3)
        <oe4syson.version>2026.7.0</oe4syson.version>
        <syson.version>2026.7.0</syson.version>
        <ocp.version>2026.7.0</ocp.version> (4)
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>obeo</groupId>
                <artifactId>obeo-cloud-platform-starter</artifactId>
                <version>${ocp.version}</version>
            </dependency> (5)
            <dependency>
                <groupId>fr.obeo.enterprise.syson</groupId>
                <artifactId>oe4syson-frontend</artifactId>
                <version>${oe4syson.version}</version>
            </dependency> (6)
            <dependency>
                <groupId>fr.obeo.enterprise.syson</groupId>
                <artifactId>oe4syson-ai-chat</artifactId>
                <version>${oe4syson.version}</version>
            </dependency> (7)
            <dependency>
                <groupId>org.eclipse.syson</groupId>
                <artifactId>syson-sysml-metamodel</artifactId>
                <version>${syson.version}</version>
            </dependency>
            <dependency>
                <groupId>org.eclipse.syson</groupId>
                <artifactId>syson-sysml-metamodel-edit</artifactId>
                <version>${syson.version}</version>
            </dependency> (8)
            <dependency>
                <groupId>org.eclipse.syson</groupId>
                <artifactId>syson-application-configuration</artifactId>
                <version>${syson.version}</version>
            </dependency>
            <dependency>
                <groupId>org.eclipse.syson</groupId>
                <artifactId>syson-sysml-rest-api-services</artifactId>
                <version>${syson.version}</version>
            </dependency> (9)
            <dependency>
                <groupId>org.eclipse.syson</groupId>
                <artifactId>syson-common-view</artifactId>
                <version>${syson.version}</version>
            </dependency>
            <dependency>
                <groupId>org.eclipse.syson</groupId>
                <artifactId>syson-diagram-common-view</artifactId>
                <version>${syson.version}</version>
            </dependency>
            <dependency>
                <groupId>org.eclipse.syson</groupId>
                <artifactId>syson-standard-diagrams-view</artifactId>
                <version>${syson.version}</version>
            </dependency>
            <dependency>
                <groupId>org.eclipse.syson</groupId>
                <artifactId>syson-diagram-services</artifactId>
                <version>${syson.version}</version>
            </dependency> (10)
            <dependency>
                <groupId>org.eclipse.syson</groupId>
                <artifactId>syson-tree-explorer-view</artifactId>
                <version>${syson.version}</version>
            </dependency>
            <dependency>
                <groupId>org.eclipse.syson</groupId>
                <artifactId>syson-tree-services</artifactId>
                <version>${syson.version}</version>
            </dependency> (11)
            <dependency>
                <groupId>org.eclipse.syson</groupId>
                <artifactId>syson-sysml-import</artifactId>
                <version>${syson.version}</version>
            </dependency>
            <dependency>
                <groupId>org.eclipse.syson</groupId>
                <artifactId>syson-sysml-export</artifactId>
                <version>${syson.version}</version>
            </dependency>
            <dependency>
                <groupId>org.eclipse.syson</groupId>
                <artifactId>syson-sysml-validation</artifactId>
                <version>${syson.version}</version>
            </dependency>
            <dependency>
                <groupId>org.eclipse.syson</groupId>
                <artifactId>syson-table-requirements-view</artifactId>
                <version>${syson.version}</version>
            </dependency> (12)
        </dependencies>
    </dependencyManagement>

    <modules>
        <module>my-oe4syson-based-app</module>
    </modules> (13)
</project>
1 Inherit Spring Boot’s dependency and plugin defaults. Keep this version compatible with the selected Obeo Enterprise for SysON release.
2 These coordinates identify your aggregator POM. Replace them with the coordinates of your application.
3 Build the application with Java 21.
4 Maintain the Obeo Enterprise for SysON, SysON, and Obeo Cloud Platform versions as properties. Use oe4syson.version for Obeo Enterprise for SysON artifacts, syson.version for org.eclipse.syson artifacts, and ocp.version for Obeo Cloud Platform artifacts. Select matching versions from the same Obeo Enterprise for SysON release and update them together.
5 Manage the Obeo Cloud Platform dependency explicitly.
6 Manage the supplied Obeo Enterprise for SysON frontend explicitly; the application module can still declare this dependency without a version.
7 Manage the optional AI chat module explicitly. It is included in the application only when the application module declares the oe4syson-ai-chat dependency.
8 Manage the SysML metamodel and editing dependencies explicitly.
9 Manage the SysON application configuration and REST API dependencies explicitly.
10 Manage the shared views, standard diagram views, and diagram services explicitly.
11 Manage the project explorer view and services explicitly.
12 Manage the import, export, validation, and requirements-table dependencies explicitly.
13 Build the application module from this parent POM.

2.3. Create the application POM

Create my-oe4syson-based-app/my-oe4syson-based-app/pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.example</groupId>
        <artifactId>my-oe4syson-based-app-parent</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>

    <artifactId>my-oe4syson-based-app</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency> (1)
        <dependency>
            <groupId>obeo</groupId>
            <artifactId>obeo-cloud-platform-starter</artifactId>
        </dependency> (2)
        <dependency>
            <groupId>fr.obeo.enterprise.syson</groupId>
            <artifactId>oe4syson-frontend</artifactId>
        </dependency> (3)
        <dependency>
            <groupId>fr.obeo.enterprise.syson</groupId>
            <artifactId>oe4syson-ai-chat</artifactId>
        </dependency> (4)
        <dependency>
            <groupId>org.eclipse.syson</groupId>
            <artifactId>syson-sysml-metamodel</artifactId>
        </dependency> (5)
        <dependency>
            <groupId>org.eclipse.syson</groupId>
            <artifactId>syson-sysml-metamodel-edit</artifactId>
        </dependency> (6)
        <dependency>
            <groupId>org.eclipse.syson</groupId>
            <artifactId>syson-application-configuration</artifactId>
        </dependency> (7)
        <dependency>
            <groupId>org.eclipse.syson</groupId>
            <artifactId>syson-sysml-rest-api-services</artifactId>
        </dependency> (8)
        <dependency>
            <groupId>org.eclipse.syson</groupId>
            <artifactId>syson-common-view</artifactId>
        </dependency> (9)
        <dependency>
            <groupId>org.eclipse.syson</groupId>
            <artifactId>syson-diagram-common-view</artifactId>
        </dependency> (10)
        <dependency>
            <groupId>org.eclipse.syson</groupId>
            <artifactId>syson-standard-diagrams-view</artifactId>
        </dependency> (11)
        <dependency>
            <groupId>org.eclipse.syson</groupId>
            <artifactId>syson-diagram-services</artifactId>
        </dependency> (12)
        <dependency>
            <groupId>org.eclipse.syson</groupId>
            <artifactId>syson-tree-explorer-view</artifactId>
        </dependency> (13)
        <dependency>
            <groupId>org.eclipse.syson</groupId>
            <artifactId>syson-tree-services</artifactId>
        </dependency> (14)
        <dependency>
            <groupId>org.eclipse.syson</groupId>
            <artifactId>syson-sysml-import</artifactId>
        </dependency> (15)
        <dependency>
            <groupId>org.eclipse.syson</groupId>
            <artifactId>syson-sysml-export</artifactId>
        </dependency> (16)
        <dependency>
            <groupId>org.eclipse.syson</groupId>
            <artifactId>syson-sysml-validation</artifactId>
        </dependency> (17)
        <dependency>
            <groupId>org.eclipse.syson</groupId>
            <artifactId>syson-table-requirements-view</artifactId>
        </dependency> (18)
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
1 The Spring Boot starter creates the application runtime.
2 The Obeo Cloud Platform starter provides enterprise services, including authentication, authorization, and persistence support.
3 oe4syson-frontend supplies the existing Obeo Enterprise for SysON frontend served by this backend.
4 oe4syson-ai-chat is optional. Declare it only when the application uses Obeo Enterprise for SysON AI chat capabilities.
5 The SysML metamodel dependency provides the SysML v2 model.
6 The SysML metamodel edit dependency provides editing support for that model.
7 The application configuration dependency configures SysON in the Spring application.
8 The REST API services dependency exposes SysON backend operations.
9 The common view dependency provides shared view definitions used by SysON.
10 The diagram common view dependency provides shared diagram view definitions.
11 The standard diagrams view dependency provides the standard SysON diagram definitions.
12 The diagram services dependency provides the backend services for SysON diagrams.
13 The tree explorer view dependency provides the project explorer view definitions.
14 The tree services dependency provides the backend services for the project explorer.
15 The SysML import dependency supports importing SysML content.
16 The SysML export dependency supports exporting SysML content.
17 The SysML validation dependency provides validation rules and services.
18 The table requirements view dependency provides requirements table definitions.

Do not add a Node project, an NPM build, or a separate frontend dependency. The parent POM manages all dependency versions, so this POM does not declare versions for them. If Maven cannot resolve these dependencies, review the repository and credential configuration in Build applications based on Obeo Enterprise for SysON.

3. Create the application entry point

Create src/main/java/com/example/oe4syson/MyOE4SysONBasedApplication.java in the application module:

package com.example.oe4syson; (1)

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication (2)
@ComponentScan(basePackages = {
    "com.example.oe4syson",
    "fr.obeo.ocp",
    "org.eclipse.syson"
}) (3)
public class MyOE4SysONBasedApplication { (4)

    public static void main(String[] args) { (5)
        SpringApplication.run(MyOE4SysONBasedApplication.class, args); (6)
    }
}
1 Replace this package with the base package of your application.
2 Enable Spring Boot configuration and auto-configuration.
3 Discover the application’s components as well as the Obeo Cloud Platform and SysON components, which are outside the application’s package.
4 This class is the application entry point passed to Spring Boot.
5 Java invokes this standard entry-point method when the application starts.
6 Create and start the Spring application context.

4. Configure the application

Create src/main/resources/application.properties in the application module:

(1)
spring.datasource.url=jdbc:postgresql://localhost:5432/my-oe4syson-based-app
spring.datasource.username=dbuser
spring.datasource.password=dbpwd

(2)
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.hibernate.ddl-auto=none
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

(3)
spring.liquibase.change-log=classpath:db/db.changelog-ocp-master.xml

(4)
spring.session.store-type=jdbc
spring.session.jdbc.initialize-schema=never

(5)
liquibase.analytics.enabled=false

(6)
spring.servlet.multipart.max-file-size=256MB
spring.servlet.multipart.max-request-size=256MB

(7)
sirius.components.cors.allowedOriginPatterns=*
sirius.components.cors.allowedCredentials=true

(8)
org.eclipse.syson.customImages.pattern=classpath*:/sysonCustomImages/**

(9)
ocp.enabled=revision-cleaner
ocp.authentication.can-create-new-accounts=true
ocp.documentation.authorization.enabled=false
ocp.role.default=Viewer
ocp.role.server-admin.permissions=Account:list, Account:view, Account:view_activity, Account:create, Account:edit, License:list, License:register, License:edit, License:delete, User:view, Organization:view
ocp.role.administrator.permissions=User:view, User:list_organization_memberships, User:list_owned_organizations, User:list_teams, User:create_project, User:upload_project, Project:list, Project:create, Project:upload, Project:download, Project:rename, Project:delete, Project:edit, Project:duplicate, Project:view, Project:update_visibility, Project:list_webhooks, Project:create_webhook, Project:delete_webhook, Project:list_branches, Project:create_branch, ProjectSettings:view, ProjectSettings#images:view, ProjectSettings#visibility:view, ProjectSettings#webhooks:view, Team:create, Team:edit, Team:view, Team:delete, Team:list, Account:add_team, Organization:add_team, Organization:create_project, Organization:upload_project, Organization:view, Organization:create, Organization:list_teams, Organization:list_members, Organization:invite_members, Organization:remove_member, Organization:edit_member_role, Organization:delete, Organization:list, Organization:list_memberships, OrganizationSettings:view, Library:list, Library:view
ocp.role.contributor.permissions=User:view, User:list_organization_memberships, User:list_teams, User:create_project, User:upload_project, Project:list, Project:create, Project:upload, Project:download, Project:rename, Project:delete, Project:edit, Project:duplicate, Project:view, Project:update_visibility, Project:list_branches, Project:create_branch, ProjectSettings:view, ProjectSettings#images:view, ProjectSettings#visibility:view, ProjectSettings#webhooks:view, Team:create, Team:edit, Team:view, Team:delete, Team:list, Account:add_team, Organization:view, Organization:list_memberships, Library:list, Library:view
ocp.role.viewer.permissions=User:view, User:list_organization_memberships, Project:list, Project:download, Project:view, Project:list_branches, Organization:view, Organization:list_memberships
ocp.role.project.admin.permissions=Project:download, Project:rename, Project:delete, Project:edit, Project:update_visibility, Project:list_webhooks, Project:create_webhook, Project:delete_webhook, Project:list_branches, Project:create_branch, ProjectSettings:view, ProjectSettings#images:view, ProjectSettings#visibility:view, ProjectSettings#webhooks:view
ocp.role.project.write.permissions=Project:download, Project:edit, Project:view, Project:list_branches, Project:create_branch
ocp.role.project.read.permissions=Project:download, Project:view, Project:list_branches

(10)
spring.ai.chat.client.enabled=false
spring.ai.chat.memory.jdbc.initialize-schema=false
spring.ai.chat.memory.repository.jdbc.initialize-schema=never
spring.ai.model.chat=none
spring.ai.model.embedding=none
spring.ai.model.embedding.text=none
spring.ai.model.embedding.multimodal=none
spring.ai.model.image=none
spring.ai.model.audio.transcription=none
spring.ai.model.audio.speech=none
spring.ai.model.moderation=none
spring.ai.mcp.server.annotation-scanner.enabled=true
spring.ai.mcp.server.enabled=false
spring.ai.mcp.server.protocol=STREAMABLE
spring.ai.mcp.server.streamable-http.mcp-endpoint=/mcp
spring.ai.mcp.server.type=SYNC
spring.ai.mcp.server.title=Obeo Enterprise for Sirius - MCP API
spring.ai.mcp.server.version=2026.7.0
spring.ai.mcp.server.transport=WEBMVC

(11)
# Uncomment and replace these example values to enable OpenAI chat.
# spring.ai.model.chat=openai
# spring.ai.openai.chat.model=gpt-5.6-luna
# spring.ai.openai.api-key=YOUR_KEY
1 Configure the PostgreSQL database connection. Replace these values with those of the database used by your application.
2 Use PostgreSQL and prevent Hibernate from creating or modifying the database schema.
3 Use the Obeo Cloud Platform Liquibase changelog to create and evolve the database schema.
4 Store HTTP sessions in the database; Liquibase creates the required schema, so Spring Session must not initialize it again.
5 Disable Liquibase analytics collection.
6 Set the maximum sizes accepted for uploaded files and requests.
7 Allow the frontend to call this backend from permitted origins while including credentials.
8 Discover SysON custom images under src/main/resources/sysonCustomImages.
9 Enable revision cleanup, allow account creation, disable authorization for product documentation, and set Viewer as the default Obeo Cloud Platform role. The remaining ocp.role.*.permissions properties define the standard server, organization, and project roles and their permissions.
10 These optional Spring AI properties keep AI features disabled by default. spring.ai.chat.client.enabled disables the chat client; the two spring.ai.chat.memory. properties prevent Spring AI from initializing a database schema for chat memory; and the spring.ai.model.=none properties disable every supported model type. spring.ai.mcp.server.annotation-scanner.enabled still lets Spring discover annotated MCP components, while spring.ai.mcp.server.enabled=false prevents exposing the MCP endpoint. The remaining spring.ai.mcp.server.* properties define the protocol, endpoint, transport, title, and version to use when it is enabled. Keep these properties when oe4syson-ai-chat is present but AI is not configured. To enable AI chat or the MCP server, declare the optional oe4syson-ai-chat dependency and replace the relevant disabled values with the configuration for the chosen AI provider and deployment.
11 This optional example enables the OpenAI chat model. Uncomment it only after replacing YOUR_KEY with a valid API key and selecting an OpenAI model available to your account. The example values are illustrative.

5. Run the application

From the project root, build the application with the Maven settings file configured in the prerequisite guide:

mvn --settings path/to/your/local/settings.xml clean verify

Then you can run the application built (the result should be a JAR file in the target directory of the my-oe4syson-based-app) with java.

After the application starts, open http://localhost:8080 in a browser. The application serves the frontend supplied by oe4syson-frontend and connects it to the Java backend configured above.