Configuration v2.3.6.1
All docs

Javlo2 — Configuration

Complete reference for the three configuration layers: Maven build properties, the webapp_config.properties bridge file, and the static-config.properties runtime configuration.

Javlo2 uses three configuration layers that are applied at different stages:

Configuration layers
LayerFileWhen appliedPurpose
1 — Maven pom.xml / CLI -D Build time Embeds build metadata and deployment-environment paths into the WAR.
2 — Bridge src/main/config/webapp_config.properties Build time (filtered) Maven placeholders resolved and written to WEB-INF/config/webapp_config.properties inside the WAR.
3 — Runtime static-config.properties Server startup All operational settings: folders, security, mail, cache, URLs. Lives outside the WAR on the server.

Folder variables #

Path values in static-config.properties support the following token substitutions:

TokenResolved to
$HOME / ~Home directory of the OS user running Tomcat.
$JAVLO_HOMEValue of the JAVLO_HOME environment variable.
$CATALINA_HOMEValue of the CATALINA_HOME environment variable.

Paths that do not start with / or a token are treated as relative to the webapp root when data-folder-relative=true (the default).

Maven build & WAR packaging #

The default active profile is webapp, which packages a javlo.war file. During the process-resources phase, Maven:

Profiles

ProfileDefaultOutputDescription
webappyesjavlo.warStandard web application. Activates resource filtering and WAR packaging.
corenojavlo-core.jarProduces a plain JAR for embedding Javlo as a library.
securitychecknoRuns OWASP dependency-check during verify.

Build commands

# Standard WAR build mvn package # Pass deployment properties on the CLI mvn package \ -Dconfig.relative=false \ -Dconfig.dir=/opt/javlo/config \ -Djavlo.god=admin,<SHA1-password> # Security audit mvn verify -P securitycheck

buildnumber-maven-plugin

The buildnumber-maven-plugin generates ${buildNumber} from the Git SCM during the validate phase. The resulting string is written into webapp_config.properties as product.version.

# Format: Rev={7-char-git-hash} BuildTime={yyyy-MM-dd--HH-mm-ss} product.version=Rev=c1e1d99 BuildTime=2026-03-25--08-44-09 # Falls back to "NO-GIT" when git is not available

webapp_config.properties #

src/main/config/webapp_config.properties → WEB-INF/config/webapp_config.properties (in WAR)

This file is the bridge between the Maven build and the running webapp. It is processed by Maven resource filtering — every ${token} is replaced at build time.

# Source file — tokens replaced by Maven at build time product.version=${buildNumber} static-config.relative=${config.relative} static-config.directory=${config.dir} edit.users=${javlo.god}
Key (in WAR)Maven propertyDefaultDescription
product.version ${buildNumber} NO-GIT … Build identifier generated by buildnumber-maven-plugin. Read-only — shows in the admin interface.
static-config.relative ${config.relative} true true = the path in static-config.directory is relative to the webapp root. false = absolute OS path.
static-config.directory ${config.dir} /WEB-INF/config Directory where static-config.properties is stored. Can also be set via the JAVLO_HOME environment variable (takes priority).
edit.users ${javlo.god} admin / admin Bootstrap admin credentials in the format login,SHA1password;login2,SHA1password2. Used only if not overridden in static-config.properties. If the placeholder ${…} is not replaced, defaults to admin/admin.
SHA-1 password encoding: Use echo -n "mypassword" | sha1sum | awk '{print $1}' | xxd -r -p | base64 or any SHA-1 + Base64 tool. The default hash for admin is 0DPiKuNIrrVmD8IUCuw1hQxNqZc=.

static-config.properties — location & loading #

StaticConfig is a singleton stored in the ServletContext. It is loaded once at startup via StaticConfig.getInstance(ServletContext). The file is resolved in priority order:

Resolution order
PrioritySourcePath
1 (highest)Environment variable$JAVLO_HOME/static-config.properties
2webapp_config.properties key{static-config.directory}/static-config.properties
3 (default)Built-in fallbackWEB-INF/config/static-config.properties

A sample file is provided at src/main/webapp/WEB-INF/config/static-config__SAMPLE__.properties. If no file is found, all settings fall back to their hardcoded defaults.

Primary settings #

