diff --git a/archetypes/alfresco-allinone-archetype/src/main/resources/archetype-resources/__rootArtifactId__-platform-jar/src/main/assembly/amp.xml b/archetypes/alfresco-allinone-archetype/src/main/resources/archetype-resources/__rootArtifactId__-platform-jar/src/main/assembly/amp.xml index e41c098c..447a6458 100644 --- a/archetypes/alfresco-allinone-archetype/src/main/resources/archetype-resources/__rootArtifactId__-platform-jar/src/main/assembly/amp.xml +++ b/archetypes/alfresco-allinone-archetype/src/main/resources/archetype-resources/__rootArtifactId__-platform-jar/src/main/assembly/amp.xml @@ -35,6 +35,11 @@ src/main/assembly/file-mapping.properties false + + + src/main/resources/alfresco/module/${project.artifactId}/log4j.properties + false + diff --git a/archetypes/alfresco-allinone-archetype/src/main/resources/archetype-resources/__rootArtifactId__-platform-jar/src/main/resources/alfresco/module/__artifactId__/log4j.properties b/archetypes/alfresco-allinone-archetype/src/main/resources/archetype-resources/__rootArtifactId__-platform-jar/src/main/resources/alfresco/module/__artifactId__/log4j.properties new file mode 100644 index 00000000..29523b48 --- /dev/null +++ b/archetypes/alfresco-allinone-archetype/src/main/resources/archetype-resources/__rootArtifactId__-platform-jar/src/main/resources/alfresco/module/__artifactId__/log4j.properties @@ -0,0 +1 @@ +# Add here module-specific custom log4j.properties configuration \ No newline at end of file diff --git a/archetypes/alfresco-allinone-archetype/src/main/resources/archetype-resources/__rootArtifactId__-share-jar/src/main/assembly/amp.xml b/archetypes/alfresco-allinone-archetype/src/main/resources/archetype-resources/__rootArtifactId__-share-jar/src/main/assembly/amp.xml index 512c9071..b8bef443 100644 --- a/archetypes/alfresco-allinone-archetype/src/main/resources/archetype-resources/__rootArtifactId__-share-jar/src/main/assembly/amp.xml +++ b/archetypes/alfresco-allinone-archetype/src/main/resources/archetype-resources/__rootArtifactId__-share-jar/src/main/assembly/amp.xml @@ -35,6 +35,11 @@ src/main/assembly/file-mapping.properties false + + + src/main/resources/alfresco/module/${project.artifactId}/log4j.properties + false + diff --git a/archetypes/alfresco-allinone-archetype/src/main/resources/archetype-resources/__rootArtifactId__-share-jar/src/main/resources/alfresco/module/__rootArtifactId__-share-jar/log4j.properties b/archetypes/alfresco-allinone-archetype/src/main/resources/archetype-resources/__rootArtifactId__-share-jar/src/main/resources/alfresco/module/__rootArtifactId__-share-jar/log4j.properties new file mode 100644 index 00000000..29523b48 --- /dev/null +++ b/archetypes/alfresco-allinone-archetype/src/main/resources/archetype-resources/__rootArtifactId__-share-jar/src/main/resources/alfresco/module/__rootArtifactId__-share-jar/log4j.properties @@ -0,0 +1 @@ +# Add here module-specific custom log4j.properties configuration \ No newline at end of file diff --git a/archetypes/alfresco-allinone-archetype/src/main/resources/archetype-resources/integration-tests/src/test/java/platformsample/DemoComponentIT.java b/archetypes/alfresco-allinone-archetype/src/main/resources/archetype-resources/integration-tests/src/test/java/platformsample/DemoComponentIT.java index d30e660d..befd9190 100644 --- a/archetypes/alfresco-allinone-archetype/src/main/resources/archetype-resources/integration-tests/src/test/java/platformsample/DemoComponentIT.java +++ b/archetypes/alfresco-allinone-archetype/src/main/resources/archetype-resources/integration-tests/src/test/java/platformsample/DemoComponentIT.java @@ -55,10 +55,9 @@ public class DemoComponentIT extends AbstractAlfrescoIT { DemoComponent demoComponent = (DemoComponent) getApplicationContext().getBean("${package}.DemoComponent"); NodeRef companyHome = demoComponent.getCompanyHome(); assertNotNull(companyHome); - String companyHomeName = (String) getServiceRegistry().getNodeService().getProperty( - companyHome, ContentModel.PROP_NAME); - assertNotNull(companyHomeName); - assertEquals("Company Home", companyHomeName); + String companyHomePath = getServiceRegistry().getNodeService().getPath(companyHome).toPrefixString(getServiceRegistry().getNamespaceService()); + assertNotNull(companyHomePath); + assertEquals("/app:company_home", companyHomePath); } @Test diff --git a/archetypes/alfresco-allinone-archetype/src/main/resources/archetype-resources/pom.xml b/archetypes/alfresco-allinone-archetype/src/main/resources/archetype-resources/pom.xml index da2207ea..e341abfd 100644 --- a/archetypes/alfresco-allinone-archetype/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/alfresco-allinone-archetype/src/main/resources/archetype-resources/pom.xml @@ -336,6 +336,56 @@ + + + net.alchim31.maven + yuicompressor-maven-plugin + 1.5.1 + + + + compress-assembly + + compress + + + ${project.basedir}/src/main/assembly/web + ${project.basedir}/src/main/assembly/web + + **/webscripts/** + **/site-webscripts/** + **/META-INF/** + **/*.lib.js + **/*.css + **/*-min.js + **/*-min.css + + true + false + + + + + compress-resources + + compress + + + + **/webscripts/** + **/site-webscripts/** + **/*.lib.js + **/*.css + **/*-min.js + **/*-min.css + + true + false + + + + + org.zeroturnaround diff --git a/archetypes/alfresco-platform-jar-archetype/src/main/resources/archetype-resources/pom.xml b/archetypes/alfresco-platform-jar-archetype/src/main/resources/archetype-resources/pom.xml index df93af69..7c7bcdac 100644 --- a/archetypes/alfresco-platform-jar-archetype/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/alfresco-platform-jar-archetype/src/main/resources/archetype-resources/pom.xml @@ -162,6 +162,56 @@ + + + net.alchim31.maven + yuicompressor-maven-plugin + 1.5.1 + + + + compress-assembly + + compress + + + ${project.basedir}/src/main/assembly/web + ${project.basedir}/src/main/assembly/web + + **/webscripts/** + **/site-webscripts/** + **/META-INF/** + **/*.lib.js + **/*.css + **/*-min.js + **/*-min.css + + true + false + + + + + compress-resources + + compress + + + + **/webscripts/** + **/site-webscripts/** + **/*.lib.js + **/*.css + **/*-min.js + **/*-min.css + + true + false + + + + + + + src/main/resources/alfresco/module/${project.artifactId}/log4j.properties + false + diff --git a/archetypes/alfresco-platform-jar-archetype/src/main/resources/archetype-resources/src/main/resources/alfresco/module/__artifactId__/log4j.properties b/archetypes/alfresco-platform-jar-archetype/src/main/resources/archetype-resources/src/main/resources/alfresco/module/__artifactId__/log4j.properties new file mode 100644 index 00000000..29523b48 --- /dev/null +++ b/archetypes/alfresco-platform-jar-archetype/src/main/resources/archetype-resources/src/main/resources/alfresco/module/__artifactId__/log4j.properties @@ -0,0 +1 @@ +# Add here module-specific custom log4j.properties configuration \ No newline at end of file diff --git a/archetypes/alfresco-share-jar-archetype/src/main/resources/archetype-resources/pom.xml b/archetypes/alfresco-share-jar-archetype/src/main/resources/archetype-resources/pom.xml index 5a59b84b..e4694044 100644 --- a/archetypes/alfresco-share-jar-archetype/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/alfresco-share-jar-archetype/src/main/resources/archetype-resources/pom.xml @@ -95,6 +95,56 @@ + + + net.alchim31.maven + yuicompressor-maven-plugin + 1.5.1 + + + + compress-assembly + + compress + + + ${project.basedir}/src/main/assembly/web + ${project.basedir}/src/main/assembly/web + + **/webscripts/** + **/site-webscripts/** + **/META-INF/** + **/*.lib.js + **/*.css + **/*-min.js + **/*-min.css + + true + false + + + + + compress-resources + + compress + + + + **/webscripts/** + **/site-webscripts/** + **/*.lib.js + **/*.css + **/*-min.js + **/*-min.css + + true + false + + + + + maven-assembly-plugin diff --git a/archetypes/alfresco-share-jar-archetype/src/main/resources/archetype-resources/src/main/assembly/amp.xml b/archetypes/alfresco-share-jar-archetype/src/main/resources/archetype-resources/src/main/assembly/amp.xml index 9f17de85..54556778 100644 --- a/archetypes/alfresco-share-jar-archetype/src/main/resources/archetype-resources/src/main/assembly/amp.xml +++ b/archetypes/alfresco-share-jar-archetype/src/main/resources/archetype-resources/src/main/assembly/amp.xml @@ -35,6 +35,11 @@ src/main/assembly/file-mapping.properties false + + + src/main/resources/alfresco/module/${project.artifactId}/log4j.properties + false + diff --git a/archetypes/alfresco-share-jar-archetype/src/main/resources/archetype-resources/src/main/resources/alfresco/module/__artifactId__/log4j.properties b/archetypes/alfresco-share-jar-archetype/src/main/resources/archetype-resources/src/main/resources/alfresco/module/__artifactId__/log4j.properties new file mode 100644 index 00000000..29523b48 --- /dev/null +++ b/archetypes/alfresco-share-jar-archetype/src/main/resources/archetype-resources/src/main/resources/alfresco/module/__artifactId__/log4j.properties @@ -0,0 +1 @@ +# Add here module-specific custom log4j.properties configuration \ No newline at end of file diff --git a/modules/alfresco-rad/src/main/java/org/alfresco/rad/SpringContextHolder.java b/modules/alfresco-rad/src/main/java/org/alfresco/rad/SpringContextHolder.java index 437f345f..17f5cb83 100644 --- a/modules/alfresco-rad/src/main/java/org/alfresco/rad/SpringContextHolder.java +++ b/modules/alfresco-rad/src/main/java/org/alfresco/rad/SpringContextHolder.java @@ -51,7 +51,7 @@ public class SpringContextHolder implements ApplicationContextAware { /** * Return the singleton instance * - * @return + * @return the singleton instance */ public static SpringContextHolder Instance() { return springContextHolderInstance; diff --git a/modules/alfresco-rad/src/main/java/org/alfresco/rad/test/AlfrescoTestRunner.java b/modules/alfresco-rad/src/main/java/org/alfresco/rad/test/AlfrescoTestRunner.java index 7cf09d2a..7a2dae02 100644 --- a/modules/alfresco-rad/src/main/java/org/alfresco/rad/test/AlfrescoTestRunner.java +++ b/modules/alfresco-rad/src/main/java/org/alfresco/rad/test/AlfrescoTestRunner.java @@ -46,6 +46,7 @@ import javax.xml.parsers.ParserConfigurationException; import java.io.*; /** + *

