These instructions include information about how to upgrade projects generated from each one of the artifacts. Make sure you are following upgrade instructions for the correct project type and "From version -> To version".
A 3 digit versioning scheme is used, major.minor.patch (e.g. 2.1.0). The following is a list of changes that can go into each one of these releases:
Note that in addition to this there can be beta releases to give early access to features.
These instructions include information about how to upgrade projects generated from each one of the Maven artifacts. Make sure you are following upgrade instructions for the correct project type. Default Alfresco versions for SDK 2.0.0 is Community 5.0.c and Enterprise 5.0. After upgrading to SDK 2.1.0 the default Alfresco versions will be Community 5.0.d and Enterprise 5.0.1.
In the IDE, open up the {REPO_AMP_PROJECT_PATH}/pom.xml project file. Scroll down so you see the parent section. Then update it to look as follows:
<parent> <groupId>org.alfresco.maven</groupId> <artifactId>alfresco-sdk-parent</artifactId> <version>2.1.0</version> </parent>
In the project file {REPO_AMP_PROJECT_PATH}/pom.xml scroll down to the properties section. Then remove the property called alfresco.client.contextPath. This property is already set to /alfresco in the SDK parent POM so no need to set it here.
In the IDE, open up the {REPO_AMP_PROJECT_PATH}/pom.xml project file. Scroll down so you see the profiles section. Then add the following profile to it:
<!-- If the 'amp-to-war' profile is enabled then make sure to bring in the alfresco-rad module, which has the H2 scripts and other RAD features. --> <profile> <id>amp-to-war</id> <dependencies> <dependency> <groupId>org.alfresco.maven</groupId> <artifactId>alfresco-rad</artifactId> <version>${maven.alfresco.version}</version> </dependency> </dependencies> </profile>
Open the {REPO_AMP_PROJECT_PATH}/tomcat/context.xml file. Change it to look like this for best RAD experience:
<?xml version="1.0" encoding="UTF-8"?> <!-- =================================================================================================================== This context file is used only in a development IDE for rapid development, it is never released with the Alfresco.war =================================================================================================================--> <!-- Setup docBase to something like repo-amp/target/repo-amp-war and path to /alfresco The Alfresco.war 5.0 does not have a webapp (it used to have Alfresco Explorer but not anymore) that we will access, so this docBase might not be needed --> <Context docBase="${app.amp.client.war.folder}" path="${alfresco.client.contextPath}"> <Resources className="org.apache.naming.resources.VirtualDirContext" extraResourcePaths="/=${project.build.directory}/${project.build.finalName}/web" /> <!-- Setup the virtual class path like this: 1) target/classes 2) target/${project.build.finalName}/config 3) target/test-classes This way mvn compile can be invoked and all changes will be picked up --> <Loader searchVirtualFirst="true" className="org.apache.catalina.loader.VirtualWebappLoader" virtualClasspath="${project.build.outputDirectory};${project.build.directory}/${project.build.finalName}/config;${project.build.testOutputDirectory}" /> <!-- This enables hot reloading of web resources from uncompressed jars (while in prod they would be loaded from WEB-INF/lib/{\*.jar}/META-INF/resources --> <JarScanner scanAllDirectories="true" /> </Context>
Version 2.1.0 of the SDK have changes to the Linux run scripts and have new run scripts for Windows. So it make sense to take the new scripts from a newly generated 2.1.0 Repository AMP project and replace the 2.0.0 scripts with them. So follow these instructions [10] to generate a Repository AMP project based on the 2.1.0 archetype. Then just copy over the {newly generated 2.1.0 Repo AMP}/run.* scripts to the {REPO_AMP_PROJECT_PATH} directory, overwriting the run.sh script.
In the IDE, open up the {SHARE_AMP_PROJECT_PATH}/pom.xml project file. Scroll down so you see the parent section. Then update it to look as follows:
<parent> <groupId>org.alfresco.maven</groupId> <artifactId>alfresco-sdk-parent</artifactId> <version>2.1.0</version> </parent>
In the project file {SHARE_AMP_PROJECT_PATH}/pom.xml scroll down to the properties section. Then remove the property called alfresco.client.contextPath. This property is now called share.client.contextPath, and it is already set to /share in the SDK parent POM, so no need to set it here.
In the project file {SHARE_AMP_PROJECT_PATH}/pom.xml scroll down to the properties section. Then change the name of the property called alfresco.client.war to app.amp.client.war.artifactId.
In the same project file {SHARE_AMP_PROJECT_PATH}/pom.xml scroll down to the dependencies end tag. Then add the following build section after it with the yuicompressor-maven-plugin to enable JS compression:
. . . </dependencies> <build> <plugins> <!-- Compress JavaScript files and store as *-min.js --> <plugin> <groupId>net.alchim31.maven</groupId> <artifactId>yuicompressor-maven-plugin</artifactId> </plugin> </plugins> </build>
Open the {SHARE_AMP_PROJECT_PATH}/src/test/resources/alfresco/web-extension/share-config-custom.xml file and update the web-framework configuration so it looks like this:
<web-framework> <autowire> <!-- Changing this to 'development' currently breaks the Admin Console. Instead we make a POST to clear Share dependency caches, see 'clear-caches-refresh-ws' profile. --> <mode>production</mode> <!-- not really need in the long run, used for YUI - deprecate --> </autowire> <!-- We don't need to do this when we have the new refresh mojos in the Alfresco plug-in. If resource caching has been disabled then all the dependency caches will be cleared before processing the Aikau jsonModel request... (i.e. this.dojoDependencyHandler.clearCaches() ) For more information see the Aikau source code: https://github.com/Alfresco/Aikau --> <disable-resource-caching>false</disable-resource-caching> </web-framework>
Open the {SHARE_AMP_PROJECT_PATH}/tomcat/context.xml file. Change it to look like this for best RAD experience:
<?xml version="1.0" encoding="UTF-8"?> <!-- =================================================================================================================== This context file is used only in a development IDE for rapid development, it is never released with the Alfresco.war =================================================================================================================--> <!-- Setup docBase to something like share-amp/target/share-amp-war and path to /share --> <Context docBase="${app.amp.client.war.folder}" path="${share.client.contextPath}"> <Resources className="org.apache.naming.resources.VirtualDirContext" extraResourcePaths="/=${project.build.directory}/${project.build.finalName}/web" /> <!-- Configure where the Share (share.war) web application can load classes, test classes, and config --> <!-- Setup the virtual class path like this: 1) target/classes 2) target/${project.build.finalName}/config 3) target/test-classes This way mvn compile can be invoked and all changes will be picked up --> <Loader searchVirtualFirst="true" className="org.apache.catalina.loader.VirtualWebappLoader" virtualClasspath="${project.build.outputDirectory};${project.build.directory}/${project.build.finalName}/config;${project.build.testOutputDirectory}" /> <!-- This enables hot reloading of web resources from uncompressed jars (while in prod they would be loaded from WEB-INF/lib/{\*.jar}/META-INF/resources --> <JarScanner scanAllDirectories="true" /> </Context>
Version 2.1.0 of the SDK have changes to the Linux run scripts and have new run scripts for Windows. So it make sense to take the new scripts from a newly generated 2.1.0 Share AMP project and replace the 2.0.0 scripts with them. So follow these instructions [11] to generate a Share AMP project based on the 2.1.0 archetype. Then just copy over the {newly generated 2.1.0 Share AMP}/run.* scripts to the {SHARE_AMP_PROJECT_PATH} directory, overwriting the run.sh script.
Update the top AIO project file.
In the IDE, open up the {AIO_PROJECT_PATH}/pom.xml project file. Scroll down so you see the parent section. Then update it to look as follows:
<parent> <groupId>org.alfresco.maven</groupId> <artifactId>alfresco-sdk-parent</artifactId> <version>2.1.0</version> </parent>
In the same project file {AIO_PROJECT_PATH}/pom.xml scroll down to the properties section. Then update it with this extra property:
<properties> . . . <!-- The Alfresco Share web application is accessible via this URL --> <share.client.url>http://localhost:8080/share</share.client.url>
If the Records Management (RM) module is used then add a property specifying the RM version that should be used. In the properties section add this extra property:
<properties> . . . <alfresco.rm.version>2.3</alfresco.rm.version>
In the same project file {AIO_PROJECT_PATH}/pom.xml scroll down to the dependencyManagement end tag. Then add the following build section after it with the yuicompressor-maven-plugin to enable JS compression and the alfresco-maven-plugin to enable webapp RAD development:
. . . </dependencyManagement> <build> <plugins> <!-- Compress JavaScript files and store as *-min.js --> <plugin> <groupId>net.alchim31.maven</groupId> <artifactId>yuicompressor-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.alfresco.maven.plugin</groupId> <artifactId>alfresco-maven-plugin</artifactId> </plugin> </plugins> </build>
In the same project file {AIO_PROJECT_PATH}/pom.xml scroll down to the profiles section. Then remove the profile with the rm id (identifier). The RM module is added via the {AIO_PROJECT_PATH}/repo/pom.xml and the {AIO_PROJECT_PATH}/share/pom.xml project files. See further down in these instructions for more information.
SDK version 2.1.0 comes with support for Solr 4, which is deployed directly from the maven artefact. The maven module just contains Solr 4 configuration information and because of this has changed name from solr to solr-config, so we need to update to the new name. In the same project file {AIO_PROJECT_PATH}/pom.xml scroll down to the modules section. Update it so it looks like this:
. . . <modules> <module>repo-amp</module> <module>share-amp</module> <module>repo</module> <module>solr-config</module> <module>share</module> <module>runner</module> </modules>Note. You might have added extra modules that are not part of the AIO artefact, don't remove these modules from the definition.
Update the Repository Webapp (alfresco.war) Project file
In the project file {AIO_PROJECT_PATH}/repo/pom.xml scroll down to the profiles section. Then remove the profile with the rm id (identifier). The RM module is now instead added permanently as a dependency and overlay.
If the RM module is used, then it is now added permanently to the project instead of via profile activation. Add a dependency for it as follows. In the IDE, open up the {AIO_PROJECT_PATH}/repo/pom.xml project file. Scroll down so you see the dependencies section. Then add the following dependency:
<dependencies> . . . <dependency> <groupId>${alfresco.groupId}</groupId> <artifactId>alfresco-rm</artifactId> <version>${alfresco.rm.version}</version> <type>amp</type> </dependency>
If the RM module is used, then it is now added permanently to the project instead of via profile activation. Add an overlay configuration as follows. In the {AIO_PROJECT_PATH}/repo/pom.xml project file scroll down so you see the overlays section. Then add the following overlay at the end:
<overlays> . . . <overlay> <groupId>${alfresco.groupId}</groupId> <artifactId>alfresco-rm</artifactId> <type>amp</type> </overlay> </overlays>
When running all the web applictions during testing the repository webapp (alfresco.war) is reading its configuration from the {AIO_PROJECT_PATH}/repo/src/main/properties/local/alfresco-global.properties file. We need to update it so it uses Solr 4, the following properties should be changed:
index.subsystem.name=solr4 solr.backup.alfresco.remoteBackupLocation=${dir.root}/solr4Backup/alfresco solr.backup.archive.remoteBackupLocation=${dir.root}/solr4Backup/archive
Update the Repository AMP Project file
In the project file {AIO_PROJECT_PATH}/repo-amp/pom.xml scroll down to the properties section. Then remove the property called alfresco.client.war. This property is now called app.amp.client.war.artifactId and defaults to alfresco, so no need to set it in the repo-amp project file. This property is used when you run with the -Pamp-to-war profile.
If the RM module is used, then it is now added permanently to the project instead of via profile activation. So to get access to the RM classes add a dependency as follows. In the {AIO_PROJECT_PATH}/repo-amp/pom.xml project file scroll down so you see the dependencies section. Then add the following dependency:
<dependencies> . . . <dependency> <groupId>${alfresco.groupId}</groupId> <artifactId>alfresco-rm</artifactId> <version>${alfresco.rm.version}</version> <classifier>classes</classifier> </dependency>
In the project file {AIO_PROJECT_PATH}/repo-amp/pom.xml scroll down to the profiles section. Then remove the profile with the rm id (identifier). The RM classes are now instead added permanently as a dependency.
Update the Share Webapp (share.war) Project file
In the project file {AIO_PROJECT_PATH}/share/pom.xml add the following properties section just after the parent section:
. . . </parent> <properties> <!-- Used in share-config-custom.xml when testing. By default points to standard location (local) of Alfresco Repository --> <alfresco.repo.url>http://localhost:8080/alfresco</alfresco.repo.url> </properties>
The share configuration file has moved from the share AMP sub project to the share WAR project. This is because it contains generic configuration such as where the Repository is running and RAD related configuration. Move the {AIO_PROJECT_PATH}/share-amp/src/test/resources/alfresco/web-extension/share-config-custom.xml file to the {AIO_PROJECT_PATH}/share/src/main/resources/alfresco/web-extension location. Then update the web-framework configuration so it looks like this:
<web-framework> <autowire> <!-- Changing this to 'development' currently breaks the Admin Console. Instead we make a POST to clear Share dependency caches, see 'clear-caches-refresh-ws' profile. --> <mode>production</mode> <!-- not really need in the long run, used for YUI - deprecate --> </autowire> <!-- We don't need to do this when we have the new refresh mojos in the Alfresco plug-in. If resource caching has been disabled then all the dependency caches will be cleared before processing the Aikau jsonModel request... (i.e. this.dojoDependencyHandler.clearCaches() ) For more information see the Aikau source code: https://github.com/Alfresco/Aikau --> <disable-resource-caching>false</disable-resource-caching> </web-framework>
In the project file {AIO_PROJECT_PATH}/share/pom.xml scroll down to the profiles section. Then remove the profile with the rm id (identifier). The RM module is now instead added permanently as a dependency and overlay.
If the RM module is used, then it is now added permanently to the project instead of via profile activation. Add a dependency for it as follows. In the IDE, open up the {AIO_PROJECT_PATH}/share/pom.xml project file. Scroll down so you see the dependencies section. Then add the following dependency:
<dependencies> . . . <dependency> <groupId>${alfresco.groupId}</groupId> <artifactId>alfresco-rm-share</artifactId> <version>${alfresco.rm.version}</version> <type>amp</type> </dependency>
If the RM module is used, then it is now added permanently to the project instead of via profile activation. Add an overlay configuration as follows. In the {AIO_PROJECT_PATH}/share/pom.xml project file scroll down so you see the overlays section. Then add the following overlay at the end:
<overlays> . . . <overlay> <groupId>${alfresco.groupId}</groupId> <artifactId>alfresco-rm-share</artifactId> <type>amp</type> </overlay> </overlays>
Update the Share AMP Project file
In the project file {AIO_PROJECT_PATH}/share-amp/pom.xml scroll down to the properties section. Then change the name of property called alfresco.client.war to its new name app.amp.client.war.artifactId. It defaults to alfresco so we need to override it here with the value share. This property is used when you run with the -Pamp-to-war profile.
In the project file {AIO_PROJECT_PATH}/share-amp/pom.xml scroll down to the properties section. Then remove the property called alfresco.repo.url. This property is only used by the {AIO_PROJECT_PATH}/share/pom.xml project in an All-in-One extension project.
In the project file {AIO_PROJECT_PATH}/share-amp/pom.xml scroll down to the properties section. Then remove the property called maven.tomcat.port. This property is only used by the {AIO_PROJECT_PATH}/runner/pom.xml project when starting an embeeded Tomcat instance. Default port number is configured to 8080 in the parent SDK pom.
In version 2.1.0 of the SDK there are two new profiles called regression-testing and functional-testing that uses Page Objects (PO) to do functional testing of the Share Web application. We need to add all dependencies needed for these tests. In the {AIO_PROJECT_PATH}/share-amp/pom.xml project file scroll down so you see the dependencies section. Then add the following dependencies:
<dependencies> . . . <!--=============================================================== The following dependencies are needed to be able to compile the custom functional tests that are based on Page Objects (PO) ===============================================================--> <!-- Bring in the Share Page Objects (PO) used in our functional tests. It contains page objects such as LoginPage --> <dependency> <groupId>${alfresco.groupId}</groupId> <artifactId>share-po</artifactId> <version>${alfresco.version}</version> <scope>test</scope> </dependency> <!-- Bring in the Share Page Object (PO) Tests that comes with Alfresco. It has the org.alfresco.po.share.AbstractTest class that our custom tests extend. --> <dependency> <groupId>${alfresco.groupId}</groupId> <artifactId>share-po</artifactId> <version>${alfresco.version}</version> <classifier>tests</classifier> <scope>test</scope> <!-- Exclude version 2.39.0 of selenium that does not work with latest FF browsers, we include version 2.45 later on here --> <exclusions> <exclusion> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> </exclusion> <exclusion> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-server</artifactId> </exclusion> </exclusions> </dependency> <!-- Bring in newer selenium version --> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>2.45.0-alfresco</version> </dependency> <!-- Test NG is defined with test scope in share-po, so need it here too --> <!-- Alfresco code creates a wrapper around Test NG --> <dependency> <groupId>org.alfresco.test</groupId> <artifactId>alfresco-testng</artifactId> <version>1.1</version> <scope>test</scope> <exclusions> <exclusion> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
Replace Modules and Scripts
The project configuration for the runner module has changed quite a bit in version 2.1.0 of the SDK. And there should not be much custom configuration done to it. So it make sense to take the runner module from a newly generated 2.1.0 AIO project and replace the 2.0.0 runner module with it. So follow these instructions [12] to generate an AIO project based on the 2.1.0 archetype. Then delete the {AIO_PROJECT_PATH}/runner module/directory from the All-in-One project. Now copy the {newly generated 2.1.0 AIO}/runner module into the {AIO_PROJECT_PATH}/runner location.
The new runner module probably does not have the same parent configuration as your {AIO_PROJECT_PATH} project. So open up the {AIO_PROJECT_PATH}/runner/pom.xml file and make sure the parent section is correct.
If you have made changes to the virtual web application context because you have added more AMPs to the AIO project, then see these instructions [13] for how to update the 2.1.0 runner context.
The project configuration for the solr module has changed completely from bringing in the complete Solr 1.4 web application to just bringing in the Solr 4 configuration. So it make sense to take the solr-config module from a newly generated 2.1.0 AIO project and replace the 2.0.0 solr module with it. So follow these instructions [12] to generate an AIO project based on the 2.1.0 archetype (if you have not already done it). Then delete the {AIO_PROJECT_PATH}/solr module/directory from the All-in-One project. Now copy the {newly generated 2.1.0 AIO}/solr-config module into the {AIO_PROJECT_PATH}/solr-config location.
The new solr-config module probably does not have the same parent configuration as your {AIO_PROJECT_PATH} project. So open up the {AIO_PROJECT_PATH}/solr-config/pom.xml file and make sure the parent section is correct.
If you have made changes to the Solr configuration, such as adding a synonyms list, then you will have to update the solr-config project with these changes.
Version 2.1.0 of the SDK have changes to the Linux run scripts and have new run scripts for Windows. So it make sense to take the new scripts from a newly generated 2.1.0 AIO project and replace the 2.0.0 scripts with them. So follow these instructions [12] to generate an AIO project based on the 2.1.0 archetype (if you have not already done it). Then just copy over the {newly generated 2.1.0 AIO}/run.* scripts to the {AIO_PROJECT_PATH} directory, overwriting the run.sh script.
It is not possible to do an incremental H2 database schema update. The complete alf_data_dev directory needs to be deleted before you run the application again.
These instructions include information about how to upgrade projects generated from each one of the Maven artifacts. Make sure you are following upgrade instructions for the correct project type. Default Alfresco versions for SDK 2.1.0 is Community 5.0.d and Enterprise 5.0.1. After upgrading to SDK 2.1.1 the default Alfresco versions will stay the same.
In the IDE, open up the {REPO_AMP_PROJECT_PATH}/pom.xml project file. Scroll down so you see the parent section. Then update it to look as follows:
<parent> <groupId>org.alfresco.maven</groupId> <artifactId>alfresco-sdk-parent</artifactId> <version>2.1.1</version> </parent>
In the same project file update the property alfresco.data.location as follows:
<properties> <!-- The following are default values for data location, Alfresco Community version. Uncomment if you need to change (Note. current default version for Enterprise edition is 5.0.1) <alfresco.version>5.0.d</alfresco.version> <alfresco.data.location>/absolute/path/to/alf_data_dev</alfresco.data.location> -->
In the {REPO_AMP_PROJECT_PATH}/src/main/amp/config/alfresco/module/repo-amp/context/service-context.xml project file update as follows:
<!-- A simple module component that will be executed once. Note. this module component will only be executed once, and then there will be an entry for it in the Repo. So doing for example $ mvn clean install -Prun twice will only execute this component the first time. You need to remove /alf_data_dev for it to be executed again. --> <bean ... <property name="sinceVersion" value="1.0" /> <property name="appliesFromVersion" value="1.0" /> ... </bean>
In the IDE, open up the {SHARE_AMP_PROJECT_PATH}/pom.xml project file. Scroll down so you see the parent section. Then update it to look as follows:
<parent> <groupId>org.alfresco.maven</groupId> <artifactId>alfresco-sdk-parent</artifactId> <version>2.1.1</version> </parent>
In the IDE, open up the {AIO_PROJECT_PATH}/pom.xml project file. Scroll down so you see the parent section. Then update it to look as follows:
<parent> <groupId>org.alfresco.maven</groupId> <artifactId>alfresco-sdk-parent</artifactId> <version>2.1.1</version> </parent>
In the same parent project file update the property alfresco.data.location as follows:
<properties> <!-- The following are default values for data location, Alfresco Community version, and Records Management Module version. Uncomment if you need to change (Note. current default version for Enterprise edition is 5.0.1) <alfresco.version>5.0.d</alfresco.version> <alfresco.rm.version>2.3</alfresco.rm.version> <alfresco.data.location>/absolute/path/to/alf_data_dev</alfresco.data.location> -->
In the {AIO_PROJECT_PATH}/share-amp/pom.xml project file scroll down to the following dependency. Then add <scope>test</scope>:
<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>2.45.0-alfresco</version> <scope>test</scope> </dependency>
In the {AIO_PROJECT_PATH}/repo-amp/src/main/amp/config/alfresco/module/repo-amp/context/service-context.xml project file update as follows:
<!-- A simple module component that will be executed once. Note. this module component will only be executed once, and then there will be an entry for it in the Repo. So doing for example $ mvn clean install -Prun twice will only execute this component the first time. You need to remove /alf_data_dev for it to be executed again. --> <bean ... <property name="sinceVersion" value="1.0" /> <property name="appliesFromVersion" value="1.0" /> ... </bean>
In the {AIO_PROJECT_PATH}/repo/pom.xml project file add the following properties section:
<properties> <!-- During development we set log root level to Debug, this will be applicable to the log configuration in repo/src/main/resources/alfresco/extension/dev-log4j.properties, such as DemoComponent logging. --> <app.log.root.level>DEBUG</app.log.root.level> </properties>
In the {AIO_PROJECT_PATH}/repo/src/main/resources/alfresco/extension/dev-log4j.properties log configuration file add the following line:
log4j.logger.org.alfresco.demoamp.DemoComponent=${app.log.root.level}
Update and add properties as follows in the {AIO_PROJECT_PATH}/runner/pom.xml project file :
<properties> <alfresco.solr.dir>${alfresco.data.location}/solr4</alfresco.solr.dir> <alfresco.solr.home.dir>${alfresco.solr.dir}/config</alfresco.solr.home.dir> <alfresco.solr.data.dir>${alfresco.solr.dir}/data</alfresco.solr.data.dir> </properties>
In the {AIO_PROJECT_PATH}/runner/tomcat/context-repo.xml file add comments as follows:
<Resources className="org.apache.naming.resources.VirtualDirContext" extraResourcePaths="/=${project.parent.basedir}/repo-amp/target/repo-amp/web" /> <!-- IMPORTANT! The extraResourcePaths string need to be on one continues line, so if we add another Repo AMP, it would look something like this: <Resources className="org.apache.naming.resources.VirtualDirContext" extraResourcePaths="/=${project.parent.basedir}/repo-amp/target/repo-amp/web,/=${project.parent.basedir}/component-a-repo/target/component-a-repo/web" /> -->
In the {AIO_PROJECT_PATH}/runner/tomcat/context-share.xml file add comments as follows:
<Resources className="org.apache.naming.resources.VirtualDirContext" extraResourcePaths="/=${project.parent.basedir}/share-amp/target/share-amp/web" /> <!-- IMPORTANT! The extraResourcePaths string need to be on one continues line, so if we add another Share AMP, it would look something like this: <Resources className="org.apache.naming.resources.VirtualDirContext" extraResourcePaths="/=${project.parent.basedir}/share-amp/target/share-amp/web,/=${project.parent.basedir}/component-a-share/target/component-a-share/web" /> -->
In the {AIO_PROJECT_PATH}/runner/tomcat/context-solr.xml file update the environment property values as follows:
<Context> <Environment name="solr/home" type="java.lang.String" value="${alfresco.solr.home.dir}/" override="true"/> <Environment name="solr/model/dir" type="java.lang.String" value="${alfresco.solr.home.dir}/alfrescoModels/" override="true"/> <Environment name="solr/content/dir" type="java.lang.String" value="${alfresco.solr.data.dir}/content/" override="true"/>
Open up the {AIO_PROJECT_PATH}/solr-config/pom.xml project file. Update the properties sections as follows:
<properties> <alfresco.solr.dir>${alfresco.data.location}/solr4</alfresco.solr.dir> <alfresco.solr.home.dir>${alfresco.solr.dir}/config</alfresco.solr.home.dir> <alfresco.solr.data.dir>${alfresco.solr.dir}/data</alfresco.solr.data.dir> </properties>
These instructions include information about how to upgrade projects generated from each one of the Maven artifacts. Make sure you are following upgrade instructions for the correct project type. Default Alfresco versions for SDK 2.1.1 is Community 5.0.d and Enterprise 5.0.1. After upgrading to SDK 2.2.0 the default Alfresco versions will be Community 5.1.d and Enterprise 5.1.0.
In the IDE, open up the {REPO_AMP_PROJECT_PATH}/pom.xml project file. Scroll down so you see the parent section. Then update it to look as follows:
<parent> <groupId>org.alfresco.maven</groupId> <artifactId>alfresco-sdk-parent</artifactId> <version>2.2.0</version> </parent>
In the same project file add the following dependency:
<!-- If we are running tests then make the H2 Scripts available Note. tests are skipped when you are running -Pamp-to-war --> <dependency> <groupId>${alfresco.groupId}</groupId> <artifactId>alfresco-repository</artifactId> <version>${alfresco.version}</version> <classifier>h2scripts</classifier> <scope>test</scope> <exclusions> <exclusion> <groupId>*</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency>
This artifact previously contained the H2 database scripts but they are now available separately. In the same project file remove the following profile and dependency:
<!-- If the 'amp-to-war' profile is enabled then make sure to bring in the alfresco-rad module, which has the H2 scripts and other RAD features. TODO: TO INVESTIGATE: This dependency is already defined in the parent SDK pom in the 'amp-to-war' profile but this does not work, it is not include... <profile> <id>amp-to-war</id> <dependencies> <dependency> <groupId>org.alfresco.maven</groupId> <artifactId>alfresco-rad</artifactId> <version>${maven.alfresco.version}</version> </dependency> </dependencies> </profile> -->
Spring Loaded currently blocks the Repository (Platform) from starting. Update the {REPO_AMP_PROJECT_PATH}/run.sh and run.bat so they don't use Spring Loaded, change the MAVEN_OPTS so it looks like this:
run.sh: MAVEN_OPTS="-Xms256m -Xmx2G" mvn integration-test -Pamp-to-war run.bat: set MAVEN_OPTS=-Xms256m -Xmx2G
Update the virtual webapp context to reflect new directory names and the change so resources can be overridden (it is used when running with -Pamp-to-war). Open the {REPO_AMP_PROJECT_PATH}/tomcat/context.xml file and update it so it looks like this:
<?xml version="1.0" encoding="UTF-8"?> <!-- =================================================================================================================== This context file is used only in a development IDE for rapid development, it is never released with the Alfresco.war =================================================================================================================--> <!-- Setup a virtual context for the /alfresco webapp by specifying this as path for Context. The amp-to-war profile uses the tomcat7-maven-plugin to kick off the webapp. This profile is used for both the repo and share AMP archetypes, and has no config for path or resources, so we need to specify here both the context path and where the webapp resources can be found. The webapp resources are located in the {repo-amp-dir}/target/amp-war directory, However, we cannot just set this up as the docBase attribute for the Context as it would always be read before any paths in the extraResourcePaths. So to allow for customizations to override stuff in the alfresco.war webapp, such as the /images/logo/logo.png, we add the webapp resource path last in the extraResourcePaths. Note. Alfresco.war 5.0 does not have a webapp, just an index page, the Alfresco Explorer webapp is no longer available. --> <Context path="${alfresco.client.contextPath}"> <Resources className="org.apache.naming.resources.VirtualDirContext" extraResourcePaths="/=${project.build.directory}/amp/web,${app.amp.client.war.folder}" /> <!-- Setup the virtual class path like this: 1) target/classes 2) target/amp/config 3) target/test-classes This way mvn compile can be invoked and all changes will be picked up --> <Loader searchVirtualFirst="true" className="org.apache.catalina.loader.VirtualWebappLoader" virtualClasspath="${project.build.outputDirectory};${project.build.directory}/amp/config;${project.build.testOutputDirectory}" /> <!-- This enables hot reloading of web resources from uncompressed jars (while in prod they would be loaded from WEB-INF/lib/{\*.jar}/META-INF/resources --> <JarScanner scanAllDirectories="true" /> </Context>
Open the {REPO_AMP_PROJECT_PATH}/src/main/amp/config/alfresco/module/<module-id>/module-context.xml file and update it so it looks like this:
<beans> <!-- This is filtered by Maven at build time, so that module name is single sourced. --> <!-- Note. The bootstrap-context.xml file has to be loaded first. Otherwise your custom models are not yet loaded when your service beans are instantiated and you cannot for example register policies on them. --> <import resource="classpath:alfresco/module/${project.artifactId}/context/bootstrap-context.xml" /> <import resource="classpath:alfresco/module/${project.artifactId}/context/service-context.xml" /> <import resource="classpath:alfresco/module/${project.artifactId}/context/webscript-context.xml" /> </beans>
Open the {REPO_AMP_PROJECT_PATH}/src/main/amp/module.properties file and update the version property:
module.version=${project.version}
Remove the {REPO_AMP_PROJECT_PATH}/alf_data_dev directory. This is needed as the H2 script artifact does not currently contain upgrade scripts.
In the IDE, open up the {SHARE_AMP_PROJECT_PATH}/pom.xml project file. Scroll down so you see the parent section. Then update it to look as follows:
<parent> <groupId>org.alfresco.maven</groupId> <artifactId>alfresco-sdk-parent</artifactId> <version>2.2.0</version> </parent>
This is not needed any more. In the same project file remove the following profile and dependency:
<profiles> <!-- Brings in the extra Enterprise specific share classes, if the 'enterprise' profile has been activated, needs to be activated manually. --> <profile> <id>enterprise</id> <dependencies> <dependency> <groupId>${alfresco.groupId}</groupId> <artifactId>share-enterprise</artifactId> <version>${alfresco.version}</version> <classifier>classes</classifier> <scope>provided</scope> </dependency> </dependencies> </profile> </profiles>
Update the virtual webapp context to reflect new directory names and the change so resources can be overridden (it is used when running with -Pamp-to-war). Open the {SHARE_AMP_PROJECT_PATH}/tomcat/context.xml file and update it so it looks like this:
<?xml version="1.0" encoding="UTF-8"?> <!-- =================================================================================================================== This context file is used only in a development IDE for rapid development, it is never released with the Alfresco.war =================================================================================================================--> <!-- Setup a virtual context for the /share webapp by specifying this as path for Context. The amp-to-war profile uses the tomcat7-maven-plugin to kick off the webapp. This profile is used for both the repo and share AMP archetypes, and has no config for path or resources, so we need to specify here both the context path and where the webapp resources can be found. The webapp resources are located in the {share-amp-dir}/target/amp-war directory, However, we cannot just set this up as the docBase attribute for the Context as it would always be read before any paths in the extraResourcePaths. So to allow for customizations to override stuff in the share.war webapp, such as the /favicon.ico, we add the webapp resource path last in the extraResourcePaths. Note. most of the UI customizations for Share are done via custom themes. --> <Context path="${share.client.contextPath}"> <Resources className="org.apache.naming.resources.VirtualDirContext" extraResourcePaths="/=${project.build.directory}/amp/web,${app.amp.client.war.folder}" /> <!-- Configure where the Share (share.war) web application can load classes, test classes, and config --> <!-- Setup the virtual class path like this: 1) target/classes 2) target/amp/config 3) target/test-classes This way mvn compile can be invoked and all changes will be picked up --> <Loader searchVirtualFirst="true" className="org.apache.catalina.loader.VirtualWebappLoader" virtualClasspath="${project.build.outputDirectory};${project.build.directory}/amp/config;${project.build.testOutputDirectory}" /> <!-- This enables hot reloading of web resources from uncompressed jars (while in prod they would be loaded from WEB-INF/lib/{\*.jar}/META-INF/resources --> <JarScanner scanAllDirectories="true" /> </Context>
Open the {SHARE_AMP_PROJECT_PATH}/src/main/amp/module.properties file and update the version property:
module.version=${project.version}
In the IDE, open up the {AIO_PROJECT_PATH}/pom.xml project file. Scroll down so you see the parent section. Then update it to look as follows:
<parent> <groupId>org.alfresco.maven</groupId> <artifactId>alfresco-sdk-parent</artifactId> <version>2.2.0</version> </parent>
In the same project file add a new dependencies section with the following dependency:
<dependencies> <!-- If we are running tests then make the H2 Scripts available. Note. tests are skipped when you are running -Prun --> <dependency> <groupId>${alfresco.groupId}</groupId> <artifactId>alfresco-repository</artifactId> <version>${alfresco.version}</version> <classifier>h2scripts</classifier> <scope>test</scope> <exclusions> <exclusion> <groupId>*</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
Spring Loaded currently blocks the Repository (Platform) from starting. Update the {AIO_PROJECT_PATH}/run.sh and run.bat so they don't use Spring Loaded, change the MAVEN_OPTS so it looks like this:
run.sh: MAVEN_OPTS="-Xms256m -Xmx2G" mvn clean install -Prun run.bat: set MAVEN_OPTS=-Xms256m -Xmx2G
Open the {AIO_PROJECT_PATH}/<repo-amp-id>/src/main/amp/config/alfresco/module/<module-id>/module-context.xml file and update it so it looks like this:
<beans> <!-- This is filtered by Maven at build time, so that module name is single sourced. --> <!-- Note. The bootstrap-context.xml file has to be loaded first. Otherwise your custom models are not yet loaded when your service beans are instantiated and you cannot for example register policies on them. --> <import resource="classpath:alfresco/module/${project.artifactId}/context/bootstrap-context.xml" /> <import resource="classpath:alfresco/module/${project.artifactId}/context/service-context.xml" /> <import resource="classpath:alfresco/module/${project.artifactId}/context/webscript-context.xml" /> </beans>
Open the {AIO_PROJECT_PATH}<repo-amp-id>/src/main/amp/module.properties file and update the version property:
module.version=${project.version}
Open the {AIO_PROJECT_PATH}/<share-amp-id>/pom.xml file and remove the following dependency:
<!-- Bring in newer selenium version --> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>2.45.0-alfresco</version> <scope>test</scope> </dependency>
Open the {AIO_PROJECT_PATH}/<share-amp-id>/src/main/amp/module.properties file and update the version property:
module.version=${project.version}
The Share page object project has been updated a bit so the {AIO_PROJECT_PATH}/<share-amp-id>/src/test/java/<package>/demoamp/po/DemoPage.java class need to be updated a bit:
import org.alfresco.po.share.SharePage; import org.alfresco.po.RenderTime; import org.openqa.selenium.NoSuchElementException; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; public class DemoPage extends SharePage { @FindBy(id="DEMO_SIMPLE_LOGO") WebElement logo; @FindBy(id="DEMO_SIMPLE_MSG") WebElement msg; @SuppressWarnings("unchecked") @Override public DemoPage render(RenderTime timer) { // Wait for logo and message to display, then consider page rendered while (true) { timer.start(); try { if (isSimpleLogoDisplayed() && isMessageDisplayed()) { break; } } catch (NoSuchElementException nse) { } finally { timer.end(); } } return this; } public boolean isSimpleLogoDisplayed() { return isDisplayed(logo); } public boolean isMessageDisplayed() { return isDisplayed(msg); } public String getMessage() { return msg.getText(); } }
The Share page object project has been updated a bit so the {AIO_PROJECT_PATH}/<share-amp-id>/src/test/java/<package>/demoamp/DemoPageTestIT.java class need to be updated a bit:
import org.alfresco.tut.demoamp.po.DemoPage; import org.alfresco.po.share.LoginPage; import org.alfresco.po.AbstractTest; import org.alfresco.po.share.PeopleFinderPage; import org.testng.Assert; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; public class DemoPageTestIT extends AbstractTest { DemoPage page; @BeforeClass(groups = {"alfresco-one"}) public void prepare() throws Exception { // Navigate to share, which will redirect to Login page driver.navigate().to(shareUrl + "/page"); // Resolve/Bind current page to LoginPage object LoginPage loginPage = resolvePage(driver).render(); loginPage.loginAs(username, password); } @BeforeMethod public void loadPage() { // Goto demo page driver.navigate().to(shareUrl + "/page/hdp/ws/simple-page"); // We need to instantiate the page like this as it is not yet in // the factory known list of pages page = factoryPage.instantiatePage(driver, DemoPage.class); } @Test public void findLogo() { Assert.assertTrue(page.isSimpleLogoDisplayed()); } @Test public void messageIsDisplayed() { page.render(); String msg = page.getMessage(); Assert.assertNotNull(msg); Assert.assertEquals("Hello from i18n!", msg); } /** * Example of test reusing methods in abstract share page objects. */ @Test public void titleDisplayed() { // Invoke render when ready to use page object. page.render(); Assert.assertNotNull(page); Assert.assertTrue(page.getTitle().contains("This is a simple page")); } /** * Test that show how we are able to reuse share page objects * objects in particular the navigation object. */ @Test public void navigate() { Assert.assertNotNull(page.getNav()); PeopleFinderPage peopleFinderPage = page.getNav().selectPeople().render(); Assert.assertNotNull(peopleFinderPage); } }
We will need a newer Spring version than 3 to use annotations in the Share PO test classes. Add the following properties section in the {AIO_PROJECT_PATH}/runner/pom.xml file:
<properties> <!-- Bring in newer Spring with support for annotations, used for Page Object tests --> <spring.version>4.1.6.RELEASE</spring.version> </properties>
These scripts come in a separate artifact now and not in the alfresco-rad artifact. In the same project file add a new dependencies section to the plug-in as follows (note. there are actually 2 dependencies to add):
<plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <dependencies> <!-- Bring in the H2 Database scripts needed when running embedded, they are now available from the standard generated artifacts, no longer needed to be picked up from the alfresco-rad project --> <dependency> <groupId>org.alfresco</groupId> <artifactId>alfresco-repository</artifactId> <version>${alfresco.version}</version> <classifier>h2scripts</classifier> <exclusions> <exclusion> <groupId>*</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> <!-- Explicitly bring in the Plexus Archiver so assembly goes quicker --> <dependency> <groupId>org.codehaus.plexus</groupId> <artifactId>plexus-archiver</artifactId> <version>2.3</version> </dependency> </dependencies> <executions> . . .
The API Explorer can be used to test out/explore the available ReST APIs in an easy way. This is a convenience webapp that is optional to install:
<plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> . . . <configuration> . . . <webapps> . . . <webapp> <groupId>org.alfresco</groupId> <artifactId>api-explorer</artifactId> <version>${maven.alfresco.api.explorer.version}</version> <contextPath>/api-explorer</contextPath> <type>war</type> <asWebapp>true</asWebapp> </webapp> </webapps>. . .
We need to bring in Spring 4 for example, in the same project file, update the profile dependencies section so it looks like this:
...<dependencies> <!-- Bring in the Share Page Objects (PO) used in our functional tests. It contains page objects such as LoginPage and it also brings in selenium-grid and selenium. --> <dependency> <groupId>${alfresco.groupId}</groupId> <artifactId>share-po</artifactId> <version>${alfresco.version}</version> <scope>test</scope> </dependency> <!-- Bring in the Share Page Object (PO) Tests that comes with Alfresco. It has the org.alfresco.po.share.AbstractTest class that our custom tests extend. --> <dependency> <groupId>${alfresco.groupId}</groupId> <artifactId>share-po</artifactId> <version>${alfresco.version}</version> <classifier>tests</classifier> <scope>test</scope> <!-- Exclude selenium as it is already brought in by share-po dependency above --> <exclusions> <exclusion> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> </exclusion> <exclusion> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-server</artifactId> </exclusion> </exclusions> </dependency> <!-- Test NG is defined with test scope in share-po, so need it here too --> <!-- Alfresco code creates a wrapper around Test NG --> <dependency> <groupId>org.alfresco.test</groupId> <artifactId>alfresco-testng</artifactId> <version>1.1</version> <scope>test</scope> <exclusions> <exclusion> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> </exclusion> </exclusions> </dependency> <!-- Bring in newer selenium version if required <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>2.48.0</version> <scope>test</scope> </dependency> --> <!-- Need to bring in a newer Spring that supports annotations, Alfresco brings in older one --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> </dependencies>...
Same thing as for the regression testing, we need to bring in Spring 4, in the same project file, update the profile dependencies section so it looks like this:
...<dependencies> <!-- Bring in the Share Page Objects (PO) used in our functional tests. It contains page objects such as LoginPage and it also brings in selenium-grid and selenium. --> <dependency> <groupId>${alfresco.groupId}</groupId> <artifactId>share-po</artifactId> <version>${alfresco.version}</version> <scope>test</scope> </dependency> <!-- Bring in the Share Page Object (PO) Tests that comes with Alfresco. It has the org.alfresco.po.share.AbstractTest class that our custom tests extend. --> <dependency> <groupId>${alfresco.groupId}</groupId> <artifactId>share-po</artifactId> <version>${alfresco.version}</version> <classifier>tests</classifier> <scope>test</scope> <!-- Exclude selenium as it is already brought in by share-po dependency above --> <exclusions> <exclusion> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> </exclusion> <exclusion> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-server</artifactId> </exclusion> </exclusions> </dependency> <!-- Test NG is defined with test scope in share-po, so need it here too --> <!-- Alfresco code creates a wrapper around Test NG --> <dependency> <groupId>org.alfresco.test</groupId> <artifactId>alfresco-testng</artifactId> <version>1.1</version> <scope>test</scope> <exclusions> <exclusion> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> </exclusion> </exclusions> </dependency> <!-- Bring in newer selenium version if required <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>2.48.0</version> <scope>test</scope> </dependency> --> <!-- Need to bring in a newer Spring that supports annotations, Alfresco brings in older one --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> </dependencies>...
Update directory paths for extra resource paths and AMP config, in the {AIO_PROJECT_PATH}/runner/tomcat/context-repo.xml file, update the extraResourcePaths and virtualClasspath as follows:
... extraResourcePaths="/=${project.parent.basedir}/repo-amp/target/amp/web" /> ... virtualClasspath="${project.parent.basedir}/repo-amp/target/classes; ${project.parent.basedir}/repo-amp/target/amp/config; ${project.parent.basedir}/repo-amp/target/test-classes" ...Note. if you got more Repo AMPs in your AIO project then you need to update the paths for them too.
Update directory paths for extra resource paths and AMP config, in the {AIO_PROJECT_PATH}/runner/tomcat/context-share.xml file, update the extraResourcePaths and virtualClasspath as follows:
... extraResourcePaths="/=${project.parent.basedir}/share-amp/target/amp/web" /> ... virtualClasspath="${project.parent.basedir}/share-amp/target/classes; ${project.parent.basedir}/share-amp/target/amp/config; ${project.parent.basedir}/share-amp/target/test-classes; ${project.parent.basedir}/share/target/test-classes" ...Note. if you got more Repo AMPs in your AIO project then you need to update the paths for them too.
We will need it to unpack the MANIFEST.MF file so we can save it and store it in the new custom WAR. Open the {AIO_PROJECT_PATH}/share/pom.xml file and add the plug-in just before the maven-war-plugin:
<plugin> <!-- Bring in the Maven Dependency plugin so we can unpack and store the MANIFEST.MF file. It will be used in the custom Share WAR that is produced by the WAR plugin, it otherwise gets overwritten by the overlay process. --> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>unpack</id> <phase>generate-sources</phase> <goals> <goal>unpack-dependencies</goal> </goals> <configuration> <includeTypes>war</includeTypes> <includeGroupIds>org.alfresco</includeGroupIds> <includeArtifactIds>share</includeArtifactIds> <includes>META-INF/MANIFEST.MF</includes> </configuration> </execution> </executions> </plugin>
Store the custom MANIFEST.MF file when we build the custom share.war. Open the {AIO_PROJECT_PATH}/share/pom.xml file and add the archive section to the maven-war-plugin:
<artifactId>maven-war-plugin</artifactId> <configuration> <!-- Bring in the MANIFEST.MF file from the original share.war, it contains version information that is needed for it to operate properly --> <archive> <addMavenDescriptor>false</addMavenDescriptor> <manifestFile>${project.build.directory}/dependency/META-INF/MANIFEST.MF</manifestFile> </archive>
Remove the {AIO_PROJECT_PATH}/alf_data_dev directory. This is needed as the H2 script artifact does not currently contain upgrade scripts.
Links:
[1] https://docs.alfresco.com/../concepts/alfresco-sdk-upgrading-what-changes-are-allowed-in-release.html
[2] https://docs.alfresco.com/../concepts/alfresco-sdk-upgrading-sdkversion-200-210.html
[3] https://docs.alfresco.com/../concepts/alfresco-sdk-upgrading-sdkversion-210-211.html
[4] https://docs.alfresco.com/../concepts/alfresco-sdk-upgrading-sdkversion-211-220.html
[5] https://docs.alfresco.com/../concepts/alfresco-sdk-upgrading.html
[6] https://docs.alfresco.com/../concepts/alfresco-sdk-upgrading-sdk-version.html
[7] https://docs.alfresco.com/../tasks/alfresco-sdk-upgrading-repo-amp-sdkversion-200-210.html
[8] https://docs.alfresco.com/../tasks/alfresco-sdk-upgrading-share-amp-sdkversion-200-210.html
[9] https://docs.alfresco.com/../tasks/alfresco-sdk-upgrading-aio-sdkversion-200-210.html
[10] https://docs.alfresco.com/alfresco-sdk-tutorials-amp-archetype.html
[11] https://docs.alfresco.com/alfresco-sdk-tutorials-share-amp-archetype.html
[12] https://docs.alfresco.com/alfresco-sdk-tutorials-all-in-one-archetype.html
[13] https://docs.alfresco.com/alfresco-sdk-advanced-add-custom-amps-aio.html
[14] https://docs.alfresco.com/../tasks/alfresco-sdk-upgrading-repo-amp-sdkversion-210-211.html
[15] https://docs.alfresco.com/../tasks/alfresco-sdk-upgrading-share-amp-sdkversion-210-211.html
[16] https://docs.alfresco.com/../tasks/alfresco-sdk-upgrading-aio-sdkversion-210-211.html
[17] https://docs.alfresco.com/../tasks/alfresco-sdk-upgrading-repo-amp-sdkversion-211-220.html
[18] https://docs.alfresco.com/../tasks/alfresco-sdk-upgrading-share-amp-sdkversion-211-220.html
[19] https://docs.alfresco.com/../tasks/alfresco-sdk-upgrading-aio-sdkversion-211-220.html