From 9a86709abd43de0a53babd447f7e5ff16e2b550a Mon Sep 17 00:00:00 2001 From: Brett Leslie Porter Date: Thu, 28 Jul 2005 09:32:32 +0000 Subject: [PATCH] PR: MNG-249 make compile and package reactor aware git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@225731 13f79535-47bb-0310-9956-ffa450edef68 --- .../resolver/DefaultArtifactResolver.java | 3 +- .../org/apache/maven/artifact/Artifact.java | 1 + maven-core-it/README.txt | 2 + maven-core-it/integration-tests.txt | 1 + maven-core-it/it0042/expected-results.txt | 3 + maven-core-it/it0042/goals.txt | 2 + maven-core-it/it0042/pom.xml | 13 +++++ maven-core-it/it0042/test-component-a/pom.xml | 14 +++++ .../test-component-a/src/main/java/A.java | 3 + maven-core-it/it0042/test-component-b/pom.xml | 22 +++++++ .../test-component-b/src/main/java/B.java | 5 ++ .../src/main/webapp/WEB-INF/web.xml | 5 ++ .../maven/plugin/DefaultPluginManager.java | 2 +- maven-plugins/maven-compiler-plugin/pom.xml | 5 ++ .../maven/plugin/AbstractCompilerMojo.java | 10 ++-- .../org/apache/maven/plugin/CompilerMojo.java | 28 +++++++-- .../apache/maven/plugin/TestCompilerMojo.java | 5 +- .../org/apache/maven/plugin/jar/JarMojo.java | 2 + .../project/DefaultMavenProjectBuilder.java | 4 +- .../apache/maven/project/MavenProject.java | 57 +++++++++++++++++-- .../apache/maven/project/ProjectSorter.java | 38 +++++-------- 21 files changed, 176 insertions(+), 49 deletions(-) create mode 100644 maven-core-it/it0042/expected-results.txt create mode 100644 maven-core-it/it0042/goals.txt create mode 100644 maven-core-it/it0042/pom.xml create mode 100644 maven-core-it/it0042/test-component-a/pom.xml create mode 100644 maven-core-it/it0042/test-component-a/src/main/java/A.java create mode 100644 maven-core-it/it0042/test-component-b/pom.xml create mode 100644 maven-core-it/it0042/test-component-b/src/main/java/B.java create mode 100644 maven-core-it/it0042/test-component-b/src/main/webapp/WEB-INF/web.xml diff --git a/maven-artifact-manager/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactResolver.java b/maven-artifact-manager/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactResolver.java index 4728b7353e..8c83e48ab6 100644 --- a/maven-artifact-manager/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactResolver.java +++ b/maven-artifact-manager/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactResolver.java @@ -73,7 +73,8 @@ private void resolve( Artifact artifact, List remoteRepositories, ArtifactReposi boolean force ) throws ArtifactResolutionException { - if ( artifact != null ) + // skip artifacts with a file - they are already resolved + if ( artifact != null && artifact.getFile() == null ) { // ---------------------------------------------------------------------- // Check for the existence of the artifact in the specified local diff --git a/maven-artifact/src/main/java/org/apache/maven/artifact/Artifact.java b/maven-artifact/src/main/java/org/apache/maven/artifact/Artifact.java index 3e98882d9d..799bce7ce4 100644 --- a/maven-artifact/src/main/java/org/apache/maven/artifact/Artifact.java +++ b/maven-artifact/src/main/java/org/apache/maven/artifact/Artifact.java @@ -30,6 +30,7 @@ * Description of an artifact. * * @todo do we really need an interface here? + * @todo get rid of the multiple states we can have (project, parent, etc artifacts, file == null, snapshot, etc) - construct subclasses and use accordingly? */ public interface Artifact extends Comparable diff --git a/maven-core-it/README.txt b/maven-core-it/README.txt index c093de8b79..56e967cbc1 100644 --- a/maven-core-it/README.txt +++ b/maven-core-it/README.txt @@ -120,6 +120,8 @@ it0040: Test the use of a packaging from a plugin it0041: Test the use of a new type from a plugin +it0042: Test that the reactor can establish the artifact location of known projects for dependencies + ------------------------------------------------------------------------------- - generated sources diff --git a/maven-core-it/integration-tests.txt b/maven-core-it/integration-tests.txt index 8c3849deeb..54bb36645a 100644 --- a/maven-core-it/integration-tests.txt +++ b/maven-core-it/integration-tests.txt @@ -1,3 +1,4 @@ +it0042 it0041 it0040 it0039 diff --git a/maven-core-it/it0042/expected-results.txt b/maven-core-it/it0042/expected-results.txt new file mode 100644 index 0000000000..2e02d60148 --- /dev/null +++ b/maven-core-it/it0042/expected-results.txt @@ -0,0 +1,3 @@ +test-component-a/target/test-component-a-0.1.jar +test-component-b/target/test-component-b-0.1.war +test-component-b/target/test-component-b-0.1.war!/WEB-INF/lib/test-component-a-0.1.jar diff --git a/maven-core-it/it0042/goals.txt b/maven-core-it/it0042/goals.txt new file mode 100644 index 0000000000..136904b743 --- /dev/null +++ b/maven-core-it/it0042/goals.txt @@ -0,0 +1,2 @@ +compile +package diff --git a/maven-core-it/it0042/pom.xml b/maven-core-it/it0042/pom.xml new file mode 100644 index 0000000000..725ef78be1 --- /dev/null +++ b/maven-core-it/it0042/pom.xml @@ -0,0 +1,13 @@ + + 4.0.0 + test + test-components + 0.1 + Test Components + pom + + + test-component-a + test-component-b + + diff --git a/maven-core-it/it0042/test-component-a/pom.xml b/maven-core-it/it0042/test-component-a/pom.xml new file mode 100644 index 0000000000..2e6df5cfcb --- /dev/null +++ b/maven-core-it/it0042/test-component-a/pom.xml @@ -0,0 +1,14 @@ + + 4.0.0 + + test-components + test + 0.1 + + + test + test-component-a + 0.1 + Test Component A + jar + diff --git a/maven-core-it/it0042/test-component-a/src/main/java/A.java b/maven-core-it/it0042/test-component-a/src/main/java/A.java new file mode 100644 index 0000000000..73e270dbea --- /dev/null +++ b/maven-core-it/it0042/test-component-a/src/main/java/A.java @@ -0,0 +1,3 @@ +public class A { +} + diff --git a/maven-core-it/it0042/test-component-b/pom.xml b/maven-core-it/it0042/test-component-b/pom.xml new file mode 100644 index 0000000000..d08fc00af8 --- /dev/null +++ b/maven-core-it/it0042/test-component-b/pom.xml @@ -0,0 +1,22 @@ + + 4.0.0 + + test-components + test + 0.1 + + + test + test-component-b + 0.1 + Test Component B + war + + + + test + test-component-a + 0.1 + + + diff --git a/maven-core-it/it0042/test-component-b/src/main/java/B.java b/maven-core-it/it0042/test-component-b/src/main/java/B.java new file mode 100644 index 0000000000..c288d4d8b7 --- /dev/null +++ b/maven-core-it/it0042/test-component-b/src/main/java/B.java @@ -0,0 +1,5 @@ +public class B + extends A +{ +} + diff --git a/maven-core-it/it0042/test-component-b/src/main/webapp/WEB-INF/web.xml b/maven-core-it/it0042/test-component-b/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..92bb2e9825 --- /dev/null +++ b/maven-core-it/it0042/test-component-b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java b/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java index 83f6f77bab..000f043db9 100644 --- a/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java +++ b/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java @@ -1051,7 +1051,7 @@ private void resolveTransitiveDependencies( MavenSession context, ArtifactResolv // check this with yourkit as a hot spot. try { - project.setDependencyArtifacts( MavenProject.createArtifacts( artifactFactory, project.getDependencies() ) ); + project.setDependencyArtifacts( project.createArtifacts( artifactFactory ) ); } catch ( InvalidVersionSpecificationException e ) { diff --git a/maven-plugins/maven-compiler-plugin/pom.xml b/maven-plugins/maven-compiler-plugin/pom.xml index 6728bde8bb..bd44188bef 100644 --- a/maven-plugins/maven-compiler-plugin/pom.xml +++ b/maven-plugins/maven-compiler-plugin/pom.xml @@ -22,5 +22,10 @@ plexus-compiler-javac 1.4 + + org.apache.maven + maven-artifact + 2.0-beta-1-SNAPSHOT + diff --git a/maven-plugins/maven-compiler-plugin/src/main/java/org/apache/maven/plugin/AbstractCompilerMojo.java b/maven-plugins/maven-compiler-plugin/src/main/java/org/apache/maven/plugin/AbstractCompilerMojo.java index 4b16b9823a..bbbaa6fddd 100644 --- a/maven-plugins/maven-compiler-plugin/src/main/java/org/apache/maven/plugin/AbstractCompilerMojo.java +++ b/maven-plugins/maven-compiler-plugin/src/main/java/org/apache/maven/plugin/AbstractCompilerMojo.java @@ -79,7 +79,7 @@ public abstract class AbstractCompilerMojo protected abstract List getCompileSourceRoots(); - protected abstract String getOutputDirectory(); + protected abstract File getOutputDirectory(); public void execute() throws MojoExecutionException @@ -97,7 +97,7 @@ public void execute() CompilerConfiguration compilerConfiguration = new CompilerConfiguration(); - compilerConfiguration.setOutputLocation( getOutputDirectory() ); + compilerConfiguration.setOutputLocation( getOutputDirectory().getAbsolutePath() ); compilerConfiguration.setClasspathEntries( getClasspathElements() ); compilerConfiguration.setSourceLocations( compileSourceRoots ); @@ -131,7 +131,7 @@ public void execute() compilerConfiguration.setDebug( debug ); - List messages = null; + List messages; try { messages = compiler.compile( compilerConfiguration ); @@ -169,8 +169,6 @@ private Set computeStaleSources() scanner.addSourceMapping( mapping ); - File outDir = new File( getOutputDirectory() ); - Set staleSources = new HashSet(); for ( Iterator it = getCompileSourceRoots().iterator(); it.hasNext(); ) @@ -186,7 +184,7 @@ private Set computeStaleSources() try { - staleSources.addAll( scanner.getIncludedSources( rootFile, outDir ) ); + staleSources.addAll( scanner.getIncludedSources( rootFile, getOutputDirectory() ) ); } catch ( InclusionScanException e ) { diff --git a/maven-plugins/maven-compiler-plugin/src/main/java/org/apache/maven/plugin/CompilerMojo.java b/maven-plugins/maven-compiler-plugin/src/main/java/org/apache/maven/plugin/CompilerMojo.java index 86a3ca11c0..baf1085408 100644 --- a/maven-plugins/maven-compiler-plugin/src/main/java/org/apache/maven/plugin/CompilerMojo.java +++ b/maven-plugins/maven-compiler-plugin/src/main/java/org/apache/maven/plugin/CompilerMojo.java @@ -14,7 +14,10 @@ * the License. */ +import org.apache.maven.artifact.Artifact; + import java.util.List; +import java.io.File; /** * @author Jason van Zyl @@ -34,21 +37,29 @@ public class CompilerMojo * @readonly */ private List compileSourceRoots; - + /** * @parameter expression="${project.compileClasspathElements}" * @required * @readonly */ private List classpathElements; - + /** * @parameter expression="${project.build.outputDirectory}" * @required * @readonly */ - private String outputDirectory; - + private File outputDirectory; + + /** + * @parameter expression="${project.artifact}" + * @required + * @readonly + * @todo this is an export variable, really + */ + private Artifact projectArtifact; + protected List getCompileSourceRoots() { return compileSourceRoots; @@ -59,9 +70,16 @@ protected List getClasspathElements() return classpathElements; } - protected String getOutputDirectory() + protected File getOutputDirectory() { return outputDirectory; } + public void execute() + throws MojoExecutionException + { + super.execute(); + + projectArtifact.setFile( outputDirectory ); + } } \ No newline at end of file diff --git a/maven-plugins/maven-compiler-plugin/src/main/java/org/apache/maven/plugin/TestCompilerMojo.java b/maven-plugins/maven-compiler-plugin/src/main/java/org/apache/maven/plugin/TestCompilerMojo.java index 50c0d7a56c..2df378ca26 100644 --- a/maven-plugins/maven-compiler-plugin/src/main/java/org/apache/maven/plugin/TestCompilerMojo.java +++ b/maven-plugins/maven-compiler-plugin/src/main/java/org/apache/maven/plugin/TestCompilerMojo.java @@ -1,6 +1,7 @@ package org.apache.maven.plugin; import java.util.List; +import java.io.File; /* * Copyright 2001-2005 The Apache Software Foundation. @@ -48,7 +49,7 @@ public class TestCompilerMojo * @required * @readonly */ - private String outputDirectory; + private File outputDirectory; protected List getCompileSourceRoots() { @@ -60,7 +61,7 @@ protected List getClasspathElements() return classpathElements; } - protected String getOutputDirectory() + protected File getOutputDirectory() { return outputDirectory; } diff --git a/maven-plugins/maven-jar-plugin/src/main/java/org/apache/maven/plugin/jar/JarMojo.java b/maven-plugins/maven-jar-plugin/src/main/java/org/apache/maven/plugin/jar/JarMojo.java index 354fbff575..cb98524fa4 100644 --- a/maven-plugins/maven-jar-plugin/src/main/java/org/apache/maven/plugin/jar/JarMojo.java +++ b/maven-plugins/maven-jar-plugin/src/main/java/org/apache/maven/plugin/jar/JarMojo.java @@ -98,6 +98,8 @@ public void execute() } archiver.createArchive( project, archive ); + + project.getArtifact().setFile( jarFile ); } catch ( Exception e ) { diff --git a/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java b/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java index 35cd27e80e..89dd16f897 100644 --- a/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java +++ b/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java @@ -154,8 +154,7 @@ public MavenProject buildWithDependencies( File projectDescriptor, ArtifactRepos try { - project.setDependencyArtifacts( - MavenProject.createArtifacts( artifactFactory, project.getDependencies() ) ); + project.setDependencyArtifacts( project.createArtifacts( artifactFactory ) ); } catch ( InvalidVersionSpecificationException e ) { @@ -474,7 +473,6 @@ private MavenProject processProjectLogic( String pomLocation, MavenProject proje // TODO: maybe not strictly correct, while we should enfore that packaging has a type handler of the same id, we don't Artifact projectArtifact = artifactFactory.createBuildArtifact( project.getGroupId(), project.getArtifactId(), project.getVersion(), project.getPackaging() ); - project.setArtifact( projectArtifact ); project.setPluginArtifactRepositories( ProjectUtils.buildArtifactRepositories( model.getPluginRepositories(), diff --git a/maven-project/src/main/java/org/apache/maven/project/MavenProject.java b/maven-project/src/main/java/org/apache/maven/project/MavenProject.java index a123f94f94..abc3f6de14 100644 --- a/maven-project/src/main/java/org/apache/maven/project/MavenProject.java +++ b/maven-project/src/main/java/org/apache/maven/project/MavenProject.java @@ -52,11 +52,13 @@ import java.io.Writer; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; +import java.util.HashSet; /** * The concern of the project is provide runtime values based on the model.

@@ -124,6 +126,8 @@ public class MavenProject private Map reportArtifactMap; + private Map projectReferences = new HashMap(); + public MavenProject( Model model ) { this.model = model; @@ -329,12 +333,21 @@ public List getCompileClasspathElements() // TODO: let the scope handler deal with this if ( Artifact.SCOPE_COMPILE.equals( a.getScope() ) || Artifact.SCOPE_PROVIDED.equals( a.getScope() ) ) { - File file = a.getFile(); - if ( file == null ) + String refId = getProjectReferenceId( a.getGroupId(), a.getArtifactId() ); + MavenProject project = (MavenProject) projectReferences.get( refId ); + if ( project != null ) { - throw new DependencyResolutionRequiredException( a ); + list.add( project.getBuild().getOutputDirectory() ); + } + else + { + File file = a.getFile(); + if ( file == null ) + { + throw new DependencyResolutionRequiredException( a ); + } + list.add( file.getPath() ); } - list.add( file.getPath() ); } } } @@ -1217,9 +1230,41 @@ public List getBuildExtensions() /** * @todo the lazy initialisation of this makes me uneasy. */ - public static Set createArtifacts( ArtifactFactory artifactFactory, List dependencies ) + public Set createArtifacts( ArtifactFactory artifactFactory ) throws InvalidVersionSpecificationException { - return MavenMetadataSource.createArtifacts( artifactFactory, dependencies, null, null ); + Set artifacts = new HashSet( getDependencies().size() ); + + List list = new ArrayList( getDependencies().size() ); + for ( Iterator i = getDependencies().iterator(); i.hasNext(); ) + { + Dependency dependency = (Dependency) i.next(); + String refId = getProjectReferenceId( dependency.getGroupId(), dependency.getArtifactId() ); + MavenProject project = (MavenProject) projectReferences.get( refId ); + if ( project != null && project.getArtifact() != null ) + { + // TODO: actually these need to be funnelled through the same process and the artifacts cloned somehow + project.getArtifact().setScope( dependency.getScope() ); + artifacts.add( project.getArtifact() ); + } + else + { + list.add( dependency ); + } + } + + artifacts.addAll( MavenMetadataSource.createArtifacts( artifactFactory, list, null, null ) ); + + return artifacts; + } + + public void addProjectReference( MavenProject project ) + { + projectReferences.put( getProjectReferenceId( project.getGroupId(), project.getArtifactId() ), project ); + } + + private static String getProjectReferenceId( String groupId, String artifactId ) + { + return groupId + ":" + artifactId; } } diff --git a/maven-project/src/main/java/org/apache/maven/project/ProjectSorter.java b/maven-project/src/main/java/org/apache/maven/project/ProjectSorter.java index 37678b7b24..ed33f2b3bc 100644 --- a/maven-project/src/main/java/org/apache/maven/project/ProjectSorter.java +++ b/maven-project/src/main/java/org/apache/maven/project/ProjectSorter.java @@ -19,6 +19,7 @@ import org.apache.maven.model.Dependency; import org.apache.maven.model.Extension; import org.apache.maven.model.Plugin; +import org.apache.maven.model.ReportPlugin; import org.codehaus.plexus.util.dag.CycleDetectedException; import org.codehaus.plexus.util.dag.DAG; import org.codehaus.plexus.util.dag.TopologicalSorter; @@ -64,7 +65,7 @@ public static List getSortedProjects( List projects ) { MavenProject project = (MavenProject) i.next(); - String id = getProjectId( project ); + String id = getId( project.getGroupId(), project.getArtifactId() ); dag.addVertex( id ); @@ -75,16 +76,18 @@ public static List getSortedProjects( List projects ) { MavenProject project = (MavenProject) i.next(); - String id = getProjectId( project ); + String id = getId( project.getGroupId(), project.getArtifactId() ); for ( Iterator j = project.getDependencies().iterator(); j.hasNext(); ) { Dependency dependency = (Dependency) j.next(); - String dependencyId = getDependencyId( dependency ); + String dependencyId = getId( dependency.getGroupId(), dependency.getArtifactId() ); if ( dag.getVertex( dependencyId ) != null ) { + project.addProjectReference( (MavenProject) projectMap.get( dependencyId ) ); + dag.addEdge( id, dependencyId ); } } @@ -92,7 +95,7 @@ public static List getSortedProjects( List projects ) MavenProject parent = project.getParent(); if ( parent != null ) { - String parentId = getProjectId( parent ); + String parentId = getId( parent.getGroupId(), parent.getArtifactId() ); if ( dag.getVertex( parentId ) != null ) { dag.addEdge( id, parentId ); @@ -105,7 +108,7 @@ public static List getSortedProjects( List projects ) for ( Iterator j = buildPlugins.iterator(); j.hasNext(); ) { Plugin plugin = (Plugin) j.next(); - String pluginId = getPluginId( plugin ); + String pluginId = getId( plugin.getGroupId(), plugin.getArtifactId() ); if ( dag.getVertex( pluginId ) != null ) { dag.addEdge( id, pluginId ); @@ -118,8 +121,8 @@ public static List getSortedProjects( List projects ) { for ( Iterator j = reportPlugins.iterator(); j.hasNext(); ) { - Plugin plugin = (Plugin) j.next(); - String pluginId = getPluginId( plugin ); + ReportPlugin plugin = (ReportPlugin) j.next(); + String pluginId = getId( plugin.getGroupId(), plugin.getArtifactId() ); if ( dag.getVertex( pluginId ) != null ) { dag.addEdge( id, pluginId ); @@ -130,7 +133,7 @@ public static List getSortedProjects( List projects ) for ( Iterator j = project.getBuildExtensions().iterator(); j.hasNext(); ) { Extension extension = (Extension) j.next(); - String extensionId = getExtensionId( extension ); + String extensionId = getId( extension.getGroupId(), extension.getArtifactId() ); if ( dag.getVertex( extensionId ) != null ) { dag.addEdge( id, extensionId ); @@ -150,23 +153,8 @@ public static List getSortedProjects( List projects ) return sortedProjects; } - private static String getExtensionId( Extension extension ) + private static String getId( String groupId, String artifactId ) { - return extension.getGroupId() + ":" + extension.getArtifactId(); - } - - private static String getPluginId( Plugin plugin ) - { - return plugin.getGroupId() + ":" + plugin.getArtifactId(); - } - - private static String getDependencyId( Dependency dependency ) - { - return dependency.getGroupId() + ":" + dependency.getArtifactId(); - } - - private static String getProjectId( MavenProject project ) - { - return project.getGroupId() + ":" + project.getArtifactId(); + return groupId + ":" + artifactId; } }