English Documentation

Release Notes

Version 26.7.0

Faktor-IPS 26.7 brings several important new features: The Faktor-IPS Modeling Tool is now available for the first time as a standalone Rich Client Platform (RCP) application based on Eclipse, specifically designed for modeling work. The generation of .properties files has been switched to UTF-8 encoding. Deprecated API elements from previous versions (21.6 to 24.7) have been removed. Additionally, new features such as configurable cardinalities for policy associations and open interval bounds for value ranges have been introduced.

.properties Files with UTF-8 Encoding

Faktor-IPS now generates .properties files with UTF-8 encoding instead of the previous ISO-8859-1 encoding. This allows special characters and Unicode characters to be used directly in properties files without needing to be escaped as \uXXXX. Existing projects are automatically migrated during the update - old generated properties files are deleted and recreated with the new UTF-8 encoding.

If the Faktor-IPS project is set up so that generated files (derived) are not checked into the source code repository, make sure that the markNoneMergeableResourcesAsDerived setting is set to true. This ensures that the properties files are recreated with the new UTF-8 encoding when running "Clean All Projects". If you have manually edited generated properties files, those changes will be lost during migration. Back up any manual modifications before updating.
Faktor-IPS Modeling Tool

The Faktor-IPS Modeling Tool is a new standalone Rich Client Platform (RCP) application based on Eclipse, specifically designed for working with Faktor-IPS models. It includes Faktor-IPS and the minimal required dependencies, but intentionally ships without a Java compiler and without the Eclipse m2e builder. The tool is aimed at developers who want to use only the Faktor-IPS modeling tool and code generator, while using a different IDE for Java development.

The Faktor-IPS Modeling Tool comes with a dedicated Model Editor perspective providing a clean default layout of views for modeling work. A Git perspective is also included. The existing Product Definitions perspective remains available as well.

The tool is available for download for the following operating systems and architectures:

  • Windows (x86_64)

  • Linux (x86_64, aarch64, ppc64le)

  • macOS (x86_64, Apple Silicon/aarch64)

The kbd:[Ctrl+3] shortcut allows you to quickly search for and invoke commands and IDE functions by typing their name.

Since the Faktor-IPS Modeling Tool does not include a Java compiler, Java-related functions such as "Run JUnit Tests" are present in the menu but will fail with an error when invoked. These functions are not relevant for a pure modeling workflow.
To start the IPS Modeller on macOS, a quarantine attribute currently still needs to be removed. This attribute is automatically added by Gatekeeper to downloaded, unsigned files: xattr -rd com.apple.quarantine <path to faktorips.app>
Improved Validation of Policy Attributes Configured by Products

The validation has been changed to already display a warning in the policy model, if it is configured in a way that makes a valid product configuration impossible. For example, when an attribute is marked as mandatory and its allowed values are restricted to an enumeration - without defining values for that enumeration, making it abstract. If only the attribute’s relevance is marked as configurable in the product, no valid configuration is possible as no values can be added in the product. The relevance field is now also marked with an error highlighting this model misconfiguration.

Range with Specification Whether Interval Boundaries are Included in the Value Range

It is now possible to define whether specified interval boundaries are included in or excluded from a value range at the model and product configuration level. For example, decimal attributes can be configured to allow only positive values (> 0), e.g. (0 …​ *]. The value range user interface has been extended with a checkbox for each of the lower and upper interval boundaries.

Configurable Cardinality for Policy Associations

Policy associations can now be configured so that their minimum and maximum cardinality can be restricted in the product component. This is controlled via a new checkbox on the policy association in the model editor. Policy associations with this flag that are not matched by a product association are now visible in the product editor and their cardinalities can be configured directly. The configured cardinality is validated against the model-defined bounds, the cardinalities of configured product component links are in turn validated against the configured cardinality.

Configured Annotations on All Generated Members

Previously, annotations configured via additionalAnnotations (.ipsprojectIpsArtefaktBuilderSetConfig) were only applied to generated methods, but not to generated classes, interfaces, builder classes, enum types, or enum constants. This issue has been fixed. (see also API Changes)

Additional Annotations for Fields

The new generator property additionalAnnotationsForFields allows the configuration of additional annotations for generated fields and constants. This option works analogously to additionalAnnotations, but applies exclusively to fields and constants marked with /* @generated */.

   <Property name="additionalAnnotationsForFields" value="org.faktorips.runtime.annotation.IpsGenerated"/>

