transitive deps in mboot. Will now proceed to trim up the POMs. Still need to trim ~/maven2/lib also.

git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@163764 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Brett Leslie Porter 2005-04-04 14:35:06 +00:00
parent 9ccbd046a7
commit 2e3e41fddf
13 changed files with 263 additions and 76 deletions

View File

@ -169,6 +169,13 @@ public class SnapshotArtifactMetadata
String version = FileUtils.fileRead( file );
lastModified = file.lastModified();
/* TODO: try this
if( version.matches( "/^(.*)-([0-9]{8}.[0-9]{6})-([0-9]+)$/" ))
{
}
*/
int index = version.lastIndexOf( "-" );
if ( version.indexOf( "SNAPSHOT" ) >= 0 || index < 0 )
{

View File

@ -84,7 +84,7 @@
<dependency>
<groupId>plexus</groupId>
<artifactId>plexus-marmalade-factory</artifactId>
<version>1.0-alpha-2-SNAPSHOT</version>
<version>1.0-alpha-2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
@ -98,7 +98,7 @@
<dependency>
<groupId>marmalade</groupId>
<artifactId>marmalade-core</artifactId>
<version>1.0-alpha2-SNAPSHOT</version>
<version>1.0-alpha2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>

View File

@ -11,24 +11,6 @@
<version>2.0-SNAPSHOT</version>
<description>Tool used to bootstrap m2.</description>
<dependencies>
<dependency>
<groupId>org.codehaus.modello</groupId>
<artifactId>modello-core</artifactId>
<version>1.0-alpha-1</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.codehaus.modello</groupId>
<artifactId>modello-xdoc-plugin</artifactId>
<version>1.0-alpha-1</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.codehaus.modello</groupId>
<artifactId>modello-xml-plugin</artifactId>
<version>1.0-alpha-1</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.codehaus.modello</groupId>
<artifactId>modello-xpp3-plugin</artifactId>

View File

@ -25,6 +25,7 @@ import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
@ -242,11 +243,9 @@ public class MBoot
Repository localRepository = new Repository( mavenRepoLocal, Repository.LAYOUT_DEFAULT );
ModelReader reader = new ModelReader( localRepository );
if ( online )
{
downloader = new ArtifactDownloader( localRepository, reader.getRemoteRepositories() );
downloader = new ArtifactDownloader( localRepository, Collections.EMPTY_LIST );
if ( userModelReader.getActiveProxy() != null )
{
Proxy proxy = userModelReader.getActiveProxy();
@ -271,14 +270,14 @@ public class MBoot
// Install it-support POM
installPomFile( localRepository, new File( basedir, "maven-core-it-support/pom.xml" ) );
reader = new ModelReader( localRepository );
ModelReader reader = new ModelReader( downloader, true );
reader.parse( new File( basedir, "maven-mboot2/pom.xml" ) );
ClassLoader bootstrapClassLoader = createClassloaderFromDependencies( reader.getDependencies(), null,
localRepository );
reader = new ModelReader( localRepository );
reader = new ModelReader( downloader, true );
reader.parse( new File( basedir, "maven-plugins/maven-surefire-plugin/pom.xml" ) );
List surefireDependencies = new ArrayList();
@ -297,9 +296,9 @@ public class MBoot
downloader.downloadDependencies( surefireDependencies );
}
reader = new ModelReader( localRepository );
reader = new ModelReader( downloader, true );
List coreDeps = null;
Collection coreDeps = null;
Dependency corePom = null;
for ( int i = 0; i < builds.length; i++ )
@ -324,7 +323,7 @@ public class MBoot
System.out.println( "--------------------------------------------------------------------" );
}
reader = new ModelReader( localRepository );
reader = new ModelReader( downloader, true );
reader.parse( new File( basedir, "maven-plugin-tools/maven-plugin-tools-pluggy/pom.xml" ) );
List dependencies = new ArrayList( reader.getDependencies() );
dependencies.add(
@ -394,6 +393,7 @@ public class MBoot
// lib
// ----------------------------------------------------------------------
// TODO: check this - we are transitively including in /lib...
File lib = new File( dist, "lib" );
lib.mkdirs();
@ -411,8 +411,9 @@ public class MBoot
{
FileUtils.copyFileToDirectory( source, core );
}
else
else if ( !d.getScope().equals( SCOPE_TEST ) && !d.getArtifactId().equals( "plexus-utils" ) )
{
// only compile and runtime
FileUtils.copyFileToDirectory( source, lib );
}
}
@ -465,7 +466,7 @@ public class MBoot
{
System.out.println( "Building project in " + basedir );
ModelReader reader = new ModelReader( localRepository );
ModelReader reader = new ModelReader( downloader, true );
reader.parse( new File( basedir, "pom.xml" ) );
@ -483,8 +484,6 @@ public class MBoot
String generatedSources = new File( basedir, GENERATED_SOURCES ).getAbsolutePath();
String generatedDocs = new File( basedir, GENERATED_DOCS ).getAbsolutePath();
File buildDirFile = new File( basedir, BUILD_DIR );
String buildDir = buildDirFile.getAbsolutePath();
@ -546,7 +545,6 @@ public class MBoot
classLoader );
generateSources( model.getAbsolutePath(), "xpp3-writer", generatedSources, modelVersion, "false",
classLoader );
generateSources( model.getAbsolutePath(), "xdoc", generatedDocs, modelVersion, "false", classLoader );
}
// ----------------------------------------------------------------------
@ -591,7 +589,7 @@ public class MBoot
System.out.println( "Compiling test sources ..." );
List testDependencies = reader.getDependencies();
Collection testDependencies = reader.getDependencies();
compile( testDependencies, testSources, testClasses, classes, null, SCOPE_TEST, localRepository );
@ -666,7 +664,7 @@ public class MBoot
Thread.currentThread().setContextClassLoader( old );
}
private IsolatedClassLoader createClassloaderFromDependencies( List dependencies, ClassLoader parent,
private IsolatedClassLoader createClassloaderFromDependencies( Collection dependencies, ClassLoader parent,
Repository localRepository )
throws Exception
{
@ -719,7 +717,7 @@ public class MBoot
private void installPomFile( Repository localRepository, File pomIn )
throws Exception
{
ModelReader reader = new ModelReader( localRepository );
ModelReader reader = new ModelReader( downloader, false );
reader.parse( pomIn );
@ -814,13 +812,13 @@ public class MBoot
// Compile
// ----------------------------------------------------------------------
private List classpath( List dependencies, String extraClasspath, String scope, Repository localRepository )
private List classpath( Collection dependencies, String extraClasspath, String scope, Repository localRepository )
{
List classpath = new ArrayList( dependencies.size() + 1 );
for ( int i = 0; i < dependencies.size(); i++ )
for ( Iterator i = dependencies.iterator(); i.hasNext(); )
{
Dependency d = (Dependency) dependencies.get( i );
Dependency d = (Dependency) i.next();
String element = localRepository.getArtifactFile( d ).getAbsolutePath();
@ -849,8 +847,8 @@ public class MBoot
return classpath;
}
private void compile( List dependencies, String sourceDirectory, String outputDirectory, String extraClasspath,
String generatedSources, String scope, Repository localRepository )
private void compile( Collection dependencies, String sourceDirectory, String outputDirectory,
String extraClasspath, String generatedSources, String scope, Repository localRepository )
throws Exception
{
JavacCompiler compiler = new JavacCompiler();
@ -874,7 +872,6 @@ public class MBoot
{
if ( new File( sourceDirectory ).exists() )
{
sourceDirectories = new String[]{sourceDirectory};
}
}
@ -882,7 +879,6 @@ public class MBoot
if ( sourceDirectories != null )
{
CompilerConfiguration compilerConfiguration = new CompilerConfiguration();
compilerConfiguration.setOutputLocation( outputDirectory );
compilerConfiguration.setClasspathEntries(
classpath( dependencies, extraClasspath, scope, localRepository ) );

View File

@ -10,6 +10,7 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.Collection;
public class ArtifactDownloader
{
@ -60,14 +61,14 @@ public class ArtifactDownloader
System.out.println( "Using the following proxy : " + proxyHost + "/" + proxyPort );
}
public void downloadDependencies( List dependencies )
throws Exception
public void downloadDependencies( Collection dependencies )
throws DownloadFailedException
{
for ( Iterator j = dependencies.iterator(); j.hasNext(); )
{
Dependency dep = (Dependency) j.next();
if ( !downloadedArtifacts.contains( dep.getId() ) )
if ( !downloadedArtifacts.contains( dep ) )
{
File destinationFile = localRepository.getArtifactFile( dep );
// The directory structure for this project may
@ -94,10 +95,10 @@ public class ArtifactDownloader
if ( !destinationFile.exists() )
{
throw new Exception( "Failed to download " + dep );
throw new DownloadFailedException( "Failed to download " + dep );
}
downloadedArtifacts.add( dep.getId() );
downloadedArtifacts.add( dep );
}
}
}
@ -209,4 +210,9 @@ public class ArtifactDownloader
{
System.out.println( message );
}
public Repository getLocalRepository()
{
return localRepository;
}
}

View File

@ -0,0 +1,31 @@
package download;
/*
* Copyright 2001-2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Failed download.
*
* @author <a href="mailto:brett@apache.org">Brett Porter</a>
* @version $Id$
*/
public class DownloadFailedException extends Exception
{
public DownloadFailedException( String message )
{
super( message );
}
}

View File

@ -199,4 +199,52 @@ public class Dependency
{
return getId() + ":" + getVersion() + ":" + getType();
}
public int hashCode()
{
int result = 17;
result = 37 * result + groupId.hashCode();
result = 37 * result + artifactId.hashCode();
result = 37 * result + type.hashCode();
result = 37 * result + version.hashCode();
return result;
}
public boolean equals( Object o )
{
if ( o == this )
{
return true;
}
if ( !( o instanceof Dependency ) )
{
return false;
}
Dependency d = (Dependency) o;
if ( !d.getGroupId().equals( groupId ) )
{
return false;
}
else if ( !d.getArtifactId().equals( artifactId ) )
{
return false;
}
else if ( !d.getVersion().equals( version ) )
{
return false;
}
else if ( !d.getType().equals( type ) )
{
return false;
}
return true;
}
public String getConflictId()
{
return getGroupId() + ":" + getArtifactId() + ":" + getType();
}
}

View File

@ -16,6 +16,8 @@ package model;
* limitations under the License.
*/
import download.ArtifactDownloader;
import download.DownloadFailedException;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import util.AbstractReader;
@ -23,7 +25,14 @@ import util.AbstractReader;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Parse a POM.
@ -49,7 +58,7 @@ public class ModelReader
private String parentVersion;
private List dependencies = new ArrayList();
private Map dependencies = new HashMap();
private List repositories = new ArrayList();
@ -71,13 +80,23 @@ public class ModelReader
private StringBuffer bodyText = new StringBuffer();
private final Repository localRepository;
private final boolean resolveTransitiveDependencies;
private Repository currentRepository;
public ModelReader( Repository downloader )
private final ArtifactDownloader downloader;
private static Set inProgress = new HashSet();
private Map parentDependencies = new HashMap();
private Map transitiveDependencies = new HashMap();
public ModelReader( ArtifactDownloader downloader, boolean resolveTransitiveDependencies )
{
this.localRepository = downloader;
this.downloader = downloader;
this.resolveTransitiveDependencies = resolveTransitiveDependencies;
}
public List getRemoteRepositories()
@ -85,9 +104,13 @@ public class ModelReader
return repositories;
}
public List getDependencies()
public Collection getDependencies()
{
return dependencies;
Map m = new HashMap();
m.putAll( transitiveDependencies );
m.putAll( parentDependencies );
m.putAll( dependencies );
return m.values();
}
public List getResources()
@ -169,22 +192,10 @@ public class ModelReader
version = parentVersion;
}
ModelReader p = new ModelReader( localRepository );
// actually, these should be transtive (see MNG-77) - but some projects have circular deps that way (marmalade, and currently m2)
ModelReader p = retrievePom( parentGroupId, parentArtifactId, parentVersion, false );
try
{
p.parse( localRepository.getArtifactFile( parentGroupId, parentArtifactId, parentVersion, "pom" ) );
}
catch ( ParserConfigurationException e )
{
throw new SAXException( "Error getting parent POM", e );
}
catch ( IOException e )
{
throw new SAXException( "Error getting parent POM", e );
}
dependencies.addAll( p.getDependencies() );
addDependencies( p.getDependencies(), parentDependencies );
resources.addAll( p.getResources() );
@ -192,9 +203,19 @@ public class ModelReader
}
else if ( rawName.equals( "dependency" ) )
{
dependencies.add( currentDependency );
insideDependency = false;
if ( !hasDependency( currentDependency, dependencies ) )
{
if ( resolveTransitiveDependencies )
{
ModelReader p = retrievePom( currentDependency.getGroupId(), currentDependency.getArtifactId(),
currentDependency.getVersion(), resolveTransitiveDependencies );
addDependencies( p.getDependencies(), transitiveDependencies );
}
}
dependencies.put( currentDependency.getConflictId(), currentDependency );
}
else if ( rawName.equals( "resource" ) )
{
@ -311,6 +332,79 @@ public class ModelReader
depth--;
}
private void addDependencies( Collection dependencies, Map target )
{
for ( Iterator i = dependencies.iterator(); i.hasNext(); )
{
Dependency d = (Dependency) i.next();
if ( !hasDependency( d, target ) )
{
target.put( d.getConflictId(), d );
}
}
}
private boolean hasDependency( Dependency d, Map dependencies )
{
String conflictId = d.getConflictId();
if ( dependencies.containsKey( conflictId ) )
{
// We only care about pushing in compile scope dependencies I think
// if not, we'll need to be able to get the original and pick the appropriate scope
if ( d.getScope().equals( "compile" ) )
{
dependencies.remove( conflictId );
}
else
{
return true;
}
}
return false;
}
private ModelReader retrievePom( String groupId, String artifactId, String version,
boolean resolveTransitiveDependencies )
throws SAXException
{
String key = groupId + ":" + artifactId + ":" + version;
if ( inProgress.contains( key ) )
{
throw new SAXException( "Circular dependency found, looking for " + key + "\nIn progress:" + inProgress );
}
inProgress.add( key );
ModelReader p = new ModelReader( downloader, resolveTransitiveDependencies );
try
{
Dependency pom = new Dependency( groupId, artifactId, version, "pom" );
downloader.downloadDependencies( Collections.singletonList( pom ) );
Repository localRepository = downloader.getLocalRepository();
p.parse( localRepository.getArtifactFile( pom ) );
}
catch ( IOException e )
{
throw new SAXException( "Error getting parent POM", e );
}
catch ( ParserConfigurationException e )
{
throw new SAXException( "Error getting parent POM", e );
}
catch ( DownloadFailedException e )
{
throw new SAXException( "Error getting parent POM", e );
}
inProgress.remove( key );
return p;
}
public String getArtifactId()
{
return artifactId;

View File

@ -19,6 +19,7 @@ package util;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.ext.LexicalHandler;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.ParserConfigurationException;
@ -27,6 +28,10 @@ import javax.xml.parsers.SAXParserFactory;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.io.FileReader;
import java.io.StringReader;
import java.util.Arrays;
/**
* Parse an XML file.
@ -45,7 +50,13 @@ public abstract class AbstractReader
SAXParser parser = saxFactory.newSAXParser();
InputSource is = new InputSource( new FileInputStream( file ) );
// Cheap and cheerful. Please add more to skip if the parser chokes (or use the actual
StringWriter output = new StringWriter();
IOUtil.copy( new FileReader( file ), output);
String out = output.toString();
out = StringUtils.replace( out, "&oslash;", "\u00f8" );
InputSource is = new InputSource( new StringReader( out ) );
parser.parse( is, this );
}

View File

@ -27,7 +27,7 @@
<dependency>
<groupId>marmalade</groupId>
<artifactId>marmalade-core</artifactId>
<version>1.0-alpha2-SNAPSHOT</version>
<version>1.0-alpha2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
@ -97,7 +97,7 @@
<dependency>
<groupId>plexus</groupId>
<artifactId>plexus-marmalade-factory</artifactId>
<version>1.0-alpha-2-SNAPSHOT</version>
<version>1.0-alpha-2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>

View File

@ -10,6 +10,11 @@
<name>Maven Plugin</name>
<version>2.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>plexus</groupId>
<artifactId>plexus-container-default</artifactId>
<version>1.0-alpha-2</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-monitor</artifactId>

View File

@ -28,14 +28,14 @@
<dependency>
<groupId>marmalade</groupId>
<artifactId>marmalade-core</artifactId>
<version>1.0-alpha2-SNAPSHOT</version>
<version>1.0-alpha2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>plexus</groupId>
<artifactId>plexus-marmalade-factory</artifactId>
<version>1.0-alpha-2-SNAPSHOT</version>
<version>1.0-alpha-2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>

View File

@ -8,6 +8,13 @@
<artifactId>maven-settings</artifactId>
<version>2.0-SNAPSHOT</version>
<name>Maven Local Settings Model</name>
<dependencies>
<dependency>
<groupId>plexus</groupId>
<artifactId>plexus-utils</artifactId>
<version>1.0-alpha-2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>