Moving a Java application to Upsun
Back to home
On this page
It is common to have a Java application that you want to migrate to Upsun. Upsun supports several styles of Java application, such as monolith, microservices, stateful, and stateless.
Minimum Requirement
To run a Java application at Upsun you need:
- A supported Java version
- A build management tool
- A Git Repository:
Note
A container application can’t be bigger than 8 GB of memory. For more details, see tuning.
Monolith/Single Application
To start a Java application, you need to understand the Upsun structure. You will need to configure your application, routes, and services.
Application
applications:
app:
type: 'java:<VERSION>'
hooks:
build: [2]
web:
commands:
start: [3]- A Java version, e,g.:
java:21 - Hooks define what happens when building the application. This build process typically generates an executable file such as a uber-jar e.g.:
mvn clean package - The commands key defines the command to launch the application. E.g.:
java -jar file.jar - In the start’s command needs to receive the port where the application will execute thought the
PORTenvironment. That’s best when your app follows the port bind principle. E.g.:java -jar jar --port=$PORT
Note
Be aware that after the build, it creates a read-only system. You have the mount option to create a writable folder.
Route
routes:
"https://{default}/":
type: upstream
upstream: "app:http" [1]
"https://www.{default}/":
type: redirect
to: "https://{default}/"
applications:
app:
type: 'java:<VERSION>'
hooks:
build: [2]
web:
commands:
start: [3]- It defines the application will link in the route, e.g.:
"app:http"
Note
Application instances have a limited amount of memory at build time, which has a maximum of 8 GB.
At runtime that limit depends on the resources you have defined for your application container using upsun resources:set.
A stateless application can be scaled horizontally to multiple application instances with upsun resources:set or by using Varnish in a load balancer configuration.
Microservices
You have the option to use several languages in microservices. If you’re using Java there are several options to aggregate these services into a microservices:
Upsun supports multiple applications and there are two options:
- One application YAML file to each application
- Aggregate all applications in a single file with an
.upsun/config.yamlfile
| Article | Content |
|---|---|
| Microservices in the cloud, part two | Source |
| Microservices in the cloud, part one | Source |
| Multiple Applications | Source |
Configure multi-applications with .upsun/config.yaml |
Source |
Note
You can load balance to some or all applications in the project cluster.
While the table above shows examples for Platform.sh rather than for Upsun, the same rules apply with only slight changes in configuration.
Access to managed services
Upsun provides managed services such as databases, cache and search engines. However, you can use a database or any services such as a transition process, just be aware of the firewall.
When applications need to access a service, it is important to include the relationships key.
By default an application may not talk to any other container without a relationship explicitly allowing access.
To connect to a service from your deployed application, you need to pass the relationships information into your application’s configuration. The way to do so varies with the application. The most common mechanisms are listed below.
Overwrite
If you are using a framework that follows the Twelve-Factor App methodology, particularly the third point, you can configure the application directly from environment variables. Examples of such frameworks include Spring, Eclipse MicroProfile Config, Quarkus, and Micronauts.
Service credentials are available within the PLATFORM_RELATIONSHIPS environment variable. This variable is a base64-encoded JSON object with keys of the relationship name and values of arrays of relationship endpoint definitions.
Upsun supports the jq tool, which allows to extract information from this JSON.
export DB_HOST=`echo $PLATFORM_RELATIONSHIPS | base64 --decode | jq -r ".database[0].host"`| Article | Source |
|---|---|
| Spring Data MongoDB | Source |
| Jakarta EE/MicroProfile Config | Source |
| Spring Data JPA | Source |
| Payara JPA | Source |
Note
While the table above shows examples for Platform.sh rather than for Upsun, the same rules apply with only slight changes in configuration.
To reduce the number of lines in the application file and to make it cleaner,
you have the option to move the variable environment to another file: a .environment file.
E.g.:
export DB_HOST=`echo $PLATFORM_RELATIONSHIPS | base64 --decode | jq -r ".database[0].host"`
export DB_PASSWORD=`echo $PLATFORM_RELATIONSHIPS | base64 --decode | jq -r ".database[0].password"`
export DB_USER=`echo $PLATFORM_RELATIONSHIPS | base64 --decode | jq -r ".database[0].username"`
export DB_DATABASE=`echo $PLATFORM_RELATIONSHIPS | base64 --decode | jq -r ".database[0].path"`
export JDBC=jdbc:postgresql://${HOST}/${DATABASE}
export JAVA_MEMORY=-Xmx$(jq .info.limits.memory /run/config.json)m
export JAVA_OPTS="$JAVA_MEMORY -XX:+ExitOnOutOfMemoryError"This .environment can interact to each application file. E.g.:
applications:
# The app's name, which must be unique within the project.
app:
type: 'java:21'
hooks:
build: ./mvnw package -DskipTests -Dquarkus.package.uber-jar=true
relationships:
database: "db:postgresql"
web:
commands:
start: java -jar $JAVA_OPTS $CREDENTIAL -Dquarkus.http.port=$PORT jarfile.jar