All tests pass on my localhost...committing to see how it works on hudson.

git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@672782 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
John Dennis Casey 2008-06-30 14:35:43 +00:00
parent 4c5f43abf9
commit 5c32bc6b28
23 changed files with 1708 additions and 200 deletions

View File

@ -46,7 +46,6 @@ import org.codehaus.plexus.logging.Logger;
import java.util.List; import java.util.List;
import java.io.IOException; import java.io.IOException;
import java.util.Iterator; import java.util.Iterator;
import java.util.Collection;
import java.util.Set; import java.util.Set;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
@ -156,16 +155,16 @@ public privileged aspect Maven20xCompatAspect
// Intercept retrieval of artifact dependencies of an extension, inject plexus-utils if it's not there. // Intercept retrieval of artifact dependencies of an extension, inject plexus-utils if it's not there.
private pointcut extDepArtifactsResolved( DefaultExtensionManager mgr ): private pointcut extDepArtifactsResolved( DefaultExtensionManager mgr ):
call( public Set ResolutionGroup+.getArtifacts() ) call( public Set<Artifact> ResolutionGroup+.getArtifacts() )
&& within( DefaultExtensionManager+ ) && within( DefaultExtensionManager+ )
&& this( mgr ) && this( mgr )
&& notHere(); && notHere();
// We use the same hack here to make sure that plexus 1.1 is available for extensions that do // We use the same hack here to make sure that plexus 1.1 is available for extensions that do
// not declare plexus-utils but need it. MNG-2900 // not declare plexus-utils but need it. MNG-2900
Set around( DefaultExtensionManager mgr ): extDepArtifactsResolved( mgr ) Set<Artifact> around( DefaultExtensionManager mgr ): extDepArtifactsResolved( mgr )
{ {
Set result = proceed( mgr ); Set<Artifact> result = proceed( mgr );
result = checkPlexusUtils( result, mgr.artifactFactory ); result = checkPlexusUtils( result, mgr.artifactFactory );
@ -174,14 +173,14 @@ public privileged aspect Maven20xCompatAspect
// Intercept retrieval of artifact dependencies of a plugin, inject plexus-utils if it's not there. // Intercept retrieval of artifact dependencies of a plugin, inject plexus-utils if it's not there.
private pointcut pluginDepArtifactsResolved( DefaultPluginManager mgr ): private pointcut pluginDepArtifactsResolved( DefaultPluginManager mgr ):
call( public Set ResolutionGroup+.getArtifacts() ) call( public Set<Artifact> ResolutionGroup+.getArtifacts() )
&& cflow( execution( Set DefaultPluginManager+.getPluginArtifacts(..) ) ) && cflow( execution( List<Artifact> DefaultPluginManager+.getPluginArtifacts(..) ) )
&& this( mgr ) && this( mgr )
&& notHere(); && notHere();
Set around( DefaultPluginManager mgr ): pluginDepArtifactsResolved( mgr ) Set<Artifact> around( DefaultPluginManager mgr ): pluginDepArtifactsResolved( mgr )
{ {
Set result = proceed( mgr ); Set<Artifact> result = proceed( mgr );
result = checkPlexusUtils( result, mgr.artifactFactory ); result = checkPlexusUtils( result, mgr.artifactFactory );
@ -306,7 +305,7 @@ public privileged aspect Maven20xCompatAspect
// UTILITIES // UTILITIES
// -------------------------- // --------------------------
private Set checkPlexusUtils( Set dependencyArtifacts, ArtifactFactory artifactFactory ) private Set<Artifact> checkPlexusUtils( Set<Artifact> dependencyArtifacts, ArtifactFactory artifactFactory )
{ {
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// If the plugin already declares a dependency on plexus-utils then we're all // If the plugin already declares a dependency on plexus-utils then we're all
@ -354,7 +353,7 @@ public privileged aspect Maven20xCompatAspect
"jar" ); "jar" );
} }
Set result = new LinkedHashSet( dependencyArtifacts ); Set<Artifact> result = new LinkedHashSet<Artifact>( dependencyArtifacts );
result.add( plexusUtilsArtifact ); result.add( plexusUtilsArtifact );
return result; return result;

View File

@ -1,5 +1,6 @@
package org.apache.maven.errors; package org.apache.maven.errors;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.ArtifactResolutionException; import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.artifact.resolver.ArtifactNotFoundException; import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
import org.apache.maven.artifact.resolver.ArtifactResolutionResult; import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
@ -22,6 +23,7 @@ import org.apache.maven.model.Plugin;
import org.apache.maven.extension.ExtensionScanningException; import org.apache.maven.extension.ExtensionScanningException;
import org.apache.maven.extension.DefaultBuildExtensionScanner; import org.apache.maven.extension.DefaultBuildExtensionScanner;
import org.apache.maven.project.artifact.InvalidDependencyVersionException; import org.apache.maven.project.artifact.InvalidDependencyVersionException;
import org.apache.maven.project.ProjectBuilderConfiguration;
import org.apache.maven.project.interpolation.ModelInterpolator; import org.apache.maven.project.interpolation.ModelInterpolator;
import org.apache.maven.project.interpolation.ModelInterpolationException; import org.apache.maven.project.interpolation.ModelInterpolationException;
import org.apache.maven.extension.ExtensionManagerException; import org.apache.maven.extension.ExtensionManagerException;
@ -32,18 +34,17 @@ import org.apache.maven.plugin.version.DefaultPluginVersionManager;
import org.apache.maven.realm.RealmManagementException; import org.apache.maven.realm.RealmManagementException;
import org.apache.maven.execution.RuntimeInformation; import org.apache.maven.execution.RuntimeInformation;
import org.apache.maven.artifact.metadata.ArtifactMetadataSource; import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
import org.apache.maven.artifact.versioning.VersionRange;
import java.io.File; import java.io.File;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
public privileged aspect ExtensionErrorReporterAspect public privileged aspect ExtensionErrorReporterAspect
extends AbstractCoreReporterAspect extends AbstractCoreReporterAspect
{ {
before( ProjectBuildingException cause ): before( ProjectBuildingException cause ):
withincode( List DefaultBuildExtensionScanner.getInitialRemoteRepositories() ) withincode( List<ArtifactRepository> DefaultBuildExtensionScanner.getInitialRemoteRepositories( ProjectBuilderConfiguration ) )
&& call( ExtensionScanningException.new( String, ProjectBuildingException ) ) && call( ExtensionScanningException.new( String, ProjectBuildingException ) )
&& args( *, cause ) && args( *, cause )
{ {
@ -54,14 +55,14 @@ public privileged aspect ExtensionErrorReporterAspect
execution( void DefaultBuildExtensionScanner.scanInternal( File, MavenExecutionRequest, .. ) ) execution( void DefaultBuildExtensionScanner.scanInternal( File, MavenExecutionRequest, .. ) )
&& args( pomFile, request, .. ); && args( pomFile, request, .. );
after( File pomFile, MavenExecutionRequest request, Model model, Map inheritedValues ) after( File pomFile, MavenExecutionRequest request, Model model, ProjectBuilderConfiguration config )
throwing( ModelInterpolationException cause ): throwing( ModelInterpolationException cause ):
cflow( dbes_scanInternal( pomFile, request ) ) cflow( dbes_scanInternal( pomFile, request ) )
&& within( DefaultBuildExtensionScanner ) && within( DefaultBuildExtensionScanner )
&& call( Model ModelInterpolator+.interpolate( Model, Map, .. ) ) && call( Model ModelInterpolator+.interpolate( Model, File, ProjectBuilderConfiguration, .. ) )
&& args( model, inheritedValues, .. ) && args( model, *, config, .. )
{ {
getReporter().reportErrorInterpolatingModel( model, inheritedValues, pomFile, request, cause ); getReporter().reportErrorInterpolatingModel( model, new HashMap( config.getExecutionProperties() ), pomFile, request, cause );
} }
private pointcut dem_addExtension( Artifact extensionArtifact, Artifact projectArtifact, List remoteRepos, MavenExecutionRequest request ): private pointcut dem_addExtension( Artifact extensionArtifact, Artifact projectArtifact, List remoteRepos, MavenExecutionRequest request ):

View File

@ -20,6 +20,7 @@ package org.apache.maven.extension;
*/ */
import org.apache.maven.artifact.ArtifactUtils; import org.apache.maven.artifact.ArtifactUtils;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.execution.MavenExecutionRequest; import org.apache.maven.execution.MavenExecutionRequest;
import org.apache.maven.model.Build; import org.apache.maven.model.Build;
import org.apache.maven.model.Extension; import org.apache.maven.model.Extension;
@ -157,12 +158,25 @@ public class DefaultBuildExtensionScanner
String key = createKey( model ); String key = createKey( model );
if ( inheritedInterpolationValues == null ) ProjectBuilderConfiguration config = request.getProjectBuildingConfiguration();
Properties execProps = new Properties();
if ( config.getExecutionProperties() != null )
{
execProps.putAll( config.getExecutionProperties() );
}
if ( inheritedInterpolationValues != null )
{
execProps.putAll( inheritedInterpolationValues );
}
else
{ {
inheritedInterpolationValues = new HashMap(); inheritedInterpolationValues = new HashMap();
} }
model = modelInterpolator.interpolate( model, modelPom.getParentFile(), request.getProjectBuildingConfiguration(), getLogger().isDebugEnabled() ); config.setExecutionProperties( execProps );
model = modelInterpolator.interpolate( model, modelPom.getParentFile(), config, getLogger().isDebugEnabled() );
grabManagedPluginsWithExtensionsFlagTurnedOn( model, managedPluginsWithExtensionsFlag ); grabManagedPluginsWithExtensionsFlagTurnedOn( model, managedPluginsWithExtensionsFlag );
@ -437,7 +451,7 @@ public class DefaultBuildExtensionScanner
return lineage; return lineage;
} }
private List getInitialRemoteRepositories( ProjectBuilderConfiguration config ) private List<ArtifactRepository> getInitialRemoteRepositories( ProjectBuilderConfiguration config )
throws ExtensionScanningException throws ExtensionScanningException
{ {
if ( basicSuperProject == null ) if ( basicSuperProject == null )

View File

@ -34,9 +34,6 @@ import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
import org.apache.maven.artifact.resolver.ArtifactResolutionResult; import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
import org.apache.maven.artifact.resolver.ArtifactResolver; import org.apache.maven.artifact.resolver.ArtifactResolver;
import org.apache.maven.artifact.resolver.filter.ArtifactFilter; import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
import org.apache.maven.artifact.versioning.VersionRange;
import org.apache.maven.execution.MavenExecutionRequest; import org.apache.maven.execution.MavenExecutionRequest;
import org.apache.maven.execution.MavenSession; import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Extension; import org.apache.maven.model.Extension;
@ -294,7 +291,7 @@ public class DefaultExtensionManager
private void addExtension( Artifact extensionArtifact, private void addExtension( Artifact extensionArtifact,
Artifact projectArtifact, Artifact projectArtifact,
List remoteRepositories, List<ArtifactRepository> remoteRepositories,
MavenExecutionRequest request, MavenExecutionRequest request,
ActiveArtifactResolver activeArtifactResolver, ActiveArtifactResolver activeArtifactResolver,
String projectGroupId, String projectGroupId,
@ -331,7 +328,7 @@ public class DefaultExtensionManager
extensionArtifact.getId() + "': " + e.getMessage(), extensionArtifact, projectGroupId, projectArtifactId, projectVersion, e ); extensionArtifact.getId() + "': " + e.getMessage(), extensionArtifact, projectGroupId, projectArtifactId, projectVersion, e );
} }
Set dependencies = new LinkedHashSet(); Set<Artifact> dependencies = new LinkedHashSet<Artifact>();
dependencies.add( extensionArtifact ); dependencies.add( extensionArtifact );
dependencies.addAll( resolutionGroup.getArtifacts() ); dependencies.addAll( resolutionGroup.getArtifacts() );
@ -438,54 +435,4 @@ public class DefaultExtensionManager
return projectDependencyConflictId.equals( depConflictId ) || passThroughFilter.include( artifact ); return projectDependencyConflictId.equals( depConflictId ) || passThroughFilter.include( artifact );
} }
} }
public static void checkPlexusUtils( ResolutionGroup resolutionGroup, ArtifactFactory artifactFactory )
{
// ----------------------------------------------------------------------------
// If the plugin already declares a dependency on plexus-utils then we're all
// set as the plugin author is aware of its use. If we don't have a dependency
// on plexus-utils then we must protect users from stupid plugin authors who
// did not declare a direct dependency on plexus-utils because the version
// Maven uses is hidden from downstream use. We will also bump up any
// anything below 1.1 to 1.1 as this mimics the behaviour in 2.0.5 where
// plexus-utils 1.1 was being forced into use.
// ----------------------------------------------------------------------------
VersionRange vr = null;
try
{
vr = VersionRange.createFromVersionSpec( "[1.1,)" );
}
catch ( InvalidVersionSpecificationException e )
{
// Won't happen
}
boolean plexusUtilsPresent = false;
for ( Iterator i = resolutionGroup.getArtifacts().iterator(); i.hasNext(); )
{
Artifact a = (Artifact) i.next();
if ( a.getArtifactId().equals( "plexus-utils" ) &&
vr.containsVersion( new DefaultArtifactVersion( a.getVersion() ) ) )
{
plexusUtilsPresent = true;
break;
}
}
if ( !plexusUtilsPresent )
{
// We will add plexus-utils as every plugin was getting this anyway from Maven itself. We will set the
// version to the latest version we know that works as of the 2.0.6 release. We set the scope to runtime
// as this is what's implicitly happening in 2.0.6.
resolutionGroup.getArtifacts().add( artifactFactory.createArtifact( "org.codehaus.plexus",
"plexus-utils", "1.1",
Artifact.SCOPE_RUNTIME, "jar" ) );
}
}
} }