The additionalAnnotationsLocation setting also applies to annotations configured via additionalAnnotationsForFields.

Deprecation of faktorips-runtime-javax-xml

Since all frameworks like Jakarta EE and Spring are using the Jakarta namespace and corresponding current dependencies for a while now, we decided to stop supporting the old javax variant. Use faktorips-runtime-jakarta-xml instead of faktorips-runtime-javax-xml.

The deprecated javax classes have been removed from the faktorips-runtime module and are now only available in the faktorips-runtime-javax-xml module. Older Faktor-IPS versions that use these classes directly from the runtime are therefore not compatible with the 26.7 runtime.

Compatibility

Java

Faktor-IPS 26.7 requires at least Java 21 and has been tested for compatibility with Java 25.

Eclipse

The design time Eclipse plugin requires at least Eclipse 2024-09 and has been tested with that version and all following versions up to and including Eclipse 2026-06.

We currently recommend using Eclipse 2025-06 or later. Eclipse 2025-03 is not recommended due to a false compiler error (JDT Bug #3775).

Maven

For use of the Faktor-IPS Maven plug-ins at least Maven 3.9.9 is required. Using older versions may lead to build errors.

API Changes

This release removes several deprecated API elements that were marked for removal in previous versions. All removed items had been deprecated with @Deprecated(forRemoval = true) for multiple releases.

Runtime
  • Removed: InMemoryRuntimeRepository.putTable(ITable<?> table, String qName) (deprecated since 24.7)

    • Migration: Use putTable(ITable) instead. Set the qualified name directly on the table using table.setName(qualifiedName) before calling putTable(table).

  • Removed: IRuntimeRepository.newJAXBContext() (deprecated since 23.6)

    • Migration: Use org.faktorips.runtime.xml.javax.JaxbSupport.newJAXBContext(IRuntimeRepository) or org.faktorips.runtime.xml.jakarta.JaxbSupport.newJAXBContext(IRuntimeRepository) instead.

  • Removed: AbstractRuntimeRepository.newJAXBContext() (deprecated since 23.6)

    • Migration: Use org.faktorips.runtime.xml.javax.JaxbSupport.newJAXBContext(IRuntimeRepository) or org.faktorips.runtime.xml.jakarta.JaxbSupport.newJAXBContext(IRuntimeRepository) instead.

  • Removed: AbstractRuntimeRepository.newJAXBContext(JAXBContext) (deprecated since 23.6)

    • Migration: Use org.faktorips.runtime.xml.javax.JaxbSupport.newJAXBContext(JAXBContext, IRuntimeRepository) or org.faktorips.runtime.xml.jakarta.JaxbSupport.newJAXBContext(JAXBContext, IRuntimeRepository) instead.

  • New: org.faktorips.runtime.internal.Range has a new constructor Range(String lower, String upper, String step, boolean containsNull, boolean lowerBoundOpen, boolean upperBoundOpen) to support open/closed interval bounds. The existing constructor without these parameters remains available and defaults to closed intervals.

  • New: Constant org.faktorips.runtime.internal.ValueToXmlHelper.XML_ATTRIBUTE_LOWER_BOUND_OPEN for the XML attribute marking an open lower bound.

  • New: Constant org.faktorips.runtime.internal.ValueToXmlHelper.XML_ATTRIBUTE_UPPER_BOUND_OPEN for the XML attribute marking an open upper bound.

  • Changed: org.faktorips.runtime.IDeltaComputationOptions::areValuesEqual(Class<?>, String, Object, Object) – The default implementation now treats NullObject instances (e.g. Decimal.NULL) as equal to null and compares arrays by content (Arrays.deepEquals). Custom overrides of this method are not affected.

  • New: Annotation element cardinalityConfigurable in org.faktorips.runtime.model.annotation.IpsAssociation - marks a policy association as cardinality-configurable. Set automatically by the code generator.

  • New: org.faktorips.runtime.model.type.PolicyAssociation::isCardinalityConfigurable() - indicates whether the cardinality of this association can be restricted in the product.

  • New: org.faktorips.runtime.internal.ProductComponent::doInitPolicyLinkCardinalitiesFromXml(Map<String, Element>) and writePolicyLinkCardinalitiesToXml(Element) - hook methods for XML persistence of configured cardinalities. Custom subclasses may override these but should call super.

  • New: Corresponding hook methods doInitPolicyLinkCardinalitiesFromXml(Map<String, Element>) and writePolicyLinkCardinalitiesToXml(Element) in org.faktorips.runtime.internal.ProductComponentGeneration.

  • Changed: org.faktorips.runtime.model.type.ProductCmptType::validate() - now validates that the configured cardinality in the product does not exceed the model-defined bounds.

  • Deprecated: All classes in the faktorips-runtime-javax-xml module have been deprecated. Use faktorips-runtime-jakarta-xml instead.

Removed javax JAXB-Adapter

The following table shows the removed adapter classes and their alternatives in the corresponding Maven modules.

Table 1. Migration table for deprecated JAXB adapter classes
Removed class Deprecated since javax namespace (faktorips-runtime-javax-xml) jakarta namespace (faktorips-runtime-jakarta-xml)

org.faktorips.runtime.internal.AbstractJaxbModelObject

23.6

org.faktorips.runtime.xml.javax.AbstractJaxbModelObject

org.faktorips.runtime.xml.jakarta.AbstractJaxbModelObject

org.faktorips.runtime.xml.IpsJAXBContext

23.6

org.faktorips.runtime.xml.javax.IpsJAXBContext

org.faktorips.runtime.xml.jakarta.IpsJAXBContext

org.faktorips.runtime.xml.LocalDateAdapter

23.6

org.faktorips.runtime.xml.javax.LocalDateAdapter

org.faktorips.runtime.xml.jakarta.LocalDateAdapter

org.faktorips.runtime.xml.LocalDateTimeAdapter

23.6

org.faktorips.runtime.xml.javax.LocalDateTimeAdapter

org.faktorips.runtime.xml.jakarta.LocalDateTimeAdapter

org.faktorips.runtime.xml.LocalTimeAdapter

23.6

org.faktorips.runtime.xml.javax.LocalTimeAdapter

org.faktorips.runtime.xml.jakarta.LocalTimeAdapter

org.faktorips.runtime.xml.MonthAdapter

23.6

org.faktorips.runtime.xml.javax.MonthAdapter

org.faktorips.runtime.xml.jakarta.MonthAdapter

org.faktorips.runtime.xml.MonthDayAdapter

23.6

org.faktorips.runtime.xml.javax.MonthDayAdapter

org.faktorips.runtime.xml.jakarta.MonthDayAdapter

org.faktorips.runtime.xml.ProductConfigurationXmlAdapter

23.6

org.faktorips.runtime.xml.javax.ProductConfigurationXmlAdapter

org.faktorips.runtime.xml.jakarta.ProductConfigurationXmlAdapter

org.faktorips.values.AnyTypeAdapter

23.6

Use a custom written adapter instead.

Use a custom written adapter instead.

org.faktorips.values.DecimalXmlAdapter

23.6

org.faktorips.runtime.xml.javax.DecimalAdapter

org.faktorips.runtime.xml.jakarta.DecimalAdapter

org.faktorips.values.GregorianCalendarXmlAdapter

23.6

org.faktorips.runtime.xml.javax.GregorianCalendarAdapter

org.faktorips.runtime.xml.jakarta.GregorianCalendarAdapter

org.faktorips.values.MoneyXmlAdapter

23.6

org.faktorips.runtime.xml.javax.MoneyAdapter

org.faktorips.runtime.xml.jakarta.MoneyAdapter

Designtime
  • Removed: CoreRuntimeException class (deprecated since 22.6)

    • Migration: Use org.faktorips.devtools.abstraction.exception.IpsException instead.

  • Removed: IProductCmptPropertyReference interface and ProductCmptPropertyReference implementation (deprecated since 22.6)

    • Migration: Use IProductCmptProperty.getCategoryPosition() to access category positioning information directly.

  • Removed: IIpsSrcFile.save(boolean force, IProgressMonitor monitor) and its implementations in IpsSrcFile and LibraryIpsSrcFile (deprecated since 22.6)

    • Migration: Use save(IProgressMonitor) instead. The force parameter was always ignored and is no longer needed.

  • Removed: ProductCmptType.migrateReferences() (deprecated since 22.6)

    • Migration: This method was only needed for one-time migration to Faktor-IPS 22.6 and is no longer required.

  • Removed: GeneratorConfig.isGenerateJaxbSupport() (deprecated since 23.6)

    • Migration: Use getJaxbSupport() != JaxbSupportVariant.None instead to check if JAXB support is enabled.

  • Removed: ModelObjectTester class (deprecated since 21.6)

    • Migration: Use IpsObjectTypeTester.PROPERTY_IS_MODEL_TYPE property tester instead.

  • Changed: org.faktorips.devtools.model.internal.valueset.RangeValueSet - constructor extended with lowerBoundOpen and upperBoundOpen parameters. The existing constructor without these parameters remains available and defaults to closed intervals.

  • New: org.faktorips.devtools.model.valueset.IRangeValueSet::isLowerBoundOpen() - returns whether the lower bound is open (exclusive).

  • New: org.faktorips.devtools.model.valueset.IRangeValueSet::isUpperBoundOpen() - returns whether the upper bound is open (exclusive).

  • New: org.faktorips.devtools.model.valueset.IRangeValueSet::setLowerBoundOpen(boolean) - sets whether the lower bound is open (exclusive).

  • New: org.faktorips.devtools.model.valueset.IRangeValueSet::setUpperBoundOpen(boolean) - sets whether the upper bound is open (exclusive).

The new methods isLowerBoundOpen(), isUpperBoundOpen(), setLowerBoundOpen(boolean) and setUpperBoundOpen(boolean) have been added to the IRangeValueSet interface. Custom implementations of this interface must implement these methods.
  • New: Interface org.faktorips.devtools.model.productcmpt.IPolicyCmptLinkCardinality - represents the cardinality of a policy association as configured in the product.

  • New: org.faktorips.devtools.model.pctype.IPolicyCmptTypeAssociation::isCardinalityConfigurable() - indicates whether the cardinality of this association can be restricted in the product.

  • New: org.faktorips.devtools.model.pctype.IPolicyCmptTypeAssociation::setCardinalityConfigurable(boolean) - sets the configurable cardinality flag.

  • New: org.faktorips.devtools.model.productcmpt.IProductCmptLink::isCardinalityConfigurable(IIpsProject) - indicates whether the cardinality of the matching policy association can be restricted in the product.

  • New: org.faktorips.devtools.model.productcmpt.IProductCmptLinkContainer::getPolicyCmptLinkCardinalites() - returns all configured cardinalities for policy associations.

  • New: org.faktorips.devtools.model.productcmpt.IProductCmptLinkContainer::getPolicyCmptLinkCardinality(String) - returns the configured cardinality for a policy association.

  • New: org.faktorips.devtools.model.productcmpt.IProductCmptLinkContainer::isContainerFor(IPolicyCmptTypeAssociation) - returns whether this container is the right one for the given policy association - this is mainly used to decide whether an association is configured on a product or an adaptor stage/generation.

  • New: org.faktorips.devtools.model.productcmpt.IProductCmptLinkContainer::newPolicyCmptLinkCardinality(String) - creates a new configured cardinality for a policy association.

  • New: org.faktorips.devtools.model.productcmpt.IProductCmptLinkContainer::getMaxCardinality(IPolicyCmptTypeAssociation) - returns the configured maximum cardinality if present, otherwise the model cardinality.

  • New: org.faktorips.devtools.model.productcmpt.IProductCmptLinkContainer::getMinCardinality(IPolicyCmptTypeAssociation) - returns the configured minimum cardinality if present, otherwise the model cardinality.

Persistence
  • Removed: Persistence provider ID constants from provider classes (deprecated since 21.12):

    • GenericJPA2PersistenceProvider.ID_GENERIC_JPA_2

    • GenericJPA2_1PersistenceProvider.ID_GENERIC_JPA_2_1

    • EclipseLink1PersistenceProvider.ID_ECLIPSE_LINK_1_1

    • EclipseLink25PersistenceProvider.ID_ECLIPSE_LINK_2_5

    • Migration: Use the corresponding constants from PersistenceSupportNames class instead (e.g., PersistenceSupportNames.ID_GENERIC_JPA_2).

Table 2. Migration table for deprecated persistence constants
Removed constants New constants

GenericJPA2PersistenceProvider.ID_GENERIC_JPA_2

PersistenceSupportNames.ID_GENERIC_JPA_2

GenericJPA2_1PersistenceProvider.ID_GENERIC_JPA_2_1

PersistenceSupportNames.ID_GENERIC_JPA_2_1

EclipseLink1PersistenceProvider.ID_ECLIPSE_LINK_1_1

PersistenceSupportNames.ID_ECLIPSE_LINK_1_1

EclipseLink25PersistenceProvider.ID_ECLIPSE_LINK_2_5

PersistenceSupportNames.ID_ECLIPSE_LINK_2_5

Generated Code

The newRangeInstance(…​) method in the following classes has been extended with two additional JavaCodeFragment parameters lowerBoundOpen and upperBoundOpen. Custom implementations of this method must be updated accordingly.

  • org.faktorips.codegen.DatatypeHelper

  • org.faktorips.codegen.dthelpers.AbstractDatatypeHelper

  • org.faktorips.codegen.dthelpers.BigDecimalHelper

  • org.faktorips.codegen.dthelpers.DateHelper

  • org.faktorips.codegen.dthelpers.DecimalHelper

  • org.faktorips.codegen.dthelpers.DoubleHelper

  • org.faktorips.codegen.dthelpers.IntegerHelper

  • org.faktorips.codegen.dthelpers.ListOfValueDatatypeHelper

  • org.faktorips.codegen.dthelpers.LongHelper

  • org.faktorips.codegen.dthelpers.MoneyHelper

In the Java code for extensible enumerations, the field IRuntimeRepository productRepository is now transient. The serialVersionUID in generated extensible enumerations has been increased from 2L to 3L.

For each policy association with cardinalityConfigurable = true, the following methods are generated on the product component or generation:

  • getCardinalityFor<AssociationName>(): IntegerRange - returns the configured cardinality.

  • setCardinalityFor<AssociationName>(IntegerRange) - sets the configured cardinality.

In the Java code for policy classes that generate a separate validator class (generateValidatorClass) and have no superclass, the validator field is now transient. The serialVersionUID in these generated policy classes has been increased from 1L to 2L.

Fixed Bugs

  • ProductAttribute#setValue throws an exception for an overridden attribute with the "hide" flag set

  • Test folders are no longer written to the generated MANIFEST.MF

  • Table export now has an option to export enums in the "Name (ID)" format

  • Fixed Javadoc generation using wrong line breaks for multiline descriptions

  • Added target platform support for Eclipse 2026-03

  • Fixed runtime module-infos

  • Fixed validation of JPA foreign key names

  • productRepository is now marked as transient in extensible enums

  • Fixed IpsSrcFileContent.getPropertyFromIpsObject for GregorianCalendar

  • Text field value is no longer changed while saving

  • Fips-Maven-Build-Plugin no longer steals stdout

  • additionalAnnotations from the .ipsproject configuration are now also generated on classes, interfaces, builder classes, enum types, and enum constants (previously only on methods)

  • serialVersionUID in extensible enums increased from 2L to 3L (see Generated Code)

  • IpsBuild generates special characters incorrectly

  • Misleading "not a subset" validation message for invalid product range

  • In table structures the same attribute can be added multiple times

  • More than one ID equal to null leads to unreadable EnumContent

  • MultipleValues attributes in the product model have a default value of null

  • validator field in policy classes marked as transient

  • A mandatory ConfiguredValueSet includes null

  • Table export in "Name (ID)" format fails when EnumType and EnumContent are in separate projects

  • Cleaned up runtime module-infos (removed stale, already-deleted packages)

  • equals methods for composite keys: The && operator was incorrectly placed at the end of the line instead of the beginning of the next line

  • When the parameter "Minimal Javadoc" is enabled and the validation rule has a documentation, no empty <p> block is generated in the Javadoc anymore

  • Faktorips-Maven-Plugin: Fixed "return code=13" error on second build

  • Switching between adaptor stages fails after activating a validation rule

  • Annotations configured via additionalAnnotationsForFields are no longer incorrectly generated on classes

  • NPE in IPS validation when JAR contains no MANIFEST.MF

Additional Functions and Improvements

  • When importing and exporting tables with enum columns, enum values can now optionally be displayed in the format "Name (ID)" (e.g., "Yearly (1)") instead of just the ID (e.g., "1"). During import, an error message is displayed if the "Name (ID)" format is detected but the option is not enabled.

  • Range with specification whether interval boundaries are included in the value range

  • Null-Equality improvement in IDeltaComputationOptions.areValuesEqual