This document outlines the migration process from ICM 7.10 to ICM 11. It includes the automated steps performed by the migration tool, as well as the manual steps required afterward.
Note: The following markers are used in the commands below:
$ICM: A symbolic marker for the root directory of your ICM 7.10 project$ICM_11: A symbolic marker for the root directory of the ICM 11+ project template
Retrieve the ICM 11 customization template and follow the prerequisite steps.
Use the customization template to create the initial project structure.
As a result, the following files are created:
build.gradle.kts - root build script to configure subprojects (cartridges)
versions and versions_test)my_* directories containing example cartridges for different purposesft_production directory defines the cartridge set of productionft_test directory defines the test cartridge set for server tests (mostly test data)To ensure the following migration bases on a working template, verify the following:
gradlew compileTestJava
export ICM_11="$PWD"
To prepare the ICM branch:
.git folder)export ICM="$PWD"
git checkout -b feature/migration-to-11
rsync -av --exclude='.git' "$ICM_11/" "$ICM/"
Note: When command
rsyncis not available on your system, you can copy the content using any available
file copy command. Just make sure to exclude the.gitfolder.
The automated steps for migrating from 7.10 to 11 are defined in the path: src/main/resources/migration/001_migration_7x10_to_11.
This results in the following parameters for the Gradle task:
project for a single project or projects for all projects). This parameter is only required for the migrateOne task.$ICM, if defined as described above).src/main/resources/migration/001_migration_7x10_to_11).Example command:
gradlew migration:migrateAll -Ptarget=$ICM -Psteps=src/main/resources/migration/001_migration_7x10_to_11
Note:
{cartridgeName}is a placeholder and will be replaced by the name of the cartridge to be migrated.
Migrator: RemoveAssembly
Migrator: MoveFolder
Moves all static files to their new locations within the ICM 11 structure:
edl -> src/main/resources/resources/{cartridgeName}/edlstaticfiles/cartridge/components -> src/main/resources/resources/{cartridgeName}/componentsstaticfiles/cartridge/config -> src/main/resources/resources/{cartridgeName}/configstaticfiles/cartridge/extensions -> src/main/resources/resources/{cartridgeName}/extensionsstaticfiles/cartridge/impex -> src/main/resources/resources/{cartridgeName}/impexstaticfiles/cartridge/lib/resources/com -> src/main/resources/comstaticfiles/cartridge/lib/resources/tests -> src/test/resources/testsstaticfiles/cartridge/lib/resources/{cartridgeName}/dbinit -> src/main/resources/resources/{cartridgeName}/dbinitstaticfiles/cartridge/lib/resources/{cartridgeName}/dbmigrate-> src/main/resources/resources/{cartridgeName}/dbmigratestaticfiles/cartridge/localizations -> src/main/resources/resources/{cartridgeName}/localizationsstaticfiles/cartridge/logback -> src/main/resources/resources/{cartridgeName}/logbackstaticfiles/cartridge/naming -> src/main/resources/resources/{cartridgeName}/namingstaticfiles/cartridge/objectgraph -> src/main/resources/resources/{cartridgeName}/objectgraphstaticfiles/cartridge/pagelets -> src/main/resources/resources/{cartridgeName}/pageletsstaticfiles/cartridge/pipelines -> src/main/resources/resources/{cartridgeName}/pipelinesstaticfiles/cartridge/queries -> src/main/resources/resources/{cartridgeName}/queriesstaticfiles/cartridge/templates -> src/main/isml/{cartridgeName}staticfiles/cartridge/webforms -> src/main/resources/resources/{cartridgeName}/webformsstaticfiles/share/sites -> src/main/resources/resources/{cartridgeName}/sitesstaticfiles/share/system/config/cartridges -> src/main/resources/cartridgesstaticfiles/share/system/config/cluster -> src/main/resources/resources/{cartridgeName}/config/clusterstaticfiles/share/system/config/domains -> src/main/resources/resources/{cartridgeName}/config/domainsstaticfiles/share/system/config/apps -> src/main/resources/resources/{cartridgeName}/config/appsThe following directories remain intentionally unchanged:
staticfiles/cartridge/staticstaticfiles/cartridge/urlrewriteMigrator: MoveFiles
Moves specific files to their new locations within the ICM 11 structure:
staticfiles/cartridge/directCustomAttributes.xml -> src/main/resources/resources/{cartridgeName}/directCustomAttributes.xmlstaticfiles/share/system/config/cluster/domainsplittings.xml -> src/main/resources/resources/{cartridgeName}/config/domainsplittings.xmlstaticfiles/share/system/config/cluster/urlrewriterules.xml -> src/main/resources/resources/{cartridgeName}/config/urlrewriterules.xmlstaticfiles/share/system/config/cluster/configuration.xml -> src/main/resources/resources/{cartridgeName}/config/configuration.xmlstaticfiles/share/system/config/cluster/replication.xml -> src/main/resources/resources/{cartridgeName}/replication/replication.xmlMigrator: MoveFilteredFolder
Moves Java source code and pipelet XML files to their appropriate locations in the ICM 11 structure:
javasource -> src/main/java (Java source files)javasource -> src/main/resources (only XML files matching pattern ^.*\\pipelet\\.*\.xml$)This step ensures that:
resources directory while maintaining their relative path structureMigrator: ConvertBuildGradle
build.gradle files to match ICM 11 requirementsMigrator: ConvertToCartridgeDependency
build.gradle filescom.intershop.platformcom.intershop.contentcom.intershop.businesscom.intershop.b2bMigrator: RenamedDependency
Renames dependencies in build.gradle files:
commons-lang:commons-lang -> org.apache.commons:commons-lang3commons-collections:commons-collections -> org.apache.commons:commons-collections4com.intershop.common:encryption -> com.intershop:encryptionjavax.ws.rs:javax.ws.rs-api -> jakarta.ws.rs:jakarta.ws.rs-apiMigrator: RemovedDependency
Removes dependencies that are no longer needed in ICM 11:
com.intershop.business:ac_inventory_serviceMigrator: MoveFiles
Moves database initialization and migration properties files (starting with migration or dbinit) to the new location:
staticfiles/cartridge -> src/main/resources/resources/{cartridgeName}Migrator: MigrateConfigResources
Updates configuration resources to the ICM 11 format
Migrator: MigrateVersionFiles
*.version files to versions/build.gradleMigrator: AddSiteContentPreparer
Injects SiteContentPreparer into site dbinit.properties
Migrator: RenamedPackages
Renames packages in Java and ISML source files:
commons-lang:commons-lang -> org.apache.commons:commons-lang3commons-collections:commons-collections -> org.apache.commons:commons-collections4com.intershop.sellside.rest.common.patch.PATCH -> jakarta.ws.rs.PATCHjavax.ws.rs -> jakarta.ws.rsjavax.mail -> jakarta.mailjavax.xml.bind -> jakarta.xml.bindjavax.validation -> jakarta.validationjavax.servlet -> jakarta.servletjavax.annotation -> jakarta.annotationMigrator: RemoveFiles
Removes files that are no longer needed in ICM 11:
*.version files (version information is now stored in a central location)build.gradle and settings.gradle files (replaced by a customization template)Migrator: CreateEnvironmentExampleFiles
Creates or replaces the following example files in the project root with environment-specific content:
environment.bat.example:
migration/src/main/resources/environment/environment.bat.example.template<rootProject.name in settings.gradle.kts> will be replaced by the value of rootProject.name in settings.gradle.kts, for example: "prjzz-icm"<ishprjxxacr> will be replaced by the value of dockerRegistry in gradle.properties, for example: "ishprjzzacr.azurecr.io"icm.properties.example:
migration/src/main/resources/environment/icm.properties.example.template<rootProject.name in settings.gradle.kts> will be replaced by the value of rootProject.name in settings.gradle.kts, for example: "prjzz-icm"clean.bat:
migration/src/main/resources/environment/clean.bat.template{cartridgeName} will be replaced by one line per cartridge{cartridgeName.last} will be replaced by the last cartridge in the list{cartridgeName} will be replaced by one line per cartridge, except for the last cartridge in the listAdd centrally defined libraries to the subprojects section, as in 7.10, or better specify them in the dependencies of the subprojects as needed.
subprojects {
...
plugins.withType<JavaPlugin> {
dependencies {
val cartridge by configurations
val implementation by configurations
val testImplementation by configurations
...
// centrally defined libs
implementation ("com.intershop.platform:bc_spreadsheet")
implementation ("com.intershop.platform:pipeline")
implementation ("javax.inject:javax.inject")
implementation ("org.slf4j:slf4j-api")
implementation ("ch.qos.logback:logback-core")
implementation ("com.google.inject:guice")
implementation ("org.apache.tomcat:tomcat-el-api")
implementation ("org.apache.tomcat:tomcat-servlet-api")
...
Remove site tasks from build.gradle files, as in the following example.
The content of the sites folder will be prepared as a DBPrepare step. The required SiteContentPerparer will be added for these subprojects where such a folder exists.
/*
* Create a copy of the smb whitestore content for the simple smb storefront
*/
task copySimpleSMBWhiteStore(type: Copy) {
from "$projectDir/staticfiles/share/sites/inSPIRED-inTRONICS_Business-Site/units/inSPIRED-inTRONICS_Business-smb-responsive/impex/src/whitestore"
into "$projectDir/staticfiles/share/sites/inSPIRED-inTRONICS-Site/units/inSPIRED-inTRONICS-smb-responsive/impex/src/whitestore"
}
zipShare.dependsOn copySimpleSMBWhiteStore
Files in cluster and domains directories need to be wired using the configuration framework.
Although the automated migration step moved these files to their new locations, manual configuration is still required.
Cluster-specific and domain-specific configuration (/src/main/resources/resources/{cartridgeName}/config/cluster,
/src/main/resources/resources/{cartridgeName}/config/domains/{domainName}): Requires wiring in configuration.xml
Cartridge-specific and app-type-specific configuration (/src/main/resources/resources/{cartridgeName}/config): No wiring in
configuration.xml
Verify that the configuration is correctly loaded at runtime by checking the server logs during startup.
For more details about the configuration framework, refer to Concept - Configuration in the Intershop Knowledge Base.
In ICM 11, adjusting the Logback configuration is necessary to prevent issues when multiple application servers attempt to write to the same log file:
Remove file appenders from your logback configuration files:
src/main/resources/resources/{cartridgeName}/logback/.<appender> configurations that write to files.<appender name="DEBUG_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file><@loggingDir@>/debug.log</file>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern><@loggingDir@>/debug-%d{yyyy-MM-dd}.log.zip</FileNamePattern>
</rollingPolicy>
</appender>Use console logging instead:
Ensure you have a console appender configured:
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{"yyyy-MM-dd'T'HH:mm:ss.SSSXXX", UTC} [%thread] %-5level %logger{36} %msg%n</pattern>
</encoder>
</appender>Make sure the root logger (or specific loggers) use the console appender:
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>In cloud environments, logs are typically collected and aggregated by external systems rather than stored in local files, making these changes essential for proper log management and centralized monitoring.
After the automated migration, verify whether any static files were not migrated:
staticfiles folder.staticfiles/cartridge/configdefstaticfiles/cartridge/generationTemplatesstaticfiles/cartridge/libstaticfiles/cartridge/rulesstaticfiles/cartridge/staticstaticfiles/cartridge/definitionstaticfiles/cartridge/wsdlstaticfiles/cartridge/urlrewritestaticfiles directories that were not migrated but should have been moved.Starting with ICM 11, dependencies must be declared at the cartridge level. This applies to implementation and runtime dependencies alike.
In version 7.10, runtime dependencies were not utilized. Instead, the server required a cartridge list whose sequence indirectly reflected these runtime dependencies.
This approach had inherent limitations, and the dependencies were not always accurate at the cartridge level.
The cartridge list in the build.gradle file of the 7.10 assembly project defined the runtime dependencies indirectly and at the wrong level.
It is no longer relevant and has already been deleted.
The backup of the generated cartridge list is important in this step since it is a helpful tool for verifying and correcting dependencies between cartridges.
Each cartridge must be examined meticulously to determine its dependencies on other cartridges, and these dependencies must be documented in the respective build.gradle.kts file.
This applies to all source code artifacts, including component files, ISML templates, Java classes, property files that declare DBPrepare steps, and more.
In summary, a dependency on another cartridge must be declared when additional code or output from that cartridge is necessary.
The information provided in the Knowledge Base may not be applicable to all systems and situations. Intershop Communications will not be liable to any party for any direct or indirect damages resulting from the use of the Customer Support section of the Intershop Corporate Website, including, without limitation, any lost profits, business interruption, loss of programs or other data on your information handling system.