View File

@ -58,6 +58,7 @@ import org.apache.maven.project.MavenProjectBuilder;
import org.apache.maven.project.ProjectBuildingException; import org.apache.maven.project.ProjectBuildingException;
import org.apache.maven.project.artifact.InvalidDependencyVersionException; import org.apache.maven.project.artifact.InvalidDependencyVersionException;
import org.apache.maven.project.artifact.MavenMetadataSource; import org.apache.maven.project.artifact.MavenMetadataSource;
import org.apache.maven.project.interpolation.ModelInterpolationException;
import org.apache.maven.project.path.PathTranslator; import org.apache.maven.project.path.PathTranslator;
import org.apache.maven.realm.MavenRealmManager; import org.apache.maven.realm.MavenRealmManager;
import org.apache.maven.realm.RealmManagementException; import org.apache.maven.realm.RealmManagementException;
@ -269,15 +270,17 @@ public class DefaultPluginManager
{ {
projectPlugin = plugin; projectPlugin = plugin;
} }
else if ( projectPlugin.getVersion() == null || else if ( projectPlugin.getVersion() == null ||
Artifact.RELEASE_VERSION.equals(projectPlugin.getVersion()) || Artifact.RELEASE_VERSION.equals(projectPlugin.getVersion()) ||
Artifact.LATEST_VERSION.equals(projectPlugin.getVersion())) Artifact.LATEST_VERSION.equals(projectPlugin.getVersion()))
{ {
projectPlugin.setVersion( plugin.getVersion() ); projectPlugin.setVersion( plugin.getVersion() );
} }
List artifacts = getPluginArtifacts( pluginArtifact, projectPlugin, project, Set<Artifact> artifactSet = getPluginArtifacts( pluginArtifact, projectPlugin, project, session.getLocalRepository() );
session.getLocalRepository() );
List<Artifact> artifacts = ( artifactSet == null || artifactSet.isEmpty() )
? new ArrayList<Artifact>() : new ArrayList<Artifact>( artifactSet );
getLogger().debug( "Got plugin artifacts:\n\n" + artifacts ); getLogger().debug( "Got plugin artifacts:\n\n" + artifacts );
@ -347,7 +350,7 @@ public class DefaultPluginManager
} }
else else
{ {
List managedPluginArtifacts = realmManager.getPluginArtifacts( projectPlugin ); List<Artifact> managedPluginArtifacts = realmManager.getPluginArtifacts( projectPlugin );
if ( ( managedPluginArtifacts == null ) || ( managedPluginArtifacts.isEmpty() && !artifacts.isEmpty() ) ) if ( ( managedPluginArtifacts == null ) || ( managedPluginArtifacts.isEmpty() && !artifacts.isEmpty() ) )
{ {
@ -356,14 +359,14 @@ public class DefaultPluginManager
} }
} }
private List getPluginArtifacts( Artifact pluginArtifact, private Set<Artifact> getPluginArtifacts( Artifact pluginArtifact,
Plugin plugin, Plugin plugin,
MavenProject project, MavenProject project,
ArtifactRepository localRepository ) ArtifactRepository localRepository )
throws InvalidPluginException, ArtifactNotFoundException, ArtifactResolutionException throws InvalidPluginException, ArtifactNotFoundException, ArtifactResolutionException
{ {
Set projectPluginDependencies; Set<Artifact> projectPluginDependencies;
try try
{ {
@ -417,7 +420,7 @@ public class DefaultPluginManager
// checkPlexusUtils( resolutionGroup, artifactFactory ); // checkPlexusUtils( resolutionGroup, artifactFactory );
Set dependencies = new LinkedHashSet(); Set<Artifact> dependencies = new LinkedHashSet<Artifact>();
// resolve the plugin dependencies specified in <plugin><dependencies> first: // resolve the plugin dependencies specified in <plugin><dependencies> first:
dependencies.addAll( projectPluginDependencies ); dependencies.addAll( projectPluginDependencies );
@ -445,16 +448,18 @@ public class DefaultPluginManager
artifactMetadataSource, artifactMetadataSource,
filter ); filter );
List resolved = new ArrayList( result.getArtifacts() ); Set<Artifact> resolved = new HashSet<Artifact>();
for ( Iterator it = resolved.iterator(); it.hasNext(); ) for ( Iterator<Artifact> it = result.getArtifacts().iterator(); it.hasNext(); )
{ {
Artifact artifact = (Artifact) it.next(); Artifact artifact = it.next();
if ( !artifact.equals( pluginArtifact ) ) if ( !artifact.equals( pluginArtifact ) )
{ {
artifact = project.replaceWithActiveArtifact( artifact ); artifact = project.replaceWithActiveArtifact( artifact );
} }
resolved.add( artifact );
} }
getLogger().debug( getLogger().debug(
@ -502,6 +507,18 @@ public class DefaultPluginManager
getLogger().warn( "Mojo: " + mojoDescriptor.getGoal() + " is deprecated.\n" + mojoDescriptor.getDeprecated() ); getLogger().warn( "Mojo: " + mojoDescriptor.getGoal() + " is deprecated.\n" + mojoDescriptor.getDeprecated() );
} }
if ( !project.isConcrete() )
{
try
{
mavenProjectBuilder.calculateConcreteState( project, session.getProjectBuilderConfiguration() );
}
catch ( ModelInterpolationException e )
{
throw new PluginManagerException( mojoDescriptor, project, "Failed to calculate concrete state for project.", e );
}
}
if ( mojoDescriptor.isDependencyResolutionRequired() != null ) if ( mojoDescriptor.isDependencyResolutionRequired() != null )
{ {
Collection projects; Collection projects;
@ -674,6 +691,15 @@ public class DefaultPluginManager
Thread.currentThread().setContextClassLoader( oldClassLoader ); Thread.currentThread().setContextClassLoader( oldClassLoader );
} }
try
{
mavenProjectBuilder.restoreDynamicState( project, session.getProjectBuilderConfiguration() );
}
catch ( ModelInterpolationException e )
{
throw new PluginManagerException( mojoDescriptor, project, "Failed to restore dynamic state for project.", e );
}
} }
private Plugin createDummyPlugin( PluginDescriptor pluginDescriptor ) private Plugin createDummyPlugin( PluginDescriptor pluginDescriptor )

View File

@ -32,6 +32,8 @@ import org.codehaus.plexus.util.interpolation.PropertiesBasedValueSource;
import org.codehaus.plexus.util.interpolation.RegexBasedInterpolator; import org.codehaus.plexus.util.interpolation.RegexBasedInterpolator;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException; import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import hidden.org.codehaus.plexus.interpolation.InterpolationException;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.Reader; import java.io.Reader;
@ -119,9 +121,19 @@ public class DefaultMavenSettingsBuilder
interpolator.addValueSource( new EnvarBasedValueSource() ); interpolator.addValueSource( new EnvarBasedValueSource() );
serializedSettings = interpolator.interpolate( try
serializedSettings, {
"settings" ); serializedSettings = interpolator.interpolate(
serializedSettings,
"settings" );
}
catch ( InterpolationException e )
{
IOException error = new IOException( "Failed to interpolate settings." );
error.initCause( e );
throw error;
}
Settings result = new SettingsXpp3Reader().read( new StringReader( serializedSettings ) ); Settings result = new SettingsXpp3Reader().read( new StringReader( serializedSettings ) );

View File

@ -206,7 +206,7 @@ under the License.
<plugins> <plugins>
<plugin> <plugin>
<artifactId>maven-assembly-plugin</artifactId> <artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-1</version> <version>2.2-beta-2</version>
<executions> <executions>
<execution> <execution>
<id>create-distro</id> <id>create-distro</id>
@ -216,7 +216,7 @@ under the License.
</goals> </goals>
<configuration> <configuration>
<descriptor>src/main/assembly/bin.xml</descriptor> <descriptor>src/main/assembly/bin.xml</descriptor>
<finalName>apache-maven-${pom.version}</finalName> <finalName>apache-maven-${project.version}</finalName>
</configuration> </configuration>
</execution> </execution>
</executions> </executions>

View File