* This is a JUnit test runner that is designed to work with an Alfresco repository. * It detects if it's executing a test inside of a running Alfresco instance. If that * is the case the tests are all run normally. If however the test is being run from @@ -54,14 +55,15 @@ import java.io.*; * test an HTTP request is made to a Web Script in a running Alfresco instance. This * Web Script runs the test and returns enough information to this class so we can * emulate having run the test locally. - *

+ *

+ *

* By doing this, we are able to create Integration Tests (IT) using standard JUnit * capabilities. These can then be run from our IDEs with the associated visualizations, * support for re-running failed tests, etc. - *

+ *

* Integration testing framework donated by Zia Consulting * - * @author Bindu Wavell + * @author Bindu Wavell (bindu@ziaconsulting.com) * @author martin.bergljung@alfresco.com (some editing) * @since 3.0 */ @@ -104,13 +106,13 @@ public class AlfrescoTestRunner extends BlockJUnit4ClassRunner { * Call a remote Alfresco server and have the test run there. * * @param method the test method to run - * @param notifier - * @param desc + * @param notifier given @{@link RunNotifier} to notify the result of the test + * @param desc given @{@link Description} of the test to run */ protected void callProxiedChild(FrameworkMethod method, RunNotifier notifier, Description desc) { notifier.fireTestStarted(desc); - String className = method.getMethod().getDeclaringClass().getCanonicalName(); + String className = this.getTestClass().getJavaClass().getCanonicalName(); String methodName = method.getName(); if (null != methodName) { className += "#" + methodName; @@ -232,8 +234,8 @@ public class AlfrescoTestRunner extends BlockJUnit4ClassRunner { * Check the @Remote config on the test class to see where the * Alfresco Repo is running * - * @param method - * @return + * @param method given @{@link FrameworkMethod} to be executed + * @return the ACS endpoint */ protected String getContextRoot(FrameworkMethod method) { Class declaringClass = method.getMethod().getDeclaringClass(); diff --git a/modules/alfresco-rad/src/main/java/org/alfresco/rad/test/Remote.java b/modules/alfresco-rad/src/main/java/org/alfresco/rad/test/Remote.java index 0a1cfd3e..b99ce9b2 100644 --- a/modules/alfresco-rad/src/main/java/org/alfresco/rad/test/Remote.java +++ b/modules/alfresco-rad/src/main/java/org/alfresco/rad/test/Remote.java @@ -24,14 +24,15 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** + *

* By default the ${@link AlfrescoTestRunner} will attempt to find a * running Alfresco instance at http://localhost:8080/alfresco * This annotation can be applied to a test class to have the * proxy calls go to a different host/port. - *

+ *

* Integration testing framework donated by Zia Consulting. * - * @author Bindu Wavell + * @author Bindu Wavell (bindu@ziaconsulting.com) * @since 3.0 */ @Target(ElementType.TYPE) diff --git a/modules/alfresco-rad/src/main/java/org/alfresco/rad/test/RunTestWebScript.java b/modules/alfresco-rad/src/main/java/org/alfresco/rad/test/RunTestWebScript.java index bd060a6f..72877ac9 100644 --- a/modules/alfresco-rad/src/main/java/org/alfresco/rad/test/RunTestWebScript.java +++ b/modules/alfresco-rad/src/main/java/org/alfresco/rad/test/RunTestWebScript.java @@ -35,14 +35,15 @@ import java.util.List; import java.util.Map; /** + *

* This Web Script works in consort with the ${@link AlfrescoTestRunner}. When a test is run from an IDE or * command line, the Alfresco test runner sends a proxied request to perform the test to this script. This runs * the test and wraps the results up so that the test initiator can be fooled into thinking they are * running the tests locally. - *

+ *

* Integration testing framework donated by Zia Consulting. * - * @author Bindu Wavell + * @author Bindu Wavell (bindu@ziaconsulting.com) * @author martin.bergljung@alfresco.com (some editing) * @since 3.0 */ diff --git a/plugins/alfresco-maven-plugin/pom.xml b/plugins/alfresco-maven-plugin/pom.xml index 71028939..e86f26ab 100644 --- a/plugins/alfresco-maven-plugin/pom.xml +++ b/plugins/alfresco-maven-plugin/pom.xml @@ -140,6 +140,11 @@ zt-zip 1.11 + + de.schlichtherle.truezip + truezip-kernel + 7.7.9 + diff --git a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/AbstractRefreshWebappMojo.java b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/AbstractRefreshWebappMojo.java index bb236ef1..013c5f73 100644 --- a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/AbstractRefreshWebappMojo.java +++ b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/AbstractRefreshWebappMojo.java @@ -164,6 +164,8 @@ public abstract class AbstractRefreshWebappMojo extends AbstractMojo { /** * Perform a Refresh of Web Scripts container in webapp. * Called by specific refresh mojo implementation. + * + * @param url the relative path to refresh webscripts */ protected void refreshWebScripts(String url) { // Create the Refresh URL for the Alfresco Tomcat server @@ -184,6 +186,8 @@ public abstract class AbstractRefreshWebappMojo extends AbstractMojo { /** * Perform a Clear Dependency Caches call on Share webapp. * Called by specific refresh mojo implementation, currently only applicable to Share webapp. + * + * @param url the relative path to clear cache */ protected void clearDependencyCaches(String url) { // Create the Clear Cache URL for the Alfresco Tomcat server diff --git a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/AbstractRunMojo.java b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/AbstractRunMojo.java index 92171f62..d4a4a842 100644 --- a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/AbstractRunMojo.java +++ b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/AbstractRunMojo.java @@ -17,9 +17,13 @@ */ package org.alfresco.maven.plugin; +import com.google.common.collect.ImmutableSet; +import de.schlichtherle.truezip.file.TVFS; +import de.schlichtherle.truezip.fs.FsSyncException; import org.alfresco.maven.plugin.config.ModuleDependency; import org.alfresco.maven.plugin.config.TomcatDependency; import org.alfresco.maven.plugin.config.TomcatWebapp; +import org.alfresco.util.Pair; import org.apache.commons.lang.StringUtils; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; @@ -40,6 +44,7 @@ import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Set; import static org.twdata.maven.mojoexecutor.MojoExecutor.*; @@ -57,7 +62,6 @@ public abstract class AbstractRunMojo extends AbstractMojo { public static final String MAVEN_INSTALL_PLUGIN_VERSION = "2.5.2"; public static final String MAVEN_REPLACER_PLUGIN_VERSION = "1.5.3"; public static final String MAVEN_RESOURCE_PLUGIN_VERSION = "2.7"; - public static final String MAVEN_TOMCAT7_PLUGIN_VERSION = "2.2"; public static final String MAVEN_BUILD_HELPER_PLUGIN_VERSION = "1.12"; public static final String PLATFORM_WAR_PREFIX_NAME = "platform"; @@ -67,6 +71,31 @@ public abstract class AbstractRunMojo extends AbstractMojo { public static final String ALFRESCO_ENTERPRISE_EDITION = "enterprise"; public static final String ALFRESCO_COMMUNITY_EDITION = "community"; + private static final String TOMCAT_GROUP_ID = "org.apache.tomcat"; + private static final String TOMCAT_EMBED_GROUP_ID = "org.apache.tomcat.embed"; + private static final Set> TOMCAT_DEPENDENCIES = new ImmutableSet.Builder>() + .add(new Pair(TOMCAT_EMBED_GROUP_ID,"tomcat-embed-core")) + .add(new Pair(TOMCAT_GROUP_ID,"tomcat-util")) + .add(new Pair(TOMCAT_GROUP_ID,"tomcat-coyote")) + .add(new Pair(TOMCAT_GROUP_ID,"tomcat-api")) + .add(new Pair(TOMCAT_GROUP_ID,"tomcat-jdbc")) + .add(new Pair(TOMCAT_GROUP_ID,"tomcat-dbcp")) + .add(new Pair(TOMCAT_GROUP_ID,"tomcat-servlet-api")) + .add(new Pair(TOMCAT_GROUP_ID,"tomcat-jsp-api")) + .add(new Pair(TOMCAT_GROUP_ID,"tomcat-jasper")) + .add(new Pair(TOMCAT_GROUP_ID,"tomcat-jasper-el")) + .add(new Pair(TOMCAT_GROUP_ID,"tomcat-el-api")) + .add(new Pair(TOMCAT_GROUP_ID,"tomcat-catalina")) + .add(new Pair(TOMCAT_GROUP_ID,"tomcat-tribes")) + .add(new Pair(TOMCAT_GROUP_ID,"tomcat-catalina-ha")) + .add(new Pair(TOMCAT_GROUP_ID,"tomcat-annotations-api")) + .add(new Pair(TOMCAT_GROUP_ID,"tomcat-juli")) + .add(new Pair(TOMCAT_EMBED_GROUP_ID,"tomcat-embed-logging-juli")) + .add(new Pair(TOMCAT_EMBED_GROUP_ID,"tomcat-embed-logging-log4j")) + .build(); + + private static final String AMP_LOCATION_PATTERN = "%s/%s-%s.amp"; + @Component protected MavenProject project; @@ -351,6 +380,32 @@ public abstract class AbstractRunMojo extends AbstractMojo { @Parameter(property = "solr.home", defaultValue = "${project.basedir}/${alfresco.data.location}/solr") protected String solrHome; + /** + * Solr indexation frequency. It is customizable to speed up integration tests execution. + */ + @Parameter(property = "solr.alfresco.cron", defaultValue = "0/15 * * * * ? *") + protected String solrCron; + + /** + * Tomcat version to be used in the Maven Tomcat Plugin. If this parameter is not set, then the + * default Tomcat version will be used (it depends on the version of the Tomcat Maven Plugin). + */ + @Parameter(property = "maven.alfresco.tomcat.version") + protected String tomcatVersion; + + /** + * Tomcat Maven Plugin version to be used when running the project. If this parameter is not set, then the + * default Tomcat Maven Plugin version will be used (2.2). + */ + @Parameter(property = "maven.alfresco.tomcat.maven.plugin.version", defaultValue = "2.2") + protected String tomcatMavenPluginVersion; + + /** + * Location of a custom context file to use in the deployment of the platform war in Tomcat. + */ + @Parameter(property = "maven.alfresco.platform.custom.context.file") + protected String platformCustomContextFile; + /** * Maven GAV properties for customized alfresco.war, share.war, activiti-app.war * Used by the Maven Tomcat 7 Plugin @@ -372,6 +427,8 @@ public abstract class AbstractRunMojo extends AbstractMojo { /** * Get the Tomcat port. By default the port is changed by using the maven.alfresco.tomcat.port property * but for legacy and external configuration purposes maven.tomcat.port will override if defined + * + * @return the Tomcat port */ protected String getPort() { String port = tomcatPort; @@ -384,7 +441,9 @@ public abstract class AbstractRunMojo extends AbstractMojo { } /** + * Check if Tomcat is already running. * + * @return true if Tomcat is already running, false otherwise */ protected boolean tomcatIsRunning() { @@ -409,7 +468,7 @@ public abstract class AbstractRunMojo extends AbstractMojo { * Download and unpack the Solr 4 configuration as we don't have it in the project. * It will reside under /alf_data_dev/solr * - * @throws MojoExecutionException + * @throws MojoExecutionException when any problem appears unpacking the Solr configuration */ protected void unpackSolrConfig() throws MojoExecutionException { getLog().info("Unpacking Solr config"); @@ -442,7 +501,7 @@ public abstract class AbstractRunMojo extends AbstractMojo { * For windows paths, convert single \ to / for the ${alfresco.solr.data.dir} path, * by default it will be c:\bla\, we need forward slash or double backslash. * - * @throws MojoExecutionException + * @throws MojoExecutionException when any problem appears fixing the Solr home path */ protected void fixSolrHomePath() throws MojoExecutionException { getLog().info("Fix Solr Home Path to work in Windows"); @@ -469,7 +528,7 @@ public abstract class AbstractRunMojo extends AbstractMojo { * Copy custom solr configuration files over, so a * developer can overwrite any files needed * - * @throws MojoExecutionException + * @throws MojoExecutionException when any problem appears copying the Solr custom configuration */ protected void copySolrCustomConfig() throws MojoExecutionException { getLog().info("Copying custom Solr config"); @@ -498,7 +557,7 @@ public abstract class AbstractRunMojo extends AbstractMojo { * Replace property placeholders in configuration files for the cores, so the * index files can be found for each core when Solr starts up. * - * @throws MojoExecutionException + * @throws MojoExecutionException when any problem appears replacing the Solr configuration properties */ protected void replaceSolrConfigProperties() throws MojoExecutionException { getLog().info("Replacing Solr config properties"); @@ -531,8 +590,11 @@ public abstract class AbstractRunMojo extends AbstractMojo { element(name("replacement"), element(name("token"), "alfresco.secureComms=https"), element(name("value"), "alfresco.secureComms=none") + ), + element(name("replacement"), + element(name("token"), "alfresco.cron=0/15 * * * * ? *"), + element(name("value"), "alfresco.cron=" + solrCron) ) - ) ), execEnv @@ -543,7 +605,7 @@ public abstract class AbstractRunMojo extends AbstractMojo { * If we are in Alfresco version 4.2 or younger the Solr 1.0 WAR is not available as Maven artifact, just * as part of a ZIP file, so install it locally so we can deploy from embedded tomcat * - * @throws MojoExecutionException + * @throws MojoExecutionException when any problem appears installing Solr10 in the local repository */ protected void installSolr10InLocalRepo() throws MojoExecutionException { if (isPlatformVersionLtOrEqTo42()) { @@ -657,12 +719,13 @@ public abstract class AbstractRunMojo extends AbstractMojo { } /** + *

* Replaces web.xml where applicable in platform webapp (alfresco.war), * commenting out the security-constraints. - *

+ *

* This is only needed for 4.2, 5.0 (5.1 handles it automatically when turning off ssl via props) * - * @throws MojoExecutionException + * @throws MojoExecutionException when any problem appears commenting out the security configuration */ protected void commentOutSecureCommsInPlatformWebXml() throws MojoExecutionException { if (isPlatformVersionGtOrEqTo51()) { @@ -706,7 +769,7 @@ public abstract class AbstractRunMojo extends AbstractMojo { * enterprise db config) that will be used when running Alfresco. It contains database connection parameters and * other general configuration for Alfresco Repository (alfresco.war) * - * @throws MojoExecutionException + * @throws MojoExecutionException when any problem appears copying the Alfresco global properties file */ protected void copyAlfrescoGlobalProperties() throws MojoExecutionException { getLog().info("Copying and filtering alfresco-global-*.properties files to target/test-classes"); @@ -798,7 +861,7 @@ public abstract class AbstractRunMojo extends AbstractMojo { * Rename the configured database specific alfresco-global-*.properties file to * alfresco-global.properties so it will be used during Tomcat run. * - * @throws MojoExecutionException + * @throws MojoExecutionException when any problem appears renaming the alfresco global properties */ protected void renameAlfrescoGlobalProperties() throws MojoExecutionException { String alfrescoGlobalFilePath = project.getBuild().getTestOutputDirectory() + "/alfresco-global-"; @@ -846,7 +909,7 @@ public abstract class AbstractRunMojo extends AbstractMojo { * Copy the Alfresco Enterprise license to its correct place in the Platform WAR, if it exists. * It is not enough to have it on the test classpath, then it will start up as Trial license... * - * @throws MojoExecutionException + * @throws MojoExecutionException when any problem appears copying the Alfresco license */ protected void copyAlfrescoLicense() throws MojoExecutionException { if (alfrescoEdition.equals(ALFRESCO_COMMUNITY_EDITION)) { @@ -885,7 +948,7 @@ public abstract class AbstractRunMojo extends AbstractMojo { /** * Copy the Activiti Log4J Dev config into the activitiApp-war/WEB-INF/classes dir. * - * @throws MojoExecutionException + * @throws MojoExecutionException when any problem appears copying the activity Log4J dev configuration */ protected void copyActivitiLog4JDevConfig() throws MojoExecutionException { final String warOutputDir = getWarOutputDir(ACTIVITI_APP_WAR_PREFIX_NAME); @@ -920,7 +983,7 @@ public abstract class AbstractRunMojo extends AbstractMojo { /** * Copy Share Config Custom in order to have global overrides for development and dynamic port * - * @throws MojoExecutionException + * @throws MojoExecutionException when any problem appears copying share config custom file */ protected void copyShareConfigCustom() throws MojoExecutionException { final String warOutputDir = getWarOutputDir(SHARE_WAR_PREFIX_NAME); @@ -961,7 +1024,7 @@ public abstract class AbstractRunMojo extends AbstractMojo { * There is no custom classpath resolve mechanism for Share log4j, * to log custom stuff overriding standard log4j.properties is needed. * - * @throws MojoExecutionException + * @throws MojoExecutionException when any problem appears copying the share log4j configuration */ protected void copyShareLog4jConfig() throws MojoExecutionException { if (!useCustomShareLog4jConfig) { @@ -1001,7 +1064,9 @@ public abstract class AbstractRunMojo extends AbstractMojo { /** * Copy and Build hotswap-agent.properties * - * @throws MojoExecutionException + * @param warPrefix path to the war root directory + * + * @throws MojoExecutionException when any problem appears copying hotswap agent properties */ protected void copyHotswapAgentProperties(String warPrefix) throws MojoExecutionException { if ( copyHotswapAgentConfig == false ) { @@ -1035,6 +1100,8 @@ public abstract class AbstractRunMojo extends AbstractMojo { * Build the customized Platform webapp (i.e. the Repository, alfresco.war) * that should be deployed by Tomcat by applying all AMPs and JARs from * the {@code } configuration. + * + * @throws MojoExecutionException when any problem appears building the platform war */ protected void buildPlatformWar() throws MojoExecutionException { buildCustomWarInDir(PLATFORM_WAR_PREFIX_NAME, platformModules, @@ -1056,6 +1123,8 @@ public abstract class AbstractRunMojo extends AbstractMojo { * Build the customized Share webapp (i.e. the share.war) * that should be deployed by Tomcat by applying all AMPs and JARs from * the {@code } configuration. + * + * @throws MojoExecutionException when any problem appears building the share war */ protected void buildShareWar() throws MojoExecutionException { buildCustomWarInDir(SHARE_WAR_PREFIX_NAME, shareModules, @@ -1078,6 +1147,8 @@ public abstract class AbstractRunMojo extends AbstractMojo { * Build the customized Activiti App webapp (i.e. the activiti-app.war) * that should be deployed by Tomcat by applying all JARs from * the {@code } configuration. + * + * @throws MojoExecutionException when any problem appears building the activity war */ protected void buildActivitiAppWar() throws MojoExecutionException { buildCustomWarInDir(ACTIVITI_APP_WAR_PREFIX_NAME, activitiModules, @@ -1102,7 +1173,7 @@ public abstract class AbstractRunMojo extends AbstractMojo { * @param originalWarGroupId the Maven groupId for the original war file that should be customized * @param originalWarArtifactId the Maven artifactId for the original war file that should be customized * @param originalWarVersion the Maven version for the original war file that should be customized - * @throws MojoExecutionException + * @throws MojoExecutionException when any problem appears building the custom war */ protected void buildCustomWarInDir(String warName, List modules, @@ -1192,18 +1263,7 @@ public abstract class AbstractRunMojo extends AbstractMojo { ); // Then apply all these amps to the unpacked war - // Call the Alfresco Maven Plugin Install Mojo directly, so we don't have to keep SDK version info here - String ampsLocation = project.getBuild().getDirectory() + "/" + ampsModuleDir; - String warLocation = project.getBuild().getDirectory() + "/" + getWarName(warName); - InstallMojo installMojo = new InstallMojo(); - installMojo.setAmpLocation(new File(ampsLocation)); - installMojo.setWarLocation(new File(warLocation)); - installMojo.setForce(true); - try { - installMojo.execute(); - } catch (MojoFailureException e) { - e.printStackTrace(); - } + applyAMPs(warName, modules); } // Then copy all JAR dependencies to the unpacked war /target/-war/WEB-INF/lib @@ -1222,6 +1282,13 @@ public abstract class AbstractRunMojo extends AbstractMojo { execEnv ); } + + // Force the unmount of all the files mounted with TrueZIP to avoid an exception in the FsSyncShutdownHook + try { + TVFS.umount(); + } catch (final FsSyncException e) { + getLog().error(e); + } } /** @@ -1229,7 +1296,7 @@ public abstract class AbstractRunMojo extends AbstractMojo { * * @param warName the name of the custom war * @return the customized war file artifactId, to be used by the tomcat7 plugin - * @throws MojoExecutionException + * @throws MojoExecutionException when any problem appears packaging or installing the custom war */ protected String packageAndInstallCustomWar(String warName) throws MojoExecutionException { final String warArtifactId = "${project.artifactId}-" + warName; @@ -1264,6 +1331,8 @@ public abstract class AbstractRunMojo extends AbstractMojo { /** * Check that a database configuration has been supplied correctly + * + * @throws MojoExecutionException when any problem appears checking the database configuration */ protected void checkDatabaseConfig() throws MojoExecutionException { // Only do this check if we are running alfresco.war or activiti-app.war that needs a database. @@ -1294,7 +1363,7 @@ public abstract class AbstractRunMojo extends AbstractMojo { * configured in the SDK project. * * @param fork true if tomcat process should be forked - * @throws MojoExecutionException + * @throws MojoExecutionException when any problem appears starting tomcat */ protected void startTomcat(boolean fork) throws MojoExecutionException { getLog().info("Starting Tomcat, fork = " + fork); @@ -1341,10 +1410,16 @@ public abstract class AbstractRunMojo extends AbstractMojo { dependency("org.postgresql", "postgresql", "9.4-1201-jdbc41")); } + // If a custom version of Tomcat is required add the corresponding dependencies + if(StringUtils.isNotBlank(tomcatVersion)) { + addTomcatDependencies(tomcatPluginDependencies); + } + if (enablePlatform) { + String platformContextFile = StringUtils.isNotBlank(platformCustomContextFile) ? platformCustomContextFile : null; webapps2Deploy.add(createWebAppElement( runnerAlfrescoGroupId, runnerAlfrescoPlatformWarArtifactId, runnerAlfrescoPlatformVersion, - "/alfresco", null)); + "/alfresco", platformContextFile)); } if (enableShare) { @@ -1364,7 +1439,6 @@ public abstract class AbstractRunMojo extends AbstractMojo { } if (enableActivitiApp) { - webapps2Deploy.add(createWebAppElement( runnerActivitiAppGroupId, runnerActivitiAppWarArtifactId, runnerActivitiAppVersion, "/activiti-app", null)); @@ -1413,7 +1487,7 @@ public abstract class AbstractRunMojo extends AbstractMojo { plugin( groupId("org.apache.tomcat.maven"), artifactId("tomcat7-maven-plugin"), - version(MAVEN_TOMCAT7_PLUGIN_VERSION), + version(tomcatMavenPluginVersion), tomcatPluginDependencies ), goal("run"), @@ -1788,4 +1862,68 @@ public abstract class AbstractRunMojo extends AbstractMojo { private String getWarName(String baseWarName) { return baseWarName + "-war"; } + + /** + * Add all the required maven dependencies to execute a specific version of Tomcat set by the property tomcatVersion to the list of + * dependencies of the Tomcat Maven Plugin. + * + * @param tomcatPluginDependencies current list of dependencies of the Tomcat Maven Plugin + */ + private void addTomcatDependencies(List tomcatPluginDependencies) { + for(Pair tomcatDependency : TOMCAT_DEPENDENCIES) { + tomcatPluginDependencies.add(dependency(tomcatDependency.getFirst(),tomcatDependency.getSecond(),tomcatVersion)); + } + } + + /** + * Apply a list of AMPs to a specific war file. + * + * @param warName the name of the war file to apply the AMPs to + * @param modules the list of proposed modules to be applied to the war file. Only the AMP files will be applied + * @throws MojoExecutionException when any problem appears applying the AMPs to the war + */ + private void applyAMPs(String warName, List modules) throws MojoExecutionException { + final String ampsModuleDir = "modules/" + warName + "/amps"; + final String ampsLocation = project.getBuild().getDirectory() + "/" + ampsModuleDir; + final String warLocation = project.getBuild().getDirectory() + "/" + getWarName(warName); + + // Apply one AMP module each time to preserve the order applying the AMPs to the war + for(ModuleDependency module : modules) { + if(module.isAmp()) { + applyAMP(ampsLocation, warLocation, module); + } + } + } + + /** + * Apply an AMP to a specific war file. + * + * @param ampsLocation the location of the folder where the AMP is located + * @param warLocation the location of the war file to apply the AMP to + * @param ampModule the module that represents the AMP to apply + * @throws MojoExecutionException when any problem appears applying the AMP to the war + */ + private void applyAMP(String ampsLocation, String warLocation, ModuleDependency ampModule) throws MojoExecutionException { + // Call the Alfresco Maven Plugin Install Mojo directly, so we don't have to keep SDK version info here + InstallMojo installMojo = new InstallMojo(); + installMojo.setAmpLocation(new File(getAMPLocation(ampsLocation, ampModule))); + installMojo.setWarLocation(new File(warLocation)); + installMojo.setForce(true); + try { + installMojo.execute(); + } catch (MojoFailureException e) { + getLog().error(e); + } + } + + /** + * Build the location of an AMP file. + * + * @param ampsLocation the location of the folder where the AMPs are located + * @param ampModule the {@link ModuleDependency} of the AMP to build its location + * @return the location of the AMP file + */ + private String getAMPLocation(String ampsLocation, ModuleDependency ampModule) { + return String.format(AMP_LOCATION_PATTERN, ampsLocation, ampModule.getArtifactId(), ampModule.getVersion()); + } } diff --git a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/BuildWarsMojo.java b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/BuildWarsMojo.java new file mode 100644 index 00000000..153cac62 --- /dev/null +++ b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/BuildWarsMojo.java @@ -0,0 +1,96 @@ +/** + * Copyright (C) 2019 Alfresco Software Limited. + *

+ * This file is part of the Alfresco SDK. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.alfresco.maven.plugin; + +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugins.annotations.LifecyclePhase; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.ResolutionScope; + +import static org.twdata.maven.mojoexecutor.MojoExecutor.executionEnvironment; + +/** + * Alfresco Plugin mojo that is used when you want to build the Alfresco WARs without starting the server. + * + * @author Jose Luis Osorno - joseluis.osorno@ixxus.com + * @version 1.0 + * @since 3.1.0 + */ +@Mojo(name = "build-wars", + defaultPhase = LifecyclePhase.PACKAGE, + aggregator = true, + requiresDependencyResolution = ResolutionScope.TEST) +public class BuildWarsMojo extends AbstractRunMojo { + + @Override + public void execute() throws MojoExecutionException { + execEnv = executionEnvironment( + project, + session, + pluginManager + ); + + if (enableActivitiApp || enableActivitiAdmin) { + getLog().warn("*************************************************************************************************************"); + getLog().warn("*"); + getLog().warn("*"); + getLog().warn("*"); + getLog().warn("*"); + getLog().warn("*"); + getLog().warn("*"); + getLog().warn("*"); + getLog().warn("*"); + getLog().warn("*\tWARNING" ); + getLog().warn("*\tThe Activiti features in SDK 3.x are UNSUPPORTED."); + getLog().warn("*\tIt has been marked for deprecation (SDK 3.1) and will be removed in SDK 4.0."); + getLog().warn("*"); + getLog().warn("*"); + getLog().warn("*"); + getLog().warn("*"); + getLog().warn("*"); + getLog().warn("*"); + getLog().warn("*"); + getLog().warn("*************************************************************************************************************"); + } + + if (enableSolr) { + unpackSolrConfig(); + fixSolrHomePath(); + copySolrCustomConfig(); + replaceSolrConfigProperties(); + installSolr10InLocalRepo(); + } + + if (enableTestProperties && enablePlatform) { + copyAlfrescoGlobalProperties(); + renameAlfrescoGlobalProperties(); + } + + if (enablePlatform) { + buildPlatformWar(); + } + + if (enableShare) { + buildShareWar(); + } + + if (enableActivitiApp) { + buildActivitiAppWar(); + } + } +} diff --git a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/InstallMojo.java b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/InstallMojo.java index b53e25a4..4ca97688 100644 --- a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/InstallMojo.java +++ b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/InstallMojo.java @@ -26,9 +26,10 @@ import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; /** + *

* Performs a AMP to WAR overlay invoking the Alfresco Repository ModuleManagementTool. * It therefore wraps and emulates the same WAR overlay performed by Alfresco MMT. - *

+ *

* This goal will install the AMP file(s) found in ${ampLocation} onto the WAR (or exploded WAR) found in ${warLocation} * * @version $Id:$ diff --git a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/IntegrationTestMojo.java b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/IntegrationTestMojo.java index 6c36f76e..b2dbc520 100644 --- a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/IntegrationTestMojo.java +++ b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/IntegrationTestMojo.java @@ -35,12 +35,13 @@ import java.util.Properties; import static org.twdata.maven.mojoexecutor.MojoExecutor.*; /** + *

* Alfresco Plugin mojo that are used when you want to run Integration Tests. * It will package up all the Integration Test classes and execute contained * tests with the Maven Failsafe plugin. The test classes will be added * to the platform war so they can be executed remotely via - * the ${@link org.alfresco.rad.test.AlfrescoTestRunner} - *

+ * the AlfrescoTestRunner. + *

* The Alfresco RAD module is also added to the Platform WAR so * the Alfresco Test runner classes are available. * diff --git a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/RefreshMojo.java b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/RefreshMojo.java index 26427eb0..b0ff0ea8 100644 --- a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/RefreshMojo.java +++ b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/RefreshMojo.java @@ -21,11 +21,12 @@ import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; /** + *

* Refresh Alfresco Repo and Share Mojo. * Will refresh the Web Script container so new and changed * Spring Surf Web Scripts are detected. * Will also clear the dependency caches for web resources (CSS, JS, etc). - *

+ *

* It is important to execute the refresh calls in the compile phase, * otherwise the files will be copied after this and the refresh calls * will not be recognized. diff --git a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/RefreshRepoWebappMojo.java b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/RefreshRepoWebappMojo.java index c741c90a..9e38ab9b 100644 --- a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/RefreshRepoWebappMojo.java +++ b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/RefreshRepoWebappMojo.java @@ -21,10 +21,11 @@ import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; /** + *

* Refresh Alfresco Repository (alfresco.war) Mojo. * Will refresh the Web Script container so new and changed * Web Scripts are detected. - *

+ *

* It is important to execute the refresh calls in the compile phase, * otherwise the files will be copied after this and the refresh calls * will not be recognized. diff --git a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/RefreshShareWebappMojo.java b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/RefreshShareWebappMojo.java index 157e1898..30b40567 100644 --- a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/RefreshShareWebappMojo.java +++ b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/RefreshShareWebappMojo.java @@ -21,11 +21,12 @@ import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; /** + *

* Refresh Alfresco Share (share.war) Mojo. * Will refresh the Web Script container so new and changed * Spring Surf Web Scripts are detected. * Will also clear the dependency caches for web resources (CSS, JS, etc). - *

+ *

* It is important to execute the refresh calls in the compile phase, * otherwise the files will be copied after this and the refresh calls * will not be recognized. diff --git a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/VersionMojo.java b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/VersionMojo.java index 234d57fa..41d363c9 100644 --- a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/VersionMojo.java +++ b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/VersionMojo.java @@ -28,8 +28,7 @@ import org.apache.maven.project.MavenProject; /** * Removes -SNAPSHOT suffix from the version number (if present), optionally replacing it with a timestamp. - * The result is provided in the Maven property ${noSnapshotVersion} (name can be changed using - * myCustomVersion). + * The result is provided in the Maven property ${noSnapshotVersion}. * This feature is mostly needed to avoid Alfresco failing when installing AMP modules with non-numeric * versions. * @@ -67,7 +66,7 @@ public class VersionMojo extends AbstractMojo { /** * Allows to append a custom (numeric) value to the current artifact's version, * i.e. appending the SCM build number can be accomplished defining - * ${buildnumber} in the plugin + * <customVersionSuffix>${buildnumber}</customVersionSuffix> in the plugin * configuration. * * @parameter property="maven.alfresco.customVersionSuffix" diff --git a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/archiver/AmpUnArchiver.java b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/archiver/AmpUnArchiver.java index 58cdd1ec..8be254a3 100644 --- a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/archiver/AmpUnArchiver.java +++ b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/archiver/AmpUnArchiver.java @@ -14,7 +14,7 @@ import org.codehaus.plexus.component.annotations.Requirement; import org.codehaus.plexus.util.xml.Xpp3Dom; /** * This class provides AMP unpacking support for projects depending on AMPs - * This allows for example AMPs to be specified as in the maven-war-plugin + * This allows for example AMPs to be specified as <overlay> in the maven-war-plugin * @author mindthegab * */ diff --git a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/config/ModuleDependency.java b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/config/ModuleDependency.java index 7e2690e8..5d5d3f04 100644 --- a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/config/ModuleDependency.java +++ b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/config/ModuleDependency.java @@ -21,15 +21,18 @@ package org.alfresco.maven.plugin.config; import org.apache.commons.lang.StringUtils; /** + *

* Defines an Alfresco extension module dependency (JAR or AMP) to be * overlayed on an Alfresco webapp file. - *

+ *

+ *

* This is so we can skip the WAR projects in the AIO project, * and so we can include the Share Services AMP when running * with a simple platform JAR. - *

+ *

+ *

* This class is used by the RunMojo class. - *

+ *

* Alfresco Maven Plugin config looks something like this: *
  *    {@code
diff --git a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/config/TomcatDependency.java b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/config/TomcatDependency.java
index 7fcb5122..05c64429 100644
--- a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/config/TomcatDependency.java
+++ b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/config/TomcatDependency.java
@@ -19,8 +19,9 @@
 package org.alfresco.maven.plugin.config;
 
 /**
+ * 

* Tomcat Dependency used in Embedded Tomcat Maven plugin configuration. - *

+ *

* Alfresco Maven Plugin config looks something like this: *
  *    {@code
diff --git a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/config/TomcatWebapp.java b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/config/TomcatWebapp.java
index f4793300..f489bb9e 100644
--- a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/config/TomcatWebapp.java
+++ b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/config/TomcatWebapp.java
@@ -18,11 +18,12 @@
 package org.alfresco.maven.plugin.config;
 
 /**
+ * 

* Tomcat Webapp used in Embedded Tomcat Maven plugin configuration. * These are custom webapps that you would want to include for some reason * (The {webapp artifact}.war need to be available in a Maven Repo). * Note. the standard webapps are included with plugin properties such as enablePlatform and enableShare. - *

+ *

* Alfresco Maven Plugin config looks something like this: *
  *    {@code
diff --git a/pom.xml b/pom.xml
index c3a8f397..e4a2af28 100644
--- a/pom.xml
+++ b/pom.xml
@@ -152,6 +152,59 @@
                         ${skipTests}
                     
                 
+                
+                    org.apache.maven.plugins
+                    maven-javadoc-plugin
+                    
+                        
+                            
+                                goal
+                                a
+                                Goal:
+                            
+                            
+                                requiresDependencyResolution
+                                a
+                                Requires Dependency Resolution:
+                            
+                            
+                                description
+                                a
+                                Description:
+                            
+                            
+                                phase
+                                a
+                                Phase:
+                            
+                            
+                                requiresProject
+                                a
+                                Requires Project:
+                            
+                            
+                                threadSafe
+                                a
+                                Thread-Safe:
+                            
+                            
+                                required
+                                a
+                                Required:
+                            
+                            
+                                readonly
+                                a
+                                Read only:
+                            
+                            
+                                parameter
+                                a
+                                Parameter:
+                            
+                        
+                    
+