<Property name="additionalAnnotationsForFields" value="org.faktorips.runtime.annotation.IpsGenerated"/>
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 (.ipsproject → IpsArtefaktBuilderSetConfig) 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 */.
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 usingtable.setName(qualifiedName)before callingputTable(table).
-
-
Removed:
IRuntimeRepository.newJAXBContext()(deprecated since 23.6)-
Migration: Use
org.faktorips.runtime.xml.javax.JaxbSupport.newJAXBContext(IRuntimeRepository)ororg.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)ororg.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)ororg.faktorips.runtime.xml.jakarta.JaxbSupport.newJAXBContext(JAXBContext, IRuntimeRepository)instead.
-
-
New:
org.faktorips.runtime.internal.Rangehas a new constructorRange(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_OPENfor the XML attribute marking an open lower bound. -
New: Constant
org.faktorips.runtime.internal.ValueToXmlHelper.XML_ATTRIBUTE_UPPER_BOUND_OPENfor the XML attribute marking an open upper bound. -
Changed:
org.faktorips.runtime.IDeltaComputationOptions::areValuesEqual(Class<?>, String, Object, Object)– The default implementation now treatsNullObjectinstances (e.g.Decimal.NULL) as equal tonulland compares arrays by content (Arrays.deepEquals). Custom overrides of this method are not affected. -
New: Annotation element
cardinalityConfigurableinorg.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>)andwritePolicyLinkCardinalitiesToXml(Element)- hook methods for XML persistence of configured cardinalities. Custom subclasses may override these but should callsuper. -
New: Corresponding hook methods
doInitPolicyLinkCardinalitiesFromXml(Map<String, Element>)andwritePolicyLinkCardinalitiesToXml(Element)inorg.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-xmlmodule have been deprecated. Usefaktorips-runtime-jakarta-xmlinstead.
Removed javax JAXB-Adapter
The following table shows the removed adapter classes and their alternatives in the corresponding Maven modules.
| Removed class | Deprecated since | javax namespace (faktorips-runtime-javax-xml) | jakarta namespace (faktorips-runtime-jakarta-xml) |
|---|---|---|---|
|
23.6 |
|
|
|
23.6 |
|
|
|
23.6 |
|
|
|
23.6 |
|
|
|
23.6 |
|
|
|
23.6 |
|
|
|
23.6 |
|
|
|
23.6 |
|
|
|
23.6 |
Use a custom written adapter instead. |
Use a custom written adapter instead. |
|
23.6 |
|
|
|
23.6 |
|
|
|
23.6 |
|
|
Designtime
-
Removed:
CoreRuntimeExceptionclass (deprecated since 22.6)-
Migration: Use
org.faktorips.devtools.abstraction.exception.IpsExceptioninstead.
-
-
Removed:
IProductCmptPropertyReferenceinterface andProductCmptPropertyReferenceimplementation (deprecated since 22.6)-
Migration: Use
IProductCmptProperty.getCategoryPosition()to access category positioning information directly.
-
-
Removed:
IIpsSrcFile.save(boolean force, IProgressMonitor monitor)and its implementations inIpsSrcFileandLibraryIpsSrcFile(deprecated since 22.6)-
Migration: Use
save(IProgressMonitor)instead. Theforceparameter 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.Noneinstead to check if JAXB support is enabled.
-
-
Removed:
ModelObjectTesterclass (deprecated since 21.6)-
Migration: Use
IpsObjectTypeTester.PROPERTY_IS_MODEL_TYPEproperty tester instead.
-
-
Changed:
org.faktorips.devtools.model.internal.valueset.RangeValueSet- constructor extended withlowerBoundOpenandupperBoundOpenparameters. 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
PersistenceSupportNamesclass instead (e.g.,PersistenceSupportNames.ID_GENERIC_JPA_2).
-
| Removed constants | New constants |
|---|---|
|
|
|
|
|
|
|
|
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
-
productRepositoryis now marked astransientin extensible enums -
Fixed
IpsSrcFileContent.getPropertyFromIpsObjectfor GregorianCalendar -
Text field value is no longer changed while saving
-
Fips-Maven-Build-Plugin no longer steals stdout
-
additionalAnnotationsfrom the.ipsprojectconfiguration are now also generated on classes, interfaces, builder classes, enum types, and enum constants (previously only on methods) -
serialVersionUIDin extensible enums increased from2Lto3L(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
-
validatorfield in policy classes marked astransient -
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)
-
equalsmethods 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
additionalAnnotationsForFieldsare 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