@ -30,6 +30,8 @@ import org.codehaus.plexus.util.interpolation.EnvarBasedValueSource;
import org.codehaus.plexus.util.interpolation.MapBasedValueSource; import org.codehaus.plexus.util.interpolation.MapBasedValueSource;
import org.codehaus.plexus.util.interpolation.RegexBasedInterpolator; import org.codehaus.plexus.util.interpolation.RegexBasedInterpolator;
import hidden.org.codehaus.plexus.interpolation.InterpolationException;
import java.io.IOException; import java.io.IOException;
public class FileProfileActivator public class FileProfileActivator
@ -67,7 +69,21 @@ public class FileProfileActivator
if ( StringUtils.isNotEmpty( fileString ) ) if ( StringUtils.isNotEmpty( fileString ) )
{ {
fileString = StringUtils.replace( interpolator.interpolate( fileString, "" ), "\\", "/" ); try
{
fileString = StringUtils.replace( interpolator.interpolate( fileString, "" ), "\\", "/" );
}
catch ( InterpolationException e )
{
if ( logger.isDebugEnabled() )
{
logger.debug( "Failed to interpolate exists file location for profile activator: " + fileString, e );
}
else
{
logger.warn( "Failed to interpolate exists file location for profile activator: " + fileString + ". Run in debug mode (-X) for more information." );
}
}
boolean result = FileUtils.fileExists( fileString ); boolean result = FileUtils.fileExists( fileString );
@ -84,7 +100,21 @@ public class FileProfileActivator
if ( StringUtils.isNotEmpty( fileString ) ) if ( StringUtils.isNotEmpty( fileString ) )
{ {
fileString = StringUtils.replace( interpolator.interpolate( fileString, "" ), "\\", "/" ); try
{
fileString = StringUtils.replace( interpolator.interpolate( fileString, "" ), "\\", "/" );
}
catch ( InterpolationException e )
{
if ( logger.isDebugEnabled() )
{
logger.debug( "Failed to interpolate missing file location for profile activator: " + fileString, e );
}
else
{
logger.warn( "Failed to interpolate missing file location for profile activator: " + fileString + ". Run in debug mode (-X) for more information." );
}
}
boolean result = !FileUtils.fileExists( fileString ); boolean result = !FileUtils.fileExists( fileString );

View File

@ -45,8 +45,10 @@ import org.apache.maven.model.Exclusion;
import org.apache.maven.model.Extension; import org.apache.maven.model.Extension;
import org.apache.maven.model.Model; import org.apache.maven.model.Model;
import org.apache.maven.model.Plugin; import org.apache.maven.model.Plugin;
import org.apache.maven.model.PluginManagement;
import org.apache.maven.model.ReportPlugin; import org.apache.maven.model.ReportPlugin;
import org.apache.maven.model.Repository; import org.apache.maven.model.Repository;
import org.apache.maven.model.Resource;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader; import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.apache.maven.profiles.MavenProfilesBuilder; import org.apache.maven.profiles.MavenProfilesBuilder;
import org.apache.maven.profiles.ProfileManager; import org.apache.maven.profiles.ProfileManager;
@ -317,7 +319,7 @@ public class DefaultMavenProjectBuilder
// we shouldn't be swallowing exceptions, no matter how unlikely. // we shouldn't be swallowing exceptions, no matter how unlikely.
// or, if we do, we should pay attention to the one coming from getSuperModel()... // or, if we do, we should pay attention to the one coming from getSuperModel()...
throw new ProjectBuildingException( STANDALONE_SUPERPOM_GROUPID + ":" throw new ProjectBuildingException( STANDALONE_SUPERPOM_GROUPID + ":"
+ STANDALONE_SUPERPOM_ARTIFACTID, + STANDALONE_SUPERPOM_ARTIFACTID,
"Maven super-POM contains an invalid repository!", "Maven super-POM contains an invalid repository!",
e ); e );
} }
@ -326,7 +328,7 @@ public class DefaultMavenProjectBuilder
// we shouldn't be swallowing exceptions, no matter how unlikely. // we shouldn't be swallowing exceptions, no matter how unlikely.
// or, if we do, we should pay attention to the one coming from getSuperModel()... // or, if we do, we should pay attention to the one coming from getSuperModel()...
throw new ProjectBuildingException( STANDALONE_SUPERPOM_GROUPID + ":" throw new ProjectBuildingException( STANDALONE_SUPERPOM_GROUPID + ":"
+ STANDALONE_SUPERPOM_ARTIFACTID, + STANDALONE_SUPERPOM_ARTIFACTID,
"Maven super-POM contains an invalid expressions!", "Maven super-POM contains an invalid expressions!",
e ); e );
} }
@ -537,8 +539,8 @@ public class DefaultMavenProjectBuilder
else else
{ {
getLogger().warn( "Attempting to build MavenProject instance for Artifact (" + artifact.getGroupId() + ":" getLogger().warn( "Attempting to build MavenProject instance for Artifact (" + artifact.getGroupId() + ":"
+ artifact.getArtifactId() + ":" + artifact.getVersion() + ") of type: " + artifact.getArtifactId() + ":" + artifact.getVersion() + ") of type: "
+ artifact.getType() + "; constructing POM artifact instead." ); + artifact.getType() + "; constructing POM artifact instead." );
projectArtifact = artifactFactory.createProjectArtifact( artifact.getGroupId(), projectArtifact = artifactFactory.createProjectArtifact( artifact.getGroupId(),
artifact.getArtifactId(), artifact.getArtifactId(),
@ -829,9 +831,6 @@ public class DefaultMavenProjectBuilder
// the plugin tools compose basedir and scriptSourceRoot into a single file. // the plugin tools compose basedir and scriptSourceRoot into a single file.
project.addScriptSourceRoot( build.getScriptSourceDirectory() ); project.addScriptSourceRoot( build.getScriptSourceDirectory() );
getLogger().debug( "Aligning project: " + project.getId() + " to base directory: " + projectDescriptor.getParentFile() );
pathTranslator.alignToBaseDirectory( project.getModel(), projectDescriptor.getParentFile() );
project.addCompileSourceRoot( build.getSourceDirectory() ); project.addCompileSourceRoot( build.getSourceDirectory() );
project.addTestCompileSourceRoot( build.getTestSourceDirectory() ); project.addTestCompileSourceRoot( build.getTestSourceDirectory() );
@ -906,8 +905,8 @@ public class DefaultMavenProjectBuilder
catch ( InvalidRepositoryException e ) catch ( InvalidRepositoryException e )
{ {
throw new ProjectBuildingException( safeVersionlessKey( model.getGroupId(), model.getArtifactId() ), throw new ProjectBuildingException( safeVersionlessKey( model.getGroupId(), model.getArtifactId() ),
"Failed to construct ArtifactRepository instances for repositories declared in: " "Failed to construct ArtifactRepository instances for repositories declared in: " +
+ model.getId(), e ); model.getId(), e );
} }
} }
} }
@ -973,8 +972,14 @@ public class DefaultMavenProjectBuilder
projectDir = pomFile.getAbsoluteFile().getParentFile(); projectDir = pomFile.getAbsoluteFile().getParentFile();
} }
Build dynamicBuild = model.getBuild();
model.setBuild( ModelUtils.cloneBuild( dynamicBuild ) );
model = modelInterpolator.interpolate( model, projectDir, config, getLogger().isDebugEnabled() ); model = modelInterpolator.interpolate( model, projectDir, config, getLogger().isDebugEnabled() );
mergeDeterministicBuildElements( model.getBuild(), dynamicBuild );
model.setBuild( dynamicBuild );
// We must inject any imported dependencyManagement information ahead of the defaults injection. // We must inject any imported dependencyManagement information ahead of the defaults injection.
if ( !isSuperPom ) if ( !isSuperPom )
{ {
@ -1063,6 +1068,510 @@ public class DefaultMavenProjectBuilder
return project; return project;
} }
// TODO: Remove this!
@SuppressWarnings("unchecked")
private void mergeDeterministicBuildElements( Build interpolatedBuild,
Build dynamicBuild )
{
List<Plugin> dPlugins = dynamicBuild.getPlugins();
if ( dPlugins != null )
{
List<Plugin> iPlugins = interpolatedBuild.getPlugins();
for ( int i = 0; i < dPlugins.size(); i++ )
{
Plugin dPlugin = dPlugins.get( i );
Plugin iPlugin = iPlugins.get( i );
dPlugin.setGroupId( iPlugin.getGroupId() );
dPlugin.setArtifactId( iPlugin.getArtifactId() );
dPlugin.setVersion( iPlugin.getVersion() );
}
}
PluginManagement dPluginMgmt = dynamicBuild.getPluginManagement();
if ( dPluginMgmt != null )
{
PluginManagement iPluginMgmt = interpolatedBuild.getPluginManagement();
dPlugins = dPluginMgmt.getPlugins();
if ( dPlugins != null )
{
List<Plugin> iPlugins = iPluginMgmt.getPlugins();
for ( int i = 0; i < dPlugins.size(); i++ )
{
Plugin dPlugin = dPlugins.get( i );
Plugin iPlugin = iPlugins.get( i );
dPlugin.setGroupId( iPlugin.getGroupId() );
dPlugin.setArtifactId( iPlugin.getArtifactId() );
dPlugin.setVersion( iPlugin.getVersion() );
}
}
}
if ( dynamicBuild.getExtensions() != null )
{
dynamicBuild.setExtensions( interpolatedBuild.getExtensions() );
}
}
public void calculateConcreteState( MavenProject project, ProjectBuilderConfiguration config )
throws ModelInterpolationException
{
if ( project.isConcrete() )
{
return;
}
Model model = ModelUtils.cloneModel( project.getModel() );
File basedir = project.getBasedir();
model = modelInterpolator.interpolate( model, basedir, config, getLogger().isDebugEnabled() );
List originalInterpolatedCompileSourceRoots = interpolateListOfStrings( project.getCompileSourceRoots(),
model,
project.getBasedir(),
config );
project.preserveCompileSourceRoots( originalInterpolatedCompileSourceRoots );
project.setCompileSourceRoots( originalInterpolatedCompileSourceRoots == null ? null
: translateListOfPaths( originalInterpolatedCompileSourceRoots, basedir ) );
List originalInterpolatedTestCompileSourceRoots = interpolateListOfStrings( project.getTestCompileSourceRoots(),
model,
project.getBasedir(),
config );
project.preserveTestCompileSourceRoots( originalInterpolatedTestCompileSourceRoots );
project.setTestCompileSourceRoots( originalInterpolatedTestCompileSourceRoots == null ? null
: translateListOfPaths( originalInterpolatedTestCompileSourceRoots, basedir ) );
List originalInterpolatedScriptSourceRoots = interpolateListOfStrings( project.getScriptSourceRoots(),
model,
project.getBasedir(),
config );
project.preserveScriptSourceRoots( originalInterpolatedScriptSourceRoots );
project.setScriptSourceRoots( originalInterpolatedScriptSourceRoots == null ? null
: translateListOfPaths( originalInterpolatedScriptSourceRoots, basedir ) );
Model model2 = ModelUtils.cloneModel( model );
pathTranslator.alignToBaseDirectory( model, basedir );
project.preserveBuild( model2.getBuild() );
project.setBuild( model.getBuild() );
calculateConcreteProjectReferences( project, config );
MavenProject executionProject = project.getExecutionProject();
if ( executionProject != null && executionProject != project )
{
calculateConcreteState( executionProject, config );
}
project.setConcrete( true );
}
private void calculateConcreteProjectReferences( MavenProject project,
ProjectBuilderConfiguration config )
throws ModelInterpolationException
{
Map projectRefs = project.getProjectReferences();
if ( projectRefs != null )
{
for ( Iterator it = projectRefs.values().iterator(); it.hasNext(); )
{
MavenProject reference = (MavenProject) it.next();
calculateConcreteState( reference, config );
}
}
}
private List translateListOfPaths( List paths, File basedir )
{
if ( paths == null )
{
return null;
}
else if ( basedir == null )
{
return paths;
}
List result = new ArrayList( paths.size() );
for ( Iterator it = paths.iterator(); it.hasNext(); )
{
String path = (String) it.next();
String aligned = pathTranslator.alignToBaseDirectory( path, basedir );
result.add( aligned );
}
return result;
}
public void restoreDynamicState( MavenProject project, ProjectBuilderConfiguration config )
throws ModelInterpolationException
{
if ( !project.isConcrete() )
{
return;
}
restoreBuildRoots( project, config );
restoreModelBuildSection( project, config );
restoreDynamicProjectReferences( project, config );
MavenProject executionProject = project.getExecutionProject();
if ( executionProject != null && executionProject != project )
{
restoreDynamicState( executionProject, config );
}
project.setConcrete( false );
}
private void restoreDynamicProjectReferences( MavenProject project,
ProjectBuilderConfiguration config )
throws ModelInterpolationException
{
Map projectRefs = project.getProjectReferences();
if ( projectRefs != null )
{
for ( Iterator it = projectRefs.values().iterator(); it.hasNext(); )
{
MavenProject projectRef = (MavenProject) it.next();
restoreDynamicState( projectRef, config );
}
}
}
private void restoreBuildRoots( MavenProject project,
ProjectBuilderConfiguration config )
throws ModelInterpolationException
{
project.setCompileSourceRoots( restoreListOfStrings( project.getDynamicCompileSourceRoots(),
project.getOriginalInterpolatedCompileSourceRoots(),
project.getCompileSourceRoots(),
project,
config ) );
project.setTestCompileSourceRoots( restoreListOfStrings( project.getDynamicTestCompileSourceRoots(),
project.getOriginalInterpolatedTestCompileSourceRoots(),
project.getTestCompileSourceRoots(),
project,
config ) );
project.setScriptSourceRoots( restoreListOfStrings( project.getDynamicScriptSourceRoots(),
project.getOriginalInterpolatedScriptSourceRoots(),
project.getScriptSourceRoots(),
project,
config ) );
project.clearRestorableRoots();
}
private void restoreModelBuildSection( MavenProject project,
ProjectBuilderConfiguration config )
throws ModelInterpolationException
{
Build changedBuild = project.getBuild();
Build dynamicBuild = project.getDynamicBuild();
Build originalInterpolatedBuild = project.getOriginalInterpolatedBuild();
dynamicBuild.setResources( restoreResources( dynamicBuild.getResources(),
originalInterpolatedBuild.getResources(),
changedBuild.getResources(),
project,
config ) );
dynamicBuild.setTestResources( restoreResources( dynamicBuild.getTestResources(),
originalInterpolatedBuild.getTestResources(),
changedBuild.getTestResources(),
project,
config ) );
dynamicBuild.setFilters( restoreListOfStrings( dynamicBuild.getFilters(),
originalInterpolatedBuild.getFilters(),
changedBuild.getFilters(),
project,
config ) );
dynamicBuild.setFinalName( restoreString( dynamicBuild.getFinalName(),
originalInterpolatedBuild.getFinalName(),
changedBuild.getFinalName(),
project,
config ) );
dynamicBuild.setDefaultGoal( restoreString( dynamicBuild.getDefaultGoal(),
originalInterpolatedBuild.getDefaultGoal(),
changedBuild.getDefaultGoal(),
project,
config ) );
dynamicBuild.setSourceDirectory( restoreString( dynamicBuild.getSourceDirectory(),
originalInterpolatedBuild.getSourceDirectory(),
changedBuild.getSourceDirectory(),
project,
config ) );
dynamicBuild.setTestSourceDirectory( restoreString( dynamicBuild.getTestSourceDirectory(),
originalInterpolatedBuild.getTestSourceDirectory(),
changedBuild.getTestSourceDirectory(),
project,
config ) );
dynamicBuild.setScriptSourceDirectory( restoreString( dynamicBuild.getScriptSourceDirectory(),
originalInterpolatedBuild.getScriptSourceDirectory(),
changedBuild.getScriptSourceDirectory(),
project,
config ) );
dynamicBuild.setOutputDirectory( restoreString( dynamicBuild.getOutputDirectory(),
originalInterpolatedBuild.getOutputDirectory(),
changedBuild.getOutputDirectory(),
project,
config ) );
dynamicBuild.setTestOutputDirectory( restoreString( dynamicBuild.getTestOutputDirectory(),
originalInterpolatedBuild.getTestOutputDirectory(),
changedBuild.getTestOutputDirectory(),
project,
config ) );
dynamicBuild.setDirectory( restoreString( dynamicBuild.getDirectory(),
originalInterpolatedBuild.getDirectory(),
changedBuild.getDirectory(),
project,
config ) );
project.setBuild( dynamicBuild );
project.clearRestorableBuild();
}
private List interpolateListOfStrings( List originalStrings,
Model model,
File projectDir,
ProjectBuilderConfiguration config )
throws ModelInterpolationException
{
if ( originalStrings == null )
{
return null;
}
List result = new ArrayList();
for ( Iterator it = originalStrings.iterator(); it.hasNext(); )
{
String original = (String) it.next();
String interpolated = modelInterpolator.interpolate( original, model, projectDir, config, getLogger().isDebugEnabled() );
result.add( interpolated );
}
return result;
}
private String restoreString( String originalString,
String originalInterpolatedString,
String changedString,
MavenProject project,
ProjectBuilderConfiguration config )
throws ModelInterpolationException
{
if ( originalString == null )
{
return changedString;
}
else if ( changedString == null )
{
return originalString;
}
Model model = project.getModel();
String relativeChangedString;
if ( project.getBasedir() != null )
{
relativeChangedString = pathTranslator.unalignFromBaseDirectory( changedString, project.getBasedir() );
}
else
{
relativeChangedString = changedString;
}
String interpolatedOriginal = modelInterpolator.interpolate( originalString, model, project.getBasedir(), config, getLogger().isDebugEnabled() );
String interpolatedOriginal2 = modelInterpolator.interpolate( originalInterpolatedString,
model,
project.getBasedir(), config, getLogger().isDebugEnabled() );
String interpolatedChanged = modelInterpolator.interpolate( changedString, model, project.getBasedir(), config, getLogger().isDebugEnabled() );
String relativeInterpolatedChanged = modelInterpolator.interpolate( relativeChangedString, model, project.getBasedir(), config, getLogger().isDebugEnabled() );
if ( interpolatedOriginal.equals( interpolatedChanged )
|| interpolatedOriginal2.equals( interpolatedChanged ) )
{
return originalString;
}
else if ( interpolatedOriginal.equals( relativeInterpolatedChanged )
|| interpolatedOriginal2.equals( relativeInterpolatedChanged ) )
{
return originalString;
}
return relativeChangedString;
}
private List restoreListOfStrings( List originalStrings,
List originalInterpolatedStrings,
List changedStrings,
MavenProject project,
ProjectBuilderConfiguration config )
throws ModelInterpolationException
{
if ( originalStrings == null )
{
return changedStrings;
}
else if ( changedStrings == null )
{
return originalStrings;
}
List result = new ArrayList();
Map orig = new HashMap();
for ( int idx = 0; idx < originalStrings.size(); idx++ )
{
String[] permutations = new String[2];
permutations[0] = (String) originalInterpolatedStrings.get( idx );
permutations[1] = (String) originalStrings.get( idx );
orig.put( permutations[0], permutations );
}
for ( Iterator it = changedStrings.iterator(); it.hasNext(); )
{
String changedString = (String) it.next();
String relativeChangedString;
if ( project.getBasedir() != null )
{
relativeChangedString = pathTranslator.unalignFromBaseDirectory( changedString, project.getBasedir() );
}
else
{
relativeChangedString = changedString;
}
String interpolated = modelInterpolator.interpolate( changedString,
project.getModel(),
project.getBasedir(),
config,
getLogger().isDebugEnabled() );
String relativeInterpolated = modelInterpolator.interpolate( relativeChangedString,
project.getModel(),
project.getBasedir(),
config,
getLogger().isDebugEnabled() );
String[] original = (String[]) orig.get( interpolated );
if ( original == null )
{
original = (String[]) orig.get( relativeInterpolated );
}
if ( original == null )
{
result.add( relativeChangedString );
}
else
{
result.add( original[1] );
}
}
return result;
}
private List restoreResources( List originalResources,
List originalInterpolatedResources,
List changedResources,
MavenProject project,
ProjectBuilderConfiguration config )
throws ModelInterpolationException
{
if ( originalResources == null || changedResources == null )
{
return originalResources;
}
List result = new ArrayList();
Map orig = new HashMap();
for ( int idx = 0; idx < originalResources.size(); idx++ )
{
Resource[] permutations = new Resource[2];
permutations[0] = (Resource) originalInterpolatedResources.get( idx );
permutations[1] = (Resource) originalResources.get( idx );
orig.put( permutations[0].getDirectory(), permutations );
}
for ( Iterator it = changedResources.iterator(); it.hasNext(); )
{
Resource resource = (Resource) it.next();
String rDir = modelInterpolator.interpolate( resource.getDirectory(), project.getModel(), project.getBasedir(), config, getLogger().isDebugEnabled() );
String relativeDir;
if ( project.getBasedir() != null )
{
relativeDir = pathTranslator.unalignFromBaseDirectory( resource.getDirectory(),
project.getBasedir() );
}
else
{
relativeDir = resource.getDirectory();
}
String relativeRDir = modelInterpolator.interpolate( relativeDir, project.getModel(), project.getBasedir(), config, getLogger().isDebugEnabled() );
Resource[] original = (Resource[]) orig.get( rDir );
if ( original == null )
{
original = (Resource[]) orig.get( relativeRDir );
}
if ( original == null )
{
result.add( resource );
}
else
{
// TODO: Synchronize all non-directory fields, such as targetPath, includes, and excludes.
// String target = interpolator.interpolate( resource.getTargetPath(), model, context );
// String oTarget = interpolator.interpolate( originalResource.getTargetPath(), model, context );
result.add( original[1] );
}
}
return result;
}
private void validateModel( Model model, private void validateModel( Model model,
File pomFile ) File pomFile )
throws InvalidProjectModelException throws InvalidProjectModelException