static-config.properties
KeyDefaultDescription
default-cms-namejavloName of the CMS instance shown in the admin interface.
default-contextdefault.javlo.orgContext used to initialise a new host that has no existing context.
master-contextadminContext with super-admin privileges (can manage other contexts).
deploy.envdevDeployment environment: local, dev, pprod, or prod. Affects caching and compression.
deploy.infrabackback (editing + serving) or front (serving only, DMZ).
deploy.compress-jspfalseMinify generated JSP in production mode.
edit.usersadmin / adminBootstrap admin accounts. Format: login,SHA1pwd;login2,SHA1pwd2. Overrides webapp_config.properties value if set here.
site.emailwebmaster@javlo.orgDefault site contact email (used in alerts and automated messages).
site.help-urlhttp://help.javlo.orgBase URL for contextual help links in the admin.
default-date-formatdd/MM/yyyyDefault date format used in admin and as fallback for contexts.
calendar.zoneEurope/BrusselsDefault timezone for date/time operations.
locale.countrybeDefault locale country code.
instance-nameOS usernameHuman-readable name for this server instance (shown in error mails).
synchro-codeShared secret for DMZ ↔ back synchronisation and remote status checks.
auto-creationfalseAutomatically create a context when an unlisted domain hits the server.
image.max-width0Maximum width (px) for uploaded images. 0 = no reduction.

Folder paths #

All paths are relative to the webapp root when data-folder-relative=true. Use $HOME, $JAVLO_HOME, or $CATALINA_HOME for absolute paths outside the webapp.

In most single-server deployments the defaults work without change. The most important folder to customise is data-folder — point it outside the webapp so data survives WAR redeployments.
KeyDefaultDescription
data-folder/WEB-INF/data-ctxRoot of all site data: content, files, users, tracking. Persist this folder.
data-folder-relativetruetrue = relative to webapp root. false = absolute OS path.
data-folder-randomfalseAppend a random ID to each site's data folder (extra isolation).
context-folder/WEB-INF/contextGlobal context metadata (languages, aliases, mailing settings).
template-folder/WEB-INF/templateWebsite templates root. See Template docs.
mailing-template-folder/WEB-INF/mailing/todoMailing queue folder.
mailing-history.folder/WEB-INF/mailing/historyCompleted mailings archive.
thread-folder/WEB-INF/threadInternal background-job state.
trash-folder/WEB-INF/.trashGlobal trash (used when a context ZIP is uploaded with download.clean-data-folder=true).
share-folder/WEB-INF/share-folderFiles shared across all sites on this instance.
external-components-folderexternal-componentsDynamic components installed outside the template.
backup-folderbackupSubfolder name inside each site's data folder for backups.
temp-web-folder/web-tmpTemporary web-accessible folder.

Security & users #

KeyDefaultDescription
security.encrypt-passwordtrueStore user passwords as SHA-1 hashes.
security.highfalseEnables high-security mode: stricter limits, disables some features.
security.use-httpsfalseForce HTTPS redirect for all requests.
security.secret-key???Secret key for symmetric encryption. Change this in production.
security.default-passwordchangemeDefault password assigned to newly created users.
security.change-passwordtrueForce users to change their password on first login.
security.login.max-error-hour100Maximum failed login attempts per IP per hour before blocking. 10 in high-security mode.
security.remote-loginfalseAllow login from remote applications via token.
security.login.tokenfalseEnable token-based login (API / MCP).
security.rest-servlettrueEnable the REST/remote API servlet. Automatically false in high-security mode.
security.header.xsstrueEmit X-XSS-Protection: 1; mode=block header.
security.oauth.viewfalseEnable Google OAuth login on the public site.
security.oauth.google-id-clientGoogle OAuth client ID.
security.oauth.google-secretGoogle OAuth client secret.
security.application-loginApplication-level login for inter-service authentication.
security.application-passwordApplication-level password.
security.password.regular-expression.+Password validation regex shown to users.
user_rolesguest;member;mailingAvailable user roles, semicolon-separated.
adminuserfactory.classorg.javlo.user.AdminUserFactoryClass responsible for admin user management. Override for LDAP.

LDAP

KeyDefaultDescription
ldap.provider-urlLDAP server URL (e.g. ldap://ldap.example.com:389/).
ldap.security.principalBind DN for LDAP authentication.
ldap.security.credentialsBind password.
ldap.security.loginLogin DN template. Use #login# as placeholder for the username.

Mail / SMTP #

KeyDefaultDescription
mail.smtp.hostrequiredSMTP server hostname.
mail.smtp.port25SMTP port (use 587 for STARTTLS, 465 for SSL).
mail.smtp.userSMTP authentication username.
mail.smtp.passwordSMTP authentication password.
mail.default.senderDefault From address for all outgoing mail.
mail.default.reportAddress for error/exception reports.
mail.default.subjectDefault subject prefix for system mails.
mailing.threadtruefalse if a DMZ front-end handles the mailing queue instead.
mailing.trackingtrueTrack mailing open/click events.
mailing.time-between-two-mailing.second360Minimum seconds between two separate mailing batches.
mailing.time-between-two-send.second70Delay in seconds between individual email sends within a batch.
mailing.feedback.classDefaultMailingFeedbackFeedback handler class (comma-separated list for multiple handlers).

Cache & backup #

Page & resource cache

KeyDefaultDescription
cache.max-size10 000Maximum number of entries in the page cache.
cache.max-time86 400 sPage cache TTL (1 day).
cache.linked-page30 sCache TTL for inter-page link resolution.
resources.cache-time86 400 sCache-Control max-age sent for static resources.

Backup threads

KeyDefaultDescription
backup.interval86 400 sFull site backup interval. 0 = disabled.
backup.count.db7Number of database backup copies to keep.
backup.interval.db86 400 sDatabase backup interval.
backup.count.users120Number of user-file backup copies to keep.
backup.interval.users7 200 sUser-file backup interval.
backup.exclude-patterns/backup;/static;…Semicolon-separated path patterns excluded from the backup archive.

URL & navigation #

KeyDefaultDescription
url.host-define-sitetruetrue = hostname determines the site context. false = first URL segment determines the context.
url.viewfalsePrefix public URLs with /view.
url.contexttrueInclude the context name in the URL.
url.redirect-secondary-urltrue301-redirect non-canonical URLs to the canonical URL.
url.jsessionidfalseAppend jsessionid to URLs (disable for SEO).
url.short.size3Number of characters for short-URL codes.
url.domain-no-contextComma-separated domains that bypass context-path detection.
navigation.url.max-size140Maximum character length for generated page slugs.
sitemap.maxsite12 582 912 BMaximum sitemap.xml file size (12 MB).
sitemap.news-days2Number of past days included in the Google News sitemap.

Deploy & logging #

Logging

KeyDefaultLevels
log.all.levelINFOGlobal log level override for all Javlo loggers.
log.access.levelINFOAccessServlet log level.
log.navigation.levelINFONavigation / MenuElement log level.
log.login.levelINFOLogin log level.
log.component.all.levelINFOAll component classes.
log.synchroINFOSynchronisation process.
log.file../../logs/catalina.outPath to the Tomcat log file read by the LogService module.
log.dir/../../logs/Log directory for access-log rotation.
debug.idInstance identifier in debug emails.

Available levels: SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST

Advanced #

Image

KeyDefaultDescription
image.max-width0Resize uploaded images to this max width (px). 0 = no resize.
image.short-urlfalseUse short URL codes for image requests.
image.webp.encoderPath to an external WebP encoder binary.
image.auto-focustrueAuto-detect focal point for smart cropping.

Search engine

KeyDefaultDescription
searchengine.classLuceneSearchEngineFull class name of the search engine implementation.
searchengine.lucene.patternlevel3:{Q}^3 …Lucene query boosting pattern ({QUERY} placeholder).

External services

KeyDescription
shared.pixabay.keyPixabay API key for stock image search in the media library.
shared.freepik.keyFreepik API key.
dropbox.app-key / .app-secretDropbox integration credentials.
proxy.host / proxy.portHTTP proxy for outgoing requests (defaults to JVM system proxy).

Content

KeyDefaultDescription
content.edit-repeattrueAllow editing of inherited repeated components on child pages.
content.integrity-checkertrueRun link integrity checks in preview mode.
content.extensionhtml,pdf,png,…Comma-separated list of valid page content extensions.
content.undo-depthNumber of undo steps. null = unlimited.
function.undofalseEnable the undo function in the editor.

Tomcat deployment #

The recommended production layout keeps all mutable data (data-folder, context-folder, template-folder) outside the Tomcat webapps/ directory so they are not overwritten on WAR redeployment.

Recommended directory layout

# Tomcat root $CATALINA_HOME/ ├── webapps/ │ └── ROOT/ # or javlo.war expanded here │ └── WEB-INF/ │ └── config/ │ └── webapp_config.properties # generated by Maven │ └── javlo-data/ # outside webapps — survives redeploys ├── config/ │ └── static-config.properties ├── data-ctx/ # data-folder ├── context/ # context-folder └── template/ # template-folder

Corresponding static-config.properties

data-folder-relative=false data-folder=$CATALINA_HOME/javlo-data/data-ctx context-folder=$CATALINA_HOME/javlo-data/context template-folder=$CATALINA_HOME/javlo-data/template

Pointing the webapp to an external config directory

Set the Maven property at build time (or in the WAR's webapp_config.properties):

mvn package \ -Dconfig.relative=false \ -Dconfig.dir=$CATALINA_HOME/javlo-data/config

Or set the environment variable before starting Tomcat:

# setenv.sh (Linux) or setenv.bat (Windows) export JAVLO_HOME=/opt/javlo-data/config

Minimum production checklist

SettingRecommended value
deploy.envprod
security.secret-keyRandom 32+ char string
security.default-passwordStrong random value
security.use-httpstrue
data-folderAbsolute path outside webapps/
edit.usersChange default admin credentials
mail.smtp.hostYour SMTP relay
synchro-codeRandom secret if using DMZ