Important
This repository is part of the ADempiere UI Gateway stack — a set of cooperating services that together provide the ADempiere web and gRPC frontend. The migration of all stack repositories from the Systemhaus-Westfalia organization to the ADempiere organization is currently in progress. Until the complete stack has been migrated and validated end-to-end, this repository should be considered under construction. Interfaces and configuration may change without notice. Production use is not yet recommended.
Template repository for organization-specific ADempiere customizations. Fork this repository to add your own Java patches, library dependencies, and localization modules.
adempiere-customizations/
├── base/
│ ├── src/main/java/ ← Your organization's Java classes go here
│ │ Override or extend ADempiere models, processes, validators, etc.
│ │ Use standard ADempiere package names:
│ │ org/compiere/model/, org/adempiere/*, etc.
│ └── build.gradle ← Generic io.github.adempiere library dependencies
│ (applicable to all implementors using this stack)
├── patches/
│ └── build.gradle ← Your organization's specific library dependencies
│ (localization JARs, industry-specific libraries, etc.)
└── [additional modules]/ ← Optional: add further patch modules (see below)
Add your Java source files under base/src/main/java/.
Use standard ADempiere package names — the module name base is a Gradle build identifier
only and does not affect Java package or class naming.
Declare your organization's proprietary or localization libraries in patches/build.gradle
under the dependencies block. A commented example is provided there.
For larger or logically separate patches, add a dedicated module.
Example: adding a patch for org.spin.loan_management.
settings.gradle already includes loan management as an example:
include (':' + rootProject.name + '.investment-and-loan')
project (':' + rootProject.name + '.investment-and-loan').projectDir = file('investment-and-loan')Steps:
- Add a subfolder named
investment-and-loan - Add
api project(':adempiere-customizations.investment-and-loan')in the rootbuild.gradlebelowapi project(':adempiere-customizations.base') - Inside the folder add a
build.gradlemodelled onbase/build.gradle - Change
def packageName = "base"todef packageName = "investment-and-loan" - Add a
src/main/javafolder and place your patch classes there
Add to ~/.gradle/gradle.properties:
deployUsername=YOUR_GITHUB_USERNAME
deployToken=YOUR_GITHUB_PAT_WITH_READ_PACKAGES_SCOPEBuild:
gradle clean buildDEPLOY_PUBLISH_GROUP: Group to publish. Default:io.github.adempiere.
Required whether you use this repo as-is or as a fork.
DEPLOY_PUBLISH_GITHUB_URL: Publish URL. Default:https://maven.pkg.github.com/adempiere/adempiere-customizations. Change this to your own org/repo if you are publishing from a fork.DEPLOY_REPOSITORY: Maven repository URL for downloading packages. Default:https://maven.pkg.github.com/adempiere/adempiere-customizations.DEPLOY_USER: GitHub username with write access to the package repository.DEPLOY_TOKEN: GitHub classic PAT withwrite:packagesscope for the above user.
The adempiere org publishes releases to Maven Central under the group io.github.adempiere.
This is the standard publication policy for this repository.
Implementors publishing from a fork do not need these secrets — GitHub Packages is sufficient.
DEPLOY_PUBLISH_SONATYPE_URL: Sonatype staging URL. Default:https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/.PGP_PASSPHRASE: Passphrase for the GPG signing key.PGP_SECRET: GPG private key (base64-encoded).OSSRH_USERNAME: Sonatype username.OSSRH_TOKEN: Sonatype token.