View File

@ -98,9 +98,9 @@ public class MavenProject
private Artifact parentArtifact; private Artifact parentArtifact;
private Set pluginArtifacts; private Set<Artifact> pluginArtifacts;
private List remoteArtifactRepositories; private List<ArtifactRepository> remoteArtifactRepositories;
private List collectedProjects = Collections.EMPTY_LIST; private List collectedProjects = Collections.EMPTY_LIST;
@ -172,6 +172,7 @@ public class MavenProject
/** /**
* @deprecated use {@link #clone()} so subclasses can provide a copy of the same class * @deprecated use {@link #clone()} so subclasses can provide a copy of the same class
*/ */
@Deprecated
public MavenProject( MavenProject project ) public MavenProject( MavenProject project )
{ {
deepCopy( project ); deepCopy( project );
@ -282,6 +283,38 @@ public class MavenProject
{ {
setSnapshotArtifactRepository( project.getSnapshotArtifactRepository() ); setSnapshotArtifactRepository( project.getSnapshotArtifactRepository() );
} }
if ( project.isConcrete() )
{
setDynamicBuild( ModelUtils.cloneBuild( project.getDynamicBuild() ) );
setOriginalInterpolatedBuild( ModelUtils.cloneBuild( project.getOriginalInterpolatedBuild() ) );
List dynamicRoots = project.getDynamicCompileSourceRoots();
if ( dynamicRoots != null )
{
setDynamicCompileSourceRoots( new ArrayList( dynamicRoots ) );
setOriginalInterpolatedCompileSourceRoots( new ArrayList(
project.getOriginalInterpolatedCompileSourceRoots() ) );
}
dynamicRoots = project.getDynamicTestCompileSourceRoots();
if ( dynamicRoots != null )
{
setDynamicTestCompileSourceRoots( new ArrayList( dynamicRoots ) );
setOriginalInterpolatedTestCompileSourceRoots( new ArrayList(
project.getOriginalInterpolatedTestCompileSourceRoots() ) );
}
dynamicRoots = project.getDynamicScriptSourceRoots();
if ( dynamicRoots != null )
{
setDynamicScriptSourceRoots( new ArrayList( dynamicRoots ) );
setOriginalInterpolatedScriptSourceRoots( new ArrayList(
project.getOriginalInterpolatedScriptSourceRoots() ) );
}
}
setConcrete( project.isConcrete() );
} }
// TODO: Find a way to use <relativePath/> here...it's tricky, because the moduleProject // TODO: Find a way to use <relativePath/> here...it's tricky, because the moduleProject
@ -376,7 +409,7 @@ public class MavenProject
this.remoteArtifactRepositories = remoteArtifactRepositories; this.remoteArtifactRepositories = remoteArtifactRepositories;
} }
public List getRemoteArtifactRepositories() public List<ArtifactRepository> getRemoteArtifactRepositories()
{ {
return remoteArtifactRepositories; return remoteArtifactRepositories;
} }
@ -1537,6 +1570,7 @@ public class MavenProject
return managedVersionMap; return managedVersionMap;
} }
@Override
public boolean equals( Object other ) public boolean equals( Object other )
{ {
if ( other == this ) if ( other == this )
@ -1555,6 +1589,7 @@ public class MavenProject
} }
} }
@Override
public int hashCode() public int hashCode()
{ {
return getId().hashCode(); return getId().hashCode();
@ -1598,6 +1633,7 @@ public class MavenProject
/** /**
* @deprecated Use MavenProjectHelper.attachArtifact(..) instead. * @deprecated Use MavenProjectHelper.attachArtifact(..) instead.
*/ */
@Deprecated
public void attachArtifact( String type, String classifier, File file ) public void attachArtifact( String type, String classifier, File file )
{ {
} }
@ -1807,6 +1843,7 @@ public class MavenProject
/** /**
* Default toString * Default toString
*/ */
@Override
public String toString() public String toString()
{ {
StringBuffer sb = new StringBuffer(30); StringBuffer sb = new StringBuffer(30);
@ -1834,6 +1871,7 @@ public class MavenProject
* @throws CloneNotSupportedException * @throws CloneNotSupportedException
* @since 2.0.9 * @since 2.0.9
*/ */
@Override
public Object clone() public Object clone()
throws CloneNotSupportedException throws CloneNotSupportedException
{ {
@ -1842,4 +1880,159 @@ public class MavenProject
return clone; return clone;
} }
// ----------------------------------------------------------------------------
// CODE BELOW IS USED TO PRESERVE DYNAMISM IN THE BUILD SECTION OF THE POM.
// ----------------------------------------------------------------------------
private Build dynamicBuild;
private Build originalInterpolatedBuild;
private List dynamicCompileSourceRoots;
private List originalInterpolatedCompileSourceRoots;
private List dynamicTestCompileSourceRoots;
private List originalInterpolatedTestCompileSourceRoots;
private List dynamicScriptSourceRoots;
private List originalInterpolatedScriptSourceRoots;
private boolean isConcrete = false;
public boolean isConcrete()
{
return isConcrete;
}
public void setConcrete( boolean concrete )
{
isConcrete = concrete;
}
public Build getDynamicBuild()
{
return dynamicBuild;
}
public Build getOriginalInterpolatedBuild()
{
return originalInterpolatedBuild;
}
public List getDynamicCompileSourceRoots()
{
return dynamicCompileSourceRoots;
}
public List getOriginalInterpolatedCompileSourceRoots()
{
return originalInterpolatedCompileSourceRoots;
}
public List getDynamicTestCompileSourceRoots()
{
return dynamicTestCompileSourceRoots;
}
public List getOriginalInterpolatedTestCompileSourceRoots()
{
return originalInterpolatedTestCompileSourceRoots;
}
public List getDynamicScriptSourceRoots()
{
return dynamicScriptSourceRoots;
}
public List getOriginalInterpolatedScriptSourceRoots()
{
return originalInterpolatedScriptSourceRoots;
}
public void clearRestorableRoots()
{
dynamicCompileSourceRoots = null;
dynamicTestCompileSourceRoots = null;
dynamicScriptSourceRoots = null;
originalInterpolatedCompileSourceRoots = null;
originalInterpolatedScriptSourceRoots = null;
originalInterpolatedTestCompileSourceRoots = null;
}
public void clearRestorableBuild()
{
dynamicBuild = null;
originalInterpolatedBuild = null;
}
public void preserveCompileSourceRoots( List originalInterpolatedCompileSourceRoots )
{
dynamicCompileSourceRoots = getCompileSourceRoots();
this.originalInterpolatedCompileSourceRoots = originalInterpolatedCompileSourceRoots;
}
public void preserveTestCompileSourceRoots( List originalInterpolatedTestCompileSourceRoots )
{
dynamicTestCompileSourceRoots = getTestCompileSourceRoots();
this.originalInterpolatedTestCompileSourceRoots = originalInterpolatedTestCompileSourceRoots;
}
public void preserveScriptSourceRoots( List originalInterpolatedScriptSourceRoots )
{
dynamicScriptSourceRoots = getScriptSourceRoots();
this.originalInterpolatedScriptSourceRoots = originalInterpolatedScriptSourceRoots;
}
public void preserveBuild( Build originalInterpolatedBuild )
{
dynamicBuild = getBuild();
this.originalInterpolatedBuild = originalInterpolatedBuild;
this.originalInterpolatedBuild.setPluginManagement( null );
this.originalInterpolatedBuild.setPlugins( null );
}
protected void setDynamicBuild( Build dynamicBuild )
{
this.dynamicBuild = dynamicBuild;
}
protected void setOriginalInterpolatedBuild( Build originalInterpolatedBuild )
{
this.originalInterpolatedBuild = originalInterpolatedBuild;
}
protected void setDynamicCompileSourceRoots( List dynamicCompileSourceRoots )
{
this.dynamicCompileSourceRoots = dynamicCompileSourceRoots;
}
protected void setOriginalInterpolatedCompileSourceRoots( List originalInterpolatedCompileSourceRoots )
{
this.originalInterpolatedCompileSourceRoots = originalInterpolatedCompileSourceRoots;
}
protected void setDynamicTestCompileSourceRoots( List dynamicTestCompileSourceRoots )
{
this.dynamicTestCompileSourceRoots = dynamicTestCompileSourceRoots;
}
protected void setOriginalInterpolatedTestCompileSourceRoots( List originalInterpolatedTestCompileSourceRoots )
{
this.originalInterpolatedTestCompileSourceRoots = originalInterpolatedTestCompileSourceRoots;
}
protected void setDynamicScriptSourceRoots( List dynamicScriptSourceRoots )
{
this.dynamicScriptSourceRoots = dynamicScriptSourceRoots;
}
protected void setOriginalInterpolatedScriptSourceRoots( List originalInterpolatedScriptSourceRoots )
{
this.originalInterpolatedScriptSourceRoots = originalInterpolatedScriptSourceRoots;
}
} }

View File

@ -22,6 +22,7 @@ package org.apache.maven.project;
import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.profiles.ProfileManager; import org.apache.maven.profiles.ProfileManager;
import org.apache.maven.project.interpolation.ModelInterpolationException;
import java.io.File; import java.io.File;
import java.util.List; import java.util.List;
@ -41,6 +42,7 @@ public interface MavenProjectBuilder
/** /**
* @deprecated Use {@link MavenProjectBuilder#build(File, ProjectBuilderConfiguration)} instead. * @deprecated Use {@link MavenProjectBuilder#build(File, ProjectBuilderConfiguration)} instead.
*/ */
@Deprecated
MavenProject build( File project, MavenProject build( File project,
ArtifactRepository localRepository, ArtifactRepository localRepository,
ProfileManager globalProfileManager ) ProfileManager globalProfileManager )
@ -62,6 +64,7 @@ public interface MavenProjectBuilder
/** /**
* @deprecated Use {@link MavenProjectBuilder#buildProjectWithDependencies(File, ProjectBuilderConfiguration)} instead. * @deprecated Use {@link MavenProjectBuilder#buildProjectWithDependencies(File, ProjectBuilderConfiguration)} instead.
*/ */
@Deprecated
MavenProjectBuildingResult buildProjectWithDependencies( File project, MavenProjectBuildingResult buildProjectWithDependencies( File project,
ArtifactRepository localRepository, ArtifactRepository localRepository,
ProfileManager globalProfileManager ) ProfileManager globalProfileManager )
@ -74,6 +77,7 @@ public interface MavenProjectBuilder
throws ProjectBuildingException; throws ProjectBuildingException;
/** @deprecated We do not want to allow projects to not have POMs. Maven 1.x repositories be damned. */ /** @deprecated We do not want to allow projects to not have POMs. Maven 1.x repositories be damned. */
@Deprecated
MavenProject buildFromRepository( Artifact artifact, MavenProject buildFromRepository( Artifact artifact,
List remoteArtifactRepositories, List remoteArtifactRepositories,
ArtifactRepository localRepository, ArtifactRepository localRepository,
@ -83,15 +87,29 @@ public interface MavenProjectBuilder
/** /**
* @deprecated Use {@link MavenProjectBuilder#buildStandaloneSuperProject(ProjectBuilderConfiguration)} instead. * @deprecated Use {@link MavenProjectBuilder#buildStandaloneSuperProject(ProjectBuilderConfiguration)} instead.
*/ */
@Deprecated
MavenProject buildStandaloneSuperProject() MavenProject buildStandaloneSuperProject()
throws ProjectBuildingException; throws ProjectBuildingException;
/** /**
* @deprecated Use {@link MavenProjectBuilder#buildStandaloneSuperProject(ProjectBuilderConfiguration)} instead. * @deprecated Use {@link MavenProjectBuilder#buildStandaloneSuperProject(ProjectBuilderConfiguration)} instead.
*/ */
@Deprecated
MavenProject buildStandaloneSuperProject( ProfileManager profileManager ) MavenProject buildStandaloneSuperProject( ProfileManager profileManager )
throws ProjectBuildingException; throws ProjectBuildingException;
MavenProject buildStandaloneSuperProject( ProjectBuilderConfiguration config ) MavenProject buildStandaloneSuperProject( ProjectBuilderConfiguration config )
throws ProjectBuildingException; throws ProjectBuildingException;
// ----------------------------------------------------------------------------
// API BELOW IS USED TO PRESERVE DYNAMISM IN THE BUILD SECTION OF THE POM.
// ----------------------------------------------------------------------------
void calculateConcreteState( MavenProject project,
ProjectBuilderConfiguration config )
throws ModelInterpolationException;
void restoreDynamicState( MavenProject project,
ProjectBuilderConfiguration config )
throws ModelInterpolationException;
} }

View File

@ -581,6 +581,17 @@ public final class ModelUtils
return newModel; return newModel;
} }
public static Build cloneBuild( Build build )
{
ModelInheritanceAssembler assembler = new DefaultModelInheritanceAssembler();
Build clone = new Build();
assembler.assembleBuildInheritance( clone, build );
return clone;
}
private static List cloneProfiles( List profiles ) private static List cloneProfiles( List profiles )
{ {
if ( profiles == null ) if ( profiles == null )

View File

@ -363,15 +363,15 @@ public class MavenMetadataSource
* @todo desperately needs refactoring. It's just here because it's implementation is maven-project specific * @todo desperately needs refactoring. It's just here because it's implementation is maven-project specific
* @return {@link Set} &lt; {@link Artifact} > * @return {@link Set} &lt; {@link Artifact} >
*/ */
public static Set createArtifacts( ArtifactFactory artifactFactory, List dependencies, String inheritedScope, public static Set<Artifact> createArtifacts( ArtifactFactory artifactFactory, List<Dependency> dependencies, String inheritedScope,
ArtifactFilter dependencyFilter, MavenProject project ) ArtifactFilter dependencyFilter, MavenProject project )
throws InvalidDependencyVersionException throws InvalidDependencyVersionException
{ {
Set projectArtifacts = new LinkedHashSet( dependencies.size() ); Set<Artifact> projectArtifacts = new LinkedHashSet<Artifact>( dependencies.size() );
for ( Iterator i = dependencies.iterator(); i.hasNext(); ) for ( Iterator<Dependency> i = dependencies.iterator(); i.hasNext(); )
{ {
Dependency d = (Dependency) i.next(); Dependency d = i.next();
String scope = d.getScope(); String scope = d.getScope();
@ -406,10 +406,10 @@ public class MavenMetadataSource
{ {
if ( ( d.getExclusions() != null ) && !d.getExclusions().isEmpty() ) if ( ( d.getExclusions() != null ) && !d.getExclusions().isEmpty() )
{ {
List exclusions = new ArrayList(); List<String> exclusions = new ArrayList<String>();
for ( Iterator j = d.getExclusions().iterator(); j.hasNext(); ) for ( Iterator<Exclusion> j = d.getExclusions().iterator(); j.hasNext(); )
{ {
Exclusion e = (Exclusion) j.next(); Exclusion e = j.next();
exclusions.add( e.getGroupId() + ":" + e.getArtifactId() ); exclusions.add( e.getGroupId() + ":" + e.getArtifactId() );
} }

View File

@ -27,6 +27,7 @@ import org.apache.maven.model.DistributionManagement;
import org.apache.maven.model.Model; import org.apache.maven.model.Model;
import org.apache.maven.model.PluginManagement; import org.apache.maven.model.PluginManagement;
import org.apache.maven.model.Reporting; import org.apache.maven.model.Reporting;
import org.apache.maven.model.Resource;
import org.apache.maven.model.Scm; import org.apache.maven.model.Scm;
import org.apache.maven.model.Site; import org.apache.maven.model.Site;
import org.apache.maven.project.ModelUtils; import org.apache.maven.project.ModelUtils;
@ -184,6 +185,8 @@ public class DefaultModelInheritanceAssembler
child.setProperties( props ); child.setProperties( props );
} }
// TODO: Remove this!
@SuppressWarnings("unchecked")
private void assembleDependencyManagementInheritance( Model child, Model parent ) private void assembleDependencyManagementInheritance( Model child, Model parent )
{ {
DependencyManagement parentDepMgmt = parent.getDependencyManagement(); DependencyManagement parentDepMgmt = parent.getDependencyManagement();
@ -198,18 +201,18 @@ public class DefaultModelInheritanceAssembler
} }
else else
{ {
List childDeps = childDepMgmt.getDependencies(); List<Dependency> childDeps = childDepMgmt.getDependencies();
Map mappedChildDeps = new TreeMap(); Map<String, Dependency> mappedChildDeps = new TreeMap<String, Dependency>();
for ( Iterator it = childDeps.iterator(); it.hasNext(); ) for ( Iterator<Dependency> it = childDeps.iterator(); it.hasNext(); )
{ {
Dependency dep = (Dependency) it.next(); Dependency dep = it.next();
mappedChildDeps.put( dep.getManagementKey(), dep ); mappedChildDeps.put( dep.getManagementKey(), dep );
} }
for ( Iterator it = parentDepMgmt.getDependencies().iterator(); it.hasNext(); ) for ( Iterator<Dependency> it = parentDepMgmt.getDependencies().iterator(); it.hasNext(); )
{ {
Dependency dep = (Dependency) it.next(); Dependency dep = it.next();
if ( !mappedChildDeps.containsKey( dep.getManagementKey() ) ) if ( !mappedChildDeps.containsKey( dep.getManagementKey() ) )
{ {
childDepMgmt.addDependency( dep ); childDepMgmt.addDependency( dep );
@ -244,17 +247,19 @@ public class DefaultModelInheritanceAssembler
} }
} }
// TODO: Remove this!
@SuppressWarnings("unchecked")
private void assembleDependencyInheritance( Model child, Model parent ) private void assembleDependencyInheritance( Model child, Model parent )
{ {
Map depsMap = new LinkedHashMap(); Map<String, Dependency> depsMap = new LinkedHashMap<String, Dependency>();
List deps = parent.getDependencies(); List<Dependency> deps = parent.getDependencies();
if ( deps != null ) if ( deps != null )
{ {
for ( Iterator it = deps.iterator(); it.hasNext(); ) for ( Iterator<Dependency> it = deps.iterator(); it.hasNext(); )
{ {
Dependency dependency = (Dependency) it.next(); Dependency dependency = it.next();
depsMap.put( dependency.getManagementKey(), dependency ); depsMap.put( dependency.getManagementKey(), dependency );
} }
} }
@ -263,14 +268,14 @@ public class DefaultModelInheritanceAssembler
if ( deps != null ) if ( deps != null )
{ {
for ( Iterator it = deps.iterator(); it.hasNext(); ) for ( Iterator<Dependency> it = deps.iterator(); it.hasNext(); )
{ {
Dependency dependency = (Dependency) it.next(); Dependency dependency = it.next();
depsMap.put( dependency.getManagementKey(), dependency ); depsMap.put( dependency.getManagementKey(), dependency );
} }
} }
child.setDependencies( new ArrayList( depsMap.values() ) ); child.setDependencies( new ArrayList<Dependency>( depsMap.values() ) );
} }
private void assembleBuildInheritance( Model child, Model parent ) private void assembleBuildInheritance( Model child, Model parent )
@ -286,83 +291,91 @@ public class DefaultModelInheritanceAssembler
child.setBuild( childBuild ); child.setBuild( childBuild );
} }
// The build has been set but we want to step in here and fill in assembleBuildInheritance( childBuild, parentBuild );
// values that have not been set by the child. }
}
if ( childBuild.getSourceDirectory() == null ) // TODO: Remove this!
{ @SuppressWarnings("unchecked")
childBuild.setSourceDirectory( parentBuild.getSourceDirectory() ); public void assembleBuildInheritance( Build childBuild,
} Build parentBuild )
{
// The build has been set but we want to step in here and fill in
// values that have not been set by the child.
if ( childBuild.getScriptSourceDirectory() == null ) if ( childBuild.getSourceDirectory() == null )
{ {
childBuild.setScriptSourceDirectory( parentBuild.getScriptSourceDirectory() ); childBuild.setSourceDirectory( parentBuild.getSourceDirectory() );
} }
if ( childBuild.getTestSourceDirectory() == null ) if ( childBuild.getScriptSourceDirectory() == null )
{ {
childBuild.setTestSourceDirectory( parentBuild.getTestSourceDirectory() ); childBuild.setScriptSourceDirectory( parentBuild.getScriptSourceDirectory() );
} }
if ( childBuild.getOutputDirectory() == null ) if ( childBuild.getTestSourceDirectory() == null )
{ {
childBuild.setOutputDirectory( parentBuild.getOutputDirectory() ); childBuild.setTestSourceDirectory( parentBuild.getTestSourceDirectory() );
} }
if ( childBuild.getTestOutputDirectory() == null ) if ( childBuild.getOutputDirectory() == null )
{ {
childBuild.setTestOutputDirectory( parentBuild.getTestOutputDirectory() ); childBuild.setOutputDirectory( parentBuild.getOutputDirectory() );
} }
// Extensions are accumlated if ( childBuild.getTestOutputDirectory() == null )
ModelUtils.mergeExtensionLists( childBuild, parentBuild ); {
childBuild.setTestOutputDirectory( parentBuild.getTestOutputDirectory() );
}
if ( childBuild.getDirectory() == null ) // Extensions are accumlated
{ ModelUtils.mergeExtensionLists( childBuild, parentBuild );
childBuild.setDirectory( parentBuild.getDirectory() );
}
if ( childBuild.getDefaultGoal() == null ) if ( childBuild.getDirectory() == null )
{ {
childBuild.setDefaultGoal( parentBuild.getDefaultGoal() ); childBuild.setDirectory( parentBuild.getDirectory() );
} }
if ( childBuild.getFinalName() == null ) if ( childBuild.getDefaultGoal() == null )
{ {
childBuild.setFinalName( parentBuild.getFinalName() ); childBuild.setDefaultGoal( parentBuild.getDefaultGoal() );
} }
ModelUtils.mergeFilterLists( childBuild.getFilters(), parentBuild.getFilters() ); if ( childBuild.getFinalName() == null )
{
childBuild.setFinalName( parentBuild.getFinalName() );
}
List resources = childBuild.getResources(); ModelUtils.mergeFilterLists( childBuild.getFilters(), parentBuild.getFilters() );
if ( ( resources == null ) || resources.isEmpty() )
{
childBuild.setResources( parentBuild.getResources() );
}
resources = childBuild.getTestResources(); List<Resource> resources = childBuild.getResources();
if ( ( resources == null ) || resources.isEmpty() ) if ( ( resources == null ) || resources.isEmpty() )
{ {
childBuild.setTestResources( parentBuild.getTestResources() ); childBuild.setResources( parentBuild.getResources() );
} }
// Plugins are aggregated if Plugin.inherit != false resources = childBuild.getTestResources();
ModelUtils.mergePluginLists( childBuild, parentBuild, true ); if ( ( resources == null ) || resources.isEmpty() )
{
childBuild.setTestResources( parentBuild.getTestResources() );
}
// Plugin management :: aggregate // Plugins are aggregated if Plugin.inherit != false
PluginManagement dominantPM = childBuild.getPluginManagement(); ModelUtils.mergePluginLists( childBuild, parentBuild, true );
PluginManagement recessivePM = parentBuild.getPluginManagement();
if ( ( dominantPM == null ) && ( recessivePM != null ) ) // Plugin management :: aggregate
{ PluginManagement dominantPM = childBuild.getPluginManagement();
// FIXME: Filter out the inherited == false stuff! PluginManagement recessivePM = parentBuild.getPluginManagement();
childBuild.setPluginManagement( recessivePM );
} if ( ( dominantPM == null ) && ( recessivePM != null ) )
else {
{ // FIXME: Filter out the inherited == false stuff!
ModelUtils.mergePluginLists( childBuild.getPluginManagement(), parentBuild.getPluginManagement(), childBuild.setPluginManagement( recessivePM );
false ); }
} else
{
ModelUtils.mergePluginLists( childBuild.getPluginManagement(), parentBuild.getPluginManagement(),
false );
} }
} }
@ -525,7 +538,7 @@ public class DefaultModelInheritanceAssembler
// TODO: Move this to plexus-utils' PathTool. // TODO: Move this to plexus-utils' PathTool.
private static String resolvePath( String uncleanPath ) private static String resolvePath( String uncleanPath )
{ {
LinkedList pathElements = new LinkedList(); LinkedList<String> pathElements = new LinkedList<String>();
StringTokenizer tokenizer = new StringTokenizer( uncleanPath, "/" ); StringTokenizer tokenizer = new StringTokenizer( uncleanPath, "/" );

View File

@ -19,6 +19,7 @@ package org.apache.maven.project.inheritance;
* under the License. * under the License.
*/ */
import org.apache.maven.model.Build;
import org.apache.maven.model.Model; import org.apache.maven.model.Model;
/** /**
@ -33,5 +34,8 @@ public interface ModelInheritanceAssembler
void assembleModelInheritance( Model child, Model parent ); void assembleModelInheritance( Model child, Model parent );
void assembleBuildInheritance( Build childBuild,
Build parentBuild );
void copyModel( Model dest, Model source ); void copyModel( Model dest, Model source );
} }

View File

@ -31,6 +31,12 @@ import java.util.List;
public class DefaultPathTranslator public class DefaultPathTranslator
implements PathTranslator implements PathTranslator
{ {
private static final String[] BASEDIR_EXPRESSIONS = {
"${basedir}",
"${pom.basedir}",
"${project.basedir}"
};
private String FILE_SEPARATOR = "/"; private String FILE_SEPARATOR = "/";
public void alignToBaseDirectory( Model model, File basedir ) public void alignToBaseDirectory( Model model, File basedir )
@ -91,18 +97,28 @@ public class DefaultPathTranslator
private String stripBasedirToken( String s ) private String stripBasedirToken( String s )
{ {
String basedirExpr = "${basedir}";
if ( s != null ) if ( s != null )
{ {
s = s.trim(); String basedirExpr = null;
for ( int i = 0; i < BASEDIR_EXPRESSIONS.length; i++ )
{
basedirExpr = BASEDIR_EXPRESSIONS[i];
if ( s.startsWith( basedirExpr ) )
{
break;
}
else
{
basedirExpr = null;
}
}
if ( s.startsWith( basedirExpr ) ) if ( basedirExpr != null )
{ {
if ( s.length() > basedirExpr.length() ) if ( s.length() > basedirExpr.length() )
{ {
// Take out ${basedir} and the leading slash // Take out basedir expression and the leading slash
s = s.substring( basedirExpr.length() + 1 ); s = chopLeadingFileSeparator( s.substring( basedirExpr.length() ) );
} }
else else
{ {
@ -114,6 +130,25 @@ public class DefaultPathTranslator
return s; return s;
} }
/**
* Removes the leading directory separator from the specified filesystem path (if any). For platform-independent
* behavior, this method accepts both the forward slash and the backward slash as separator.
*
* @param path The filesystem path, may be <code>null</code>.
* @return The altered filesystem path or <code>null</code> if the input path was <code>null</code>.
*/
private String chopLeadingFileSeparator( String path )
{
if ( path != null )
{
if ( path.startsWith( "/" ) || path.startsWith( "\\" ) )
{
path = path.substring( 1 );
}
}
return path;
}
private boolean requiresBaseDirectoryAlignment( String s ) private boolean requiresBaseDirectoryAlignment( String s )
{ {
if ( s != null ) if ( s != null )

View File

@ -42,6 +42,7 @@ public class DefaultMavenProjectBuilderTest
private DefaultMavenProjectBuilder projectBuilder; private DefaultMavenProjectBuilder projectBuilder;
@Override
public void setUp() public void setUp()
throws Exception throws Exception
{ {
@ -55,6 +56,7 @@ public class DefaultMavenProjectBuilderTest
filesToDelete.add( localRepoDir ); filesToDelete.add( localRepoDir );
} }
@Override
public void tearDown() public void tearDown()
throws Exception throws Exception
{ {
@ -114,6 +116,8 @@ public class DefaultMavenProjectBuilderTest
MavenProject project = getProject( pom ); MavenProject project = getProject( pom );
projectBuilder.calculateConcreteState( project, new DefaultProjectBuilderConfiguration() );
Build build = project.getBuild(); Build build = project.getBuild();
assertNotNull( "Project should have a build section containing the test resource.", build ); assertNotNull( "Project should have a build section containing the test resource.", build );
@ -132,6 +136,7 @@ public class DefaultMavenProjectBuilderTest
System.out.println( "Interpolated, translated resource directory is: " + res.getDirectory() ); System.out.println( "Interpolated, translated resource directory is: " + res.getDirectory() );
} }
@Override
protected ArtifactRepository getLocalRepository() protected ArtifactRepository getLocalRepository()
throws Exception throws Exception
{ {

View File

@ -0,0 +1,570 @@
package org.apache.maven.project;
import org.apache.maven.model.Build;
import org.apache.maven.model.Plugin;
import org.apache.maven.model.Resource;
import org.apache.maven.project.interpolation.ModelInterpolationException;
import org.codehaus.plexus.PlexusTestCase;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Iterator;
import java.util.List;
public class MavenProjectDynamismTest
extends PlexusTestCase
{
private MavenProjectBuilder projectBuilder;
@Override
public void setUp()
throws Exception
{
super.setUp();
projectBuilder = (MavenProjectBuilder) lookup( MavenProjectBuilder.class.getName() );
}
public void testBuildSectionGroupIdInterpolation()
throws IOException, XmlPullParserException, URISyntaxException, ProjectBuildingException,
ModelInterpolationException
{
MavenProject project = buildProject( "pom-interp.xml" );
projectBuilder.calculateConcreteState( project, new DefaultProjectBuilderConfiguration() );
String basepath = "/" + project.getGroupId();
Build build = project.getBuild();
assertTrue( build.getSourceDirectory().startsWith( basepath ) );
assertTrue( build.getTestSourceDirectory().startsWith( basepath ) );
assertTrue( build.getScriptSourceDirectory().startsWith( basepath ) );
List plugins = build.getPlugins();
assertNotNull( plugins );
assertEquals( 1, plugins.size() );
Plugin plugin = (Plugin) plugins.get( 0 );
assertEquals( "my-plugin", plugin.getArtifactId() );
Xpp3Dom conf = (Xpp3Dom) plugin.getConfiguration();
assertNotNull( conf );
Xpp3Dom[] children = conf.getChildren();
assertEquals( 3, children.length );
for ( int i = 0; i < children.length; i++ )
{
assertEquals( "Configuration parameter: "
+ children[i].getName()
+ " should have a an interpolated POM groupId as its value.",
children[i].getValue(),
project.getGroupId() );
}
projectBuilder.restoreDynamicState( project, new DefaultProjectBuilderConfiguration() );
String projectGidExpr = "${project.groupId}";
String pomGidExpr = "${pom.groupId}";
String nakedGidExpr = "${groupId}";
build = project.getBuild();
assertTrue( build.getSourceDirectory().startsWith( "/" + projectGidExpr ) );
assertTrue( build.getTestSourceDirectory().startsWith( "/" + pomGidExpr ) );
assertTrue( build.getScriptSourceDirectory().startsWith( "/" + nakedGidExpr ) );
plugins = build.getPlugins();
assertNotNull( plugins );
assertEquals( 1, plugins.size() );
plugin = (Plugin) plugins.get( 0 );
assertEquals( "my-plugin", plugin.getArtifactId() );
conf = (Xpp3Dom) plugin.getConfiguration();
assertNotNull( conf );
children = conf.getChildren();
assertEquals( 3, children.length );
assertEquals( "Configuration parameter: " + children[0].getName() + " should have "
+ projectGidExpr + " as its value.", children[0].getValue(), projectGidExpr );
assertEquals( "Configuration parameter: " + children[1].getName() + " should have "
+ pomGidExpr + " as its value.", children[1].getValue(), pomGidExpr );
assertEquals( "Configuration parameter: " + children[2].getName() + " should have "
+ nakedGidExpr + " as its value.", children[2].getValue(), nakedGidExpr );
}
public void testRoundTrip()
throws IOException, XmlPullParserException, URISyntaxException,
ModelInterpolationException, ProjectBuildingException
{
MavenProject project = buildProject( "pom.xml" );
ProjectBuilderConfiguration config = new DefaultProjectBuilderConfiguration();
projectBuilder.calculateConcreteState( project, config );
File baseDir = project.getBasedir();
File buildDir = new File( baseDir, "target" );
String basedirExpr = "${pom.basedir}";
String buildDirExpr = "${pom.build.directory}";
assertTrue( project.isConcrete() );
Build build = project.getBuild();
assertEquals( "Concrete source directory should be absolute.",
new File( baseDir, "/src/main/java" ).getAbsolutePath(),
build.getSourceDirectory() );
assertEquals( "Concrete test-source directory should be absolute.",
new File( baseDir, "/src/test/java" ).getAbsolutePath(),
build.getTestSourceDirectory() );
assertEquals( "Concrete script-source directory should be absolute.",
new File( baseDir, "/src/main/scripts" ).getAbsolutePath(),
build.getScriptSourceDirectory() );
List compileSourceRoots = project.getCompileSourceRoots();
assertNotNull( "Concrete compile-source roots should not be null.", compileSourceRoots );
assertEquals( "Concrete compile-source roots should contain one entry.",
1,
compileSourceRoots.size() );
assertEquals( "Concrete compile-source roots should contain interpolated source-directory value.",
new File( baseDir, "/src/main/java" ).getAbsolutePath(),
compileSourceRoots.get( 0 ) );
List testCompileSourceRoots = project.getTestCompileSourceRoots();
assertNotNull( "Concrete test-compile-source roots should not be null.",
testCompileSourceRoots );
assertEquals( "Concrete test-compile-source roots should contain one entry.",
1,
testCompileSourceRoots.size() );
assertEquals( "Concrete test-compile-source roots should contain interpolated test-source-directory value.",
new File( baseDir, "/src/test/java" ).getAbsolutePath(),
testCompileSourceRoots.get( 0 ) );
List scriptSourceRoots = project.getScriptSourceRoots();
assertNotNull( "Concrete script-source roots should not be null.", scriptSourceRoots );
assertEquals( "Concrete script-source roots should contain one entry.",
1,
scriptSourceRoots.size() );
assertEquals( "Concrete script-source roots should contain interpolated script-source-directory value.",
new File( baseDir, "/src/main/scripts" ).getAbsolutePath(),
scriptSourceRoots.get( 0 ) );
List resources = build.getResources();
assertNotNull( "Concrete resources should not be null.", resources );
assertEquals( "Concrete resources should contain one entry.", 1, resources.size() );
assertEquals( "Concrete resource should contain absolute path.",
new File( buildDir, "generated-resources/plexus" ).getAbsolutePath(),
( (Resource) resources.get( 0 ) ).getDirectory() );
List filters = build.getFilters();
assertNotNull( "Concrete filters should not be null.", filters );
assertEquals( "Concrete filters should contain one entry.", 1, filters.size() );
assertEquals( "Concrete filter entry should contain absolute path.",
new File( buildDir, "/generated-filters.properties" ).getAbsolutePath(),
filters.get( 0 ) );
assertEquals( "Concrete output-directory should be absolute.",
new File( buildDir, "/classes" ).getAbsolutePath(),
build.getOutputDirectory() );
assertEquals( "Concrete test-output-directory should be absolute.",
new File( buildDir, "/test-classes" ).getAbsolutePath(),
build.getTestOutputDirectory() );
assertEquals( "Concrete build directory should be absolute.",
new File( baseDir, "target" ).getAbsolutePath(),
build.getDirectory() );
// --------------------------------------------------------------------
// NOW, RESTORE THE DYNAMIC STATE FOR THE BUILD SECTION AND
// ASSOCIATED DIRECTORIES ATTACHED TO THE PROJECT INSTANCE.
// --------------------------------------------------------------------
projectBuilder.restoreDynamicState( project, config );
assertFalse( project.isConcrete() );
build = project.getBuild();
assertEquals( "Restored source directory should be expressed in terms of the basedir.",
basedirExpr + "/src/main/java",
build.getSourceDirectory() );
assertEquals( "Restored test-source directory should be expressed in terms of the basedir.",
basedirExpr + "/src/test/java",
build.getTestSourceDirectory() );
assertEquals( "Restored script-source directory should be expressed in terms of the basedir.",
basedirExpr + "/src/main/scripts",
build.getScriptSourceDirectory() );
compileSourceRoots = project.getCompileSourceRoots();
assertNotNull( "Restored compile-source roots should not be null.", compileSourceRoots );
assertEquals( "Restored compile-source roots should contain one entry.",
1,
compileSourceRoots.size() );
assertEquals( "Restored compile-source roots should contain uninterpolated source-directory value.",
"${pom.basedir}/src/main/java",
compileSourceRoots.get( 0 ) );
testCompileSourceRoots = project.getTestCompileSourceRoots();
assertNotNull( "Restored test-compile-source roots should not be null.",
testCompileSourceRoots );
assertEquals( "Restored test-compile-source roots should contain one entry.",
1,
testCompileSourceRoots.size() );
assertEquals( "Restored test-compile-source roots should contain uninterpolated test-source-directory value.",
"${pom.basedir}/src/test/java",
testCompileSourceRoots.get( 0 ) );
scriptSourceRoots = project.getScriptSourceRoots();
assertNotNull( "Restored script-source roots should not be null.", scriptSourceRoots );
assertEquals( "Restored script-source roots should contain one entry.",
1,
scriptSourceRoots.size() );
assertEquals( "Restored script-source roots should contain uninterpolated script-source-directory value.",
"${pom.basedir}/src/main/scripts",
scriptSourceRoots.get( 0 ) );
resources = build.getResources();
assertNotNull( "Restored resources should not be null.", resources );
assertEquals( "Restored resources should contain one entry.", 1, resources.size() );
assertEquals( "Restored resource should contain uninterpolated reference to build directory.",
buildDirExpr + "/generated-resources/plexus",
( (Resource) resources.get( 0 ) ).getDirectory() );
filters = build.getFilters();
assertNotNull( "Restored filters should not be null.", filters );
assertEquals( "Restored filters should contain one entry.", 1, filters.size() );
assertEquals( "Restored filter entry should contain uninterpolated reference to build directory.",
buildDirExpr + "/generated-filters.properties",
filters.get( 0 ) );
assertEquals( "Restored output-directory should be expressed in terms of the build-directory.",
buildDirExpr + "/classes",
build.getOutputDirectory() );
assertEquals( "Restored test-output-directory should be expressed in terms of the build-directory.",
buildDirExpr + "/test-classes",
build.getTestOutputDirectory() );
assertEquals( "Restored build directory should be relative.",
"target",
build.getDirectory() );
}
public void testShouldPreserveAddedResourceInRestoredState()
throws IOException, XmlPullParserException, URISyntaxException, ProjectBuildingException,
ModelInterpolationException
{
MavenProject project = buildProject( "pom.xml" );
ProjectBuilderConfiguration config = new DefaultProjectBuilderConfiguration();
projectBuilder.calculateConcreteState( project, config );
Build build = project.getBuild();
Resource r = new Resource();
r.setDirectory( "myDir" );
build.addResource( r );
List resources = build.getResources();
assertNotNull( "Concrete resources should not be null.", resources );
assertEquals( "Concrete resources should contain two entries.", 2, resources.size() );
assertResourcePresent( "concrete resources",
new File( build.getDirectory(), "generated-resources/plexus" ).getAbsolutePath(),
resources );
assertResourcePresent( "concrete resources", "myDir", resources );
projectBuilder.restoreDynamicState( project, config );
build = project.getBuild();
resources = build.getResources();
assertNotNull( "Restored resources should not be null.", resources );
assertEquals( "Restored resources should contain two entries.", 2, resources.size() );
assertResourcePresent( "restored resources",
"${pom.build.directory}/generated-resources/plexus",
resources );
assertResourcePresent( "restored resources", "myDir", resources );
}
public void testShouldPreserveAddedFilterInRestoredState()
throws IOException, XmlPullParserException, URISyntaxException, ProjectBuildingException,
ModelInterpolationException
{
MavenProject project = buildProject( "pom.xml" );
ProjectBuilderConfiguration config = new DefaultProjectBuilderConfiguration();
projectBuilder.calculateConcreteState( project, config );
Build build = project.getBuild();
build.addFilter( "myDir/filters.properties" );
List filters = build.getFilters();
assertNotNull( "Concrete filters should not be null.", filters );
assertEquals( "Concrete filters should contain two entries.", 2, filters.size() );
assertFilterPresent( "concrete filters",
new File( build.getDirectory(), "generated-filters.properties" ).getAbsolutePath(),
filters );
assertFilterPresent( "concrete filters", "myDir/filters.properties", filters );
projectBuilder.restoreDynamicState( project, config );
build = project.getBuild();
filters = build.getFilters();
assertNotNull( "Restored filters should not be null.", filters );
assertEquals( "Restored filters should contain two entries.", 2, filters.size() );
assertFilterPresent( "restored filters",
"${pom.build.directory}/generated-filters.properties",
filters );
assertFilterPresent( "restored filters", "myDir/filters.properties", filters );
}
public void testShouldIncorporateChangedBuildDirectoryViaExpressionsOnNextConcreteCalculation()
throws IOException, XmlPullParserException, URISyntaxException, ProjectBuildingException,
ModelInterpolationException
{
MavenProject project = buildProject( "pom.xml" );
ProjectBuilderConfiguration config = new DefaultProjectBuilderConfiguration();
projectBuilder.calculateConcreteState( project, config );
Build build = project.getBuild();
assertEquals( "First concrete build directory should be absolute and point to target dir.",
new File( project.getBasedir(), "target" ).getAbsolutePath(),
build.getDirectory() );
assertEquals( "First concrete build output-directory should be absolute and point to target/classes dir.",
new File( project.getBasedir(), "target/classes" ).getAbsolutePath(),
build.getOutputDirectory() );
build.setDirectory( "target2" );
assertEquals( "AFTER CHANGING BUILD DIRECTORY, build directory should be relative and point to target2 dir.",
"target2",
build.getDirectory() );
assertEquals( "AFTER CHANGING BUILD DIRECTORY, build output-directory should be absolute and still point to target/classes dir.",
new File( project.getBasedir(), "target/classes" ).getAbsolutePath(),
build.getOutputDirectory() );
projectBuilder.restoreDynamicState( project, config );
projectBuilder.calculateConcreteState( project, config );
build = project.getBuild();
assertEquals( "Second concrete build directory should be absolute and point to target2 dir.",
new File( project.getBasedir(), "target2" ).getAbsolutePath(),
build.getDirectory() );
assertEquals( "Second concrete build output-directory should be absolute and point to target2/classes dir.",
new File( project.getBasedir(), "target2/classes" ).getAbsolutePath(),
build.getOutputDirectory() );
}
public void testShouldPreserveInitialValuesForPropertiesReferencingBuildPaths()
throws IOException, XmlPullParserException, URISyntaxException, ProjectBuildingException,
ModelInterpolationException
{
MavenProject project = buildProject( "pom.xml" );
ProjectBuilderConfiguration config = new DefaultProjectBuilderConfiguration();
projectBuilder.calculateConcreteState( project, config );
project.getBuild().setDirectory( "target2" );
String originalValue = project.getProperties().getProperty( "myProperty" );
projectBuilder.restoreDynamicState( project, config );
projectBuilder.calculateConcreteState( project, config );
assertEquals( "After resetting build-directory and going through a recalculation phase for the project, "
+ "property value for 'myProperty' should STILL be the absolute initial build directory.",
originalValue,
project.getProperties().getProperty( "myProperty" ) );
}
public void testShouldAlignCompileSourceRootsInConcreteState()
throws IOException, XmlPullParserException, URISyntaxException, ProjectBuildingException,
ModelInterpolationException
{
MavenProject project = buildProject( "pom-relative.xml" );
ProjectBuilderConfiguration config = new DefaultProjectBuilderConfiguration();
projectBuilder.calculateConcreteState( project, config );
List compileSourceRoots = project.getCompileSourceRoots();
assertNotNull( "First concrete state compile-source roots should not be null.",
compileSourceRoots );
assertEquals( "First concrete state should contain one compile-source root.",
1,
compileSourceRoots.size() );
assertEquals( "First concrete state should have an absolute path for compile-source root.",
new File( project.getBasedir(), "src/main/java" ).getAbsolutePath(),
compileSourceRoots.get( 0 ) );
String newSourceRoot = new File( project.getBuild().getDirectory(),
"generated-sources/modello" ).getAbsolutePath();
project.addCompileSourceRoot( newSourceRoot );
projectBuilder.restoreDynamicState( project, config );
compileSourceRoots = project.getCompileSourceRoots();
assertNotNull( "Restored dynamic state compile-source roots should not be null.",
compileSourceRoots );
assertEquals( "Restored dynamic state should contain two compile-source roots.",
2,
compileSourceRoots.size() );
assertEquals( "Restored dynamic state should have a relative path for original compile-source root.",
"src/main/java",
compileSourceRoots.get( 0 ) );
assertEquals( "Restored dynamic state should have a relative path for new compile-source root.",
"target/generated-sources/modello",
compileSourceRoots.get( 1 ) );
projectBuilder.calculateConcreteState( project, config );
compileSourceRoots = project.getCompileSourceRoots();
assertNotNull( "Second concrete state compile-source roots should not be null.",
compileSourceRoots );
assertEquals( "Second concrete state should contain two compile-source roots.",
2,
compileSourceRoots.size() );
assertEquals( "Second concrete state should have an absolute path for original compile-source root.",
new File( project.getBasedir(), "src/main/java" ).getAbsolutePath(),
compileSourceRoots.get( 0 ) );
assertEquals( "Second concrete state should have an absolute path for new compile-source root.",
newSourceRoot,
compileSourceRoots.get( 1 ) );
}
// Useful for diagnostics.
// private void displayPOM( Model model )
// throws IOException
// {
// StringWriter writer = new StringWriter();
// new MavenXpp3Writer().write( writer, model );
//
// System.out.println( writer.toString() );
// }
private void assertResourcePresent( String testLabel,
String directory,
List resources )
{
boolean found = false;
if ( resources != null )
{
for ( Iterator it = resources.iterator(); it.hasNext(); )
{
Resource resource = (Resource) it.next();
if ( directory.equals( resource.getDirectory() ) )
{
found = true;
break;
}
}
}
if ( !found )
{
fail( "Missing resource with directory: " + directory + " in " + testLabel );
}
}
private void assertFilterPresent( String testLabel,
String path,
List filters )
{
boolean found = false;
if ( filters != null )
{
for ( Iterator it = filters.iterator(); it.hasNext(); )
{
String filterPath = (String) it.next();
if ( path.equals( filterPath ) )
{
found = true;
break;
}
}
}
if ( !found )
{
fail( "Missing filter with path: " + path + " in " + testLabel );
}
}
private MavenProject buildProject( String path )
throws IOException, XmlPullParserException, URISyntaxException, ProjectBuildingException
{
ClassLoader cloader = Thread.currentThread().getContextClassLoader();
URL resource = cloader.getResource( "project-dynamism/" + path );
if ( resource == null )
{
fail( "Cannot find classpath resource for POM: " + path );
}
File pomFile = new File( resource.getPath() );
pomFile = pomFile.getAbsoluteFile();
MavenProject project = projectBuilder.build( pomFile,
new DefaultProjectBuilderConfiguration() );
assertEquals( pomFile, project.getFile() );
return project;
}
}

View File

@ -35,6 +35,7 @@ public class ProjectBaseDirectoryAlignmentTest
File f = getTestFile( dir + "project-which-needs-directory-alignment.xml" ); File f = getTestFile( dir + "project-which-needs-directory-alignment.xml" );
MavenProject project = getProject( f ); MavenProject project = getProject( f );
projectBuilder.calculateConcreteState( project, new DefaultProjectBuilderConfiguration() );
assertNotNull( "Test project can't be null!", project ); assertNotNull( "Test project can't be null!", project );

View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.test</groupId>
<artifactId>test-build-dynamism</artifactId>
<version>1</version>
<build>
<sourceDirectory>/${project.groupId}/src/main/java</sourceDirectory>
<testSourceDirectory>/${pom.groupId}/src/test/java</testSourceDirectory>
<scriptSourceDirectory>/${groupId}/src/main/scripts</scriptSourceDirectory>
<plugins>
<plugin>
<artifactId>my-plugin</artifactId>
<configuration>
<testOne>${project.groupId}</testOne>
<testTwo>${pom.groupId}</testTwo>
<testThree>${groupId}</testThree>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.test</groupId>
<artifactId>test-build-dynamism</artifactId>
<version>1</version>
<properties>
<myProperty>${pom.build.directory}</myProperty>
</properties>
<build>
<resources>
<resource>
<directory>${pom.build.directory}/generated-resources/plexus</directory>
</resource>
</resources>
<filters>
<filter>${pom.build.directory}/generated-filters.properties</filter>
</filters>
<directory>target</directory>
<sourceDirectory>src/main/java</sourceDirectory>
<testSourceDirectory>src/test/java</testSourceDirectory>
<scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
<outputDirectory>${pom.build.directory}/classes</outputDirectory>
<testOutputDirectory>${pom.build.directory}/test-classes</testOutputDirectory>
</build>
</project>

View File

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.test</groupId>
<artifactId>test-build-dynamism</artifactId>
<version>1</version>
<properties>
<myProperty>${pom.build.directory}</myProperty>
</properties>
<build>
<resources>
<resource>
<directory>${pom.build.directory}/generated-resources/plexus</directory>
</resource>
</resources>
<filters>
<filter>${pom.build.directory}/generated-filters.properties</filter>
</filters>
<directory>target</directory>
<sourceDirectory>${pom.basedir}/src/main/java</sourceDirectory>
<testSourceDirectory>${pom.basedir}/src/test/java</testSourceDirectory>
<scriptSourceDirectory>${pom.basedir}/src/main/scripts</scriptSourceDirectory>
<outputDirectory>${pom.build.directory}/classes</outputDirectory>
<testOutputDirectory>${pom.build.directory}/test-classes</testOutputDirectory>
</build>
</project>

32
pom.xml
View File

@ -46,9 +46,25 @@ under the License.
<!-- TODO: TAKE THIS OUT BEFORE WE RELEASE! --> <!-- TODO: TAKE THIS OUT BEFORE WE RELEASE! -->
<repositories> <repositories>
<repository>
<id>apache.snapshots</id>
<url>http://people.apache.org/repo/m2-snapshot-repository/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>false</enabled>
</releases>
</repository>
<repository> <repository>
<id>codehaus.snapshots</id> <id>codehaus.snapshots</id>
<url>http://snapshots.repository.codehaus.org/</url> <url>http://snapshots.repository.codehaus.org/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>false</enabled>
</releases>
</repository> </repository>
</repositories> </repositories>
@ -221,6 +237,7 @@ under the License.
<properties> <properties>
<plexusVersion>1.0-alpha-48</plexusVersion> <plexusVersion>1.0-alpha-48</plexusVersion>
<wagonVersion>1.0-beta-3</wagonVersion> <wagonVersion>1.0-beta-3</wagonVersion>
<artifactVersion>3.0-20080627-013430-64</artifactVersion>
</properties> </properties>
<!--start--> <!--start-->
@ -286,6 +303,11 @@ under the License.
<artifactId>maven-core</artifactId> <artifactId>maven-core</artifactId>
<version>2.1-SNAPSHOT</version> <version>2.1-SNAPSHOT</version>
</dependency> </dependency>
<dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-utils</artifactId>
<version>1.5.4</version>
</dependency>
<dependency> <dependency>
<groupId>org.codehaus.plexus</groupId> <groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-container-default</artifactId> <artifactId>plexus-container-default</artifactId>
@ -296,11 +318,6 @@ under the License.
<artifactId>plexus-classworlds</artifactId> <artifactId>plexus-classworlds</artifactId>
<version>1.2-alpha-12</version> <version>1.2-alpha-12</version>
</dependency> </dependency>
<dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-utils</artifactId>
<version>1.5.1</version>
</dependency>
<dependency> <dependency>
<groupId>org.codehaus.plexus</groupId> <groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-interpolation</artifactId> <artifactId>plexus-interpolation</artifactId>
@ -334,6 +351,9 @@ under the License.
<dependency> <dependency>
<groupId>org.apache.maven.artifact</groupId> <groupId>org.apache.maven.artifact</groupId>
<artifactId>maven-artifact</artifactId> <artifactId>maven-artifact</artifactId>
<!--
<version>${artifactVersion}</version>
-->
<version>3.0-SNAPSHOT</version> <version>3.0-SNAPSHOT</version>
</dependency> </dependency>
<dependency> <dependency>
@ -389,7 +409,7 @@ under the License.
<!--start--> <!--start-->
</dependencyManagement> </dependencyManagement>
<!--end--> <!--end-->
<distributionManagement> <distributionManagement>
<site> <site>
<id>apache.website</id> <id>apache.website</id>