Author: olamy
Date: Mon Dec 17 16:29:50 2007
New Revision: 605055
URL: http://svn.apache.org/viewvc?rev=605055&view=rev
Log:
[MJAR-82] Class-Path manifest entry should support maven repository layout
Added:
maven/shared/trunk/maven-archiver/src/test/resources/dummy1-1.0.jar (with
props)
maven/shared/trunk/maven-archiver/src/test/resources/dummy2-1.5.jar (with
props)
maven/shared/trunk/maven-archiver/src/test/resources/dummy3-2.0.jar (with
props)
Modified:
maven/shared/trunk/maven-archiver/src/main/java/org/apache/maven/archiver/ManifestConfiguration.java
maven/shared/trunk/maven-archiver/src/main/java/org/apache/maven/archiver/MavenArchiver.java
maven/shared/trunk/maven-archiver/src/test/java/org/apache/maven/archiver/MavenArchiverTest.java
maven/shared/trunk/maven-archiver/src/test/java/org/apache/maven/archiver/MockArtifact.java
Modified:
maven/shared/trunk/maven-archiver/src/main/java/org/apache/maven/archiver/ManifestConfiguration.java
URL:
http://svn.apache.org/viewvc/maven/shared/trunk/maven-archiver/src/main/java/org/apache/maven/archiver/ManifestConfiguration.java?rev=605055&r1=605054&r2=605055&view=diff
==============================================================================
---
maven/shared/trunk/maven-archiver/src/main/java/org/apache/maven/archiver/ManifestConfiguration.java
(original)
+++
maven/shared/trunk/maven-archiver/src/main/java/org/apache/maven/archiver/ManifestConfiguration.java
Mon Dec 17 16:29:50 2007
@@ -50,6 +50,8 @@
* Add default implementation entries if this is an extension.
*/
private boolean addDefaultImplementationEntries;
+
+ private boolean classPathMavenRepositoryLayout = false;
public String getMainClass()
{
@@ -126,5 +128,15 @@
public void setAddDefaultImplementationEntries( boolean
addDefaultImplementationEntries )
{
this.addDefaultImplementationEntries = addDefaultImplementationEntries;
+ }
+
+ public boolean isClassPathMavenRepositoryLayout()
+ {
+ return classPathMavenRepositoryLayout;
+ }
+
+ public void setClassPathMavenRepositoryLayout( boolean
classPathMavenRepositoryLayout )
+ {
+ this.classPathMavenRepositoryLayout = classPathMavenRepositoryLayout;
}
}
Modified:
maven/shared/trunk/maven-archiver/src/main/java/org/apache/maven/archiver/MavenArchiver.java
URL:
http://svn.apache.org/viewvc/maven/shared/trunk/maven-archiver/src/main/java/org/apache/maven/archiver/MavenArchiver.java?rev=605055&r1=605054&r2=605055&view=diff
==============================================================================
---
maven/shared/trunk/maven-archiver/src/main/java/org/apache/maven/archiver/MavenArchiver.java
(original)
+++
maven/shared/trunk/maven-archiver/src/main/java/org/apache/maven/archiver/MavenArchiver.java
Mon Dec 17 16:29:50 2007
@@ -26,6 +26,7 @@
import org.codehaus.plexus.archiver.jar.JarArchiver;
import org.codehaus.plexus.archiver.jar.Manifest;
import org.codehaus.plexus.archiver.jar.ManifestException;
+import org.codehaus.plexus.util.StringUtils;
import java.io.File;
import java.io.IOException;
@@ -129,6 +130,7 @@
if ( config.isAddClasspath() )
{
StringBuffer classpath = new StringBuffer();
+
List artifacts = project.getRuntimeClasspathElements();
String classpathPrefix = config.getClasspathPrefix();
@@ -137,16 +139,37 @@
File f = new File( (String) iter.next() );
if ( f.isFile() )
{
+ classpath.append( classpathPrefix );
if ( classpath.length() > 0 )
{
classpath.append( " " );
}
-
- classpath.append( classpathPrefix );
- classpath.append( f.getName() );
+ if ( !config.isClassPathMavenRepositoryLayout() )
+ {
+ classpath.append( f.getName() );
+ }
+ else
+ {
+ // we use layout
/$groupId[0]/../${groupId[n]/$artifactId/$version/{fileName}
+ // here we must find the Artifact in the projet
Artifacts to generate the maven layout
+ Artifact artifact = findArtifactWithFile(
project.getArtifacts(), f );
+ StringBuffer classpathElement = new StringBuffer();
+ if ( !StringUtils.isEmpty( artifact.getGroupId() ) )
+ {
+ classpathElement.append(
artifact.getGroupId().replace( '.', '/' ) ).append( '/' );
+ }
+ classpathElement.append( artifact.getArtifactId()
).append( '/' );
+ classpathElement.append( artifact.getVersion()
).append( '/' );
+ classpathElement.append( f.getName() );
+ classpath.append( classpathElement );
+ }
}
+
}
+
+
+
if ( classpath.length() > 0 )
{
// Class-Path is special and should be added to manifest even
if
@@ -390,5 +413,23 @@
// create archive
archiver.createArchive();
+ }
+
+
+ private Artifact findArtifactWithFile(Set artifacts, File file)
+ {
+ for ( Iterator iterator = artifacts.iterator(); iterator.hasNext(); )
+ {
+ Artifact artifact = (Artifact) iterator.next();
+ // normally not null but we can check
+ if ( artifact.getFile() != null )
+ {
+ if ( artifact.getFile().equals( file ) )
+ {
+ return artifact;
+ }
+ }
+ }
+ return null;
}
}
Modified:
maven/shared/trunk/maven-archiver/src/test/java/org/apache/maven/archiver/MavenArchiverTest.java
URL:
http://svn.apache.org/viewvc/maven/shared/trunk/maven-archiver/src/test/java/org/apache/maven/archiver/MavenArchiverTest.java?rev=605055&r1=605054&r2=605055&view=diff
==============================================================================
---
maven/shared/trunk/maven-archiver/src/test/java/org/apache/maven/archiver/MavenArchiverTest.java
(original)
+++
maven/shared/trunk/maven-archiver/src/test/java/org/apache/maven/archiver/MavenArchiverTest.java
Mon Dec 17 16:29:50 2007
@@ -19,14 +19,18 @@
* under the License.
*/
+import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
+import java.io.InputStreamReader;
import java.util.Collections;
import java.util.Comparator;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.Set;
+import java.util.StringTokenizer;
import java.util.TreeSet;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;
@@ -34,6 +38,7 @@
import junit.framework.TestCase;
import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.model.Build;
import org.apache.maven.model.Model;
import org.apache.maven.model.Organization;
@@ -42,6 +47,7 @@
import org.codehaus.plexus.archiver.jar.Manifest;
import org.codehaus.plexus.util.FileUtils;
import org.codehaus.plexus.util.IOUtil;
+import org.codehaus.plexus.util.StringUtils;
public class MavenArchiverTest
extends TestCase
@@ -435,6 +441,138 @@
}
}
+ public void testDefaultClassPathValue()
+ throws Exception
+ {
+ MavenProject project = getDummyProject();
+ InputStream inputStream = null;
+ JarFile jar = null;
+ try
+ {
+ File jarFile = new File( "target/test/dummy.jar" );
+ jarFile.delete();
+ assertFalse( jarFile.exists() );
+ JarArchiver jarArchiver = new JarArchiver();
+ jarArchiver.setDestFile( jarFile );
+
+ MavenArchiver archiver = new MavenArchiver();
+ archiver.setArchiver( jarArchiver );
+ archiver.setOutputFile( jarArchiver.getDestFile() );
+
+ MavenArchiveConfiguration config = new MavenArchiveConfiguration();
+ config.setForced( true );
+ config.getManifest().setAddDefaultImplementationEntries( true );
+ config.getManifest().setAddDefaultSpecificationEntries( true );
+ config.getManifest().setMainClass( "org.apache.maven.Foo" );
+ config.getManifest().setAddClasspath( true );
+ archiver.createArchive( project, config );
+ assertTrue( jarFile.exists() );
+ jar = new JarFile( jarFile );
+
+ ZipEntry zipEntry = jar.getEntry( "META-INF/MANIFEST.MF" );
+ Properties manifest = new Properties();
+ inputStream = jar.getInputStream( zipEntry );
+ manifest.load( inputStream );
+ String classPath = manifest.getProperty( "Class-Path" );
+ assertNotNull( classPath );
+ String[] classPathEntries = StringUtils.split( classPath, " " );
+ assertEquals("dummy1-1.0.jar", classPathEntries[0]);
+ assertEquals("dummy2-1.5.jar", classPathEntries[1]);
+ assertEquals("dummy3-2.0.jar", classPathEntries[2]);
+ }
+ finally
+ {
+ // cleanup streams
+ IOUtil.close( inputStream );
+ if ( jar != null )
+ {
+ jar.close();
+ }
+ }
+ }
+
+ public void testMavenRepoClassPathValue()
+ throws Exception
+ {
+ MavenProject project = getDummyProject();
+ InputStream inputStream = null;
+ JarFile jar = null;
+ BufferedReader bufferedReader = null;
+ try
+ {
+ File jarFile = new File( "target/test/dummy.jar" );
+ jarFile.delete();
+ assertFalse( jarFile.exists() );
+ JarArchiver jarArchiver = new JarArchiver();
+ jarArchiver.setDestFile( jarFile );
+
+ MavenArchiver archiver = new MavenArchiver();
+ archiver.setArchiver( jarArchiver );
+ archiver.setOutputFile( jarArchiver.getDestFile() );
+
+ MavenArchiveConfiguration config = new MavenArchiveConfiguration();
+ config.setForced( true );
+ config.getManifest().setAddDefaultImplementationEntries( true );
+ config.getManifest().setAddDefaultSpecificationEntries( true );
+ config.getManifest().setMainClass( "org.apache.maven.Foo" );
+ config.getManifest().setAddClasspath( true );
+ config.getManifest().setClassPathMavenRepositoryLayout( true );
+ archiver.createArchive( project, config );
+ assertTrue( jarFile.exists() );
+ jar = new JarFile( jarFile );
+
+ // we are upper than 72 characters with maven2 layout
+ // we can't test the zip file entry
+
+ //
+ Manifest manifest = archiver.getManifest( project, config );
+ String[] classPathEntries = StringUtils.split( new String(
manifest.getMainSection()
+ .getAttributeValue( "Class-Path" ).getBytes() ), " " );
+ assertEquals( "org/apache/dummy/dummy1/1.0/dummy1-1.0.jar",
classPathEntries[0] );
+ assertEquals( "org/apache/dummy/foo/dummy2/1.5/dummy2-1.5.jar",
classPathEntries[1] );
+ assertEquals( "org/apache/dummy/bar/dummy3/2.0/dummy3-2.0.jar",
classPathEntries[2] );
+
+ ZipEntry zipEntry = jar.getEntry( "META-INF/MANIFEST.MF" );
+ inputStream = jar.getInputStream( zipEntry );
+ bufferedReader = new BufferedReader( new InputStreamReader(
inputStream ) );
+ Properties manifest2 = new Properties();
+ String line = null;
+ String currentKey = null;
+ while ( ( line = bufferedReader.readLine() ) != null )
+ {
+ int index = line.indexOf( ':' );
+ if ( index > 0 )
+ {
+ currentKey = line.substring( 0, index );
+ String value = line.substring( index + 1, line.length() );
+ manifest2.put( currentKey, value );
+ }
+ if ( line.startsWith( " " ) )
+ {
+ String value = manifest2.getProperty( currentKey );
+ manifest2.put( currentKey, value + line.substring( 1 ) );
+ }
+ }
+ String classPath = manifest2.getProperty( "Class-Path" );
+ assertNotNull( classPath );
+ classPathEntries = StringUtils.split( classPath, " " );
+ assertEquals( "org/apache/dummy/dummy1/1.0/dummy1-1.0.jar",
classPathEntries[0] );
+ assertEquals( "org/apache/dummy/foo/dummy2/1.5/dummy2-1.5.jar",
classPathEntries[1] );
+ assertEquals( "org/apache/dummy/bar/dummy3/2.0/dummy3-2.0.jar",
classPathEntries[2] );
+
+ }
+ finally
+ {
+ // cleanup streams
+ IOUtil.close( inputStream );
+ IOUtil.close( bufferedReader );
+ if ( jar != null )
+ {
+ jar.close();
+ }
+ }
+ }
+
// ----------------------------------------
// common methods for testing
// ----------------------------------------
@@ -447,17 +585,18 @@
model.setVersion( "0.1" );
MavenProject project = new MavenProject( model );
- project.setArtifacts( Collections.EMPTY_SET );
project.setPluginArtifacts( Collections.EMPTY_SET );
project.setReportArtifacts( Collections.EMPTY_SET );
project.setExtensionArtifacts( Collections.EMPTY_SET );
project.setRemoteArtifactRepositories( Collections.EMPTY_LIST );
project.setPluginArtifactRepositories( Collections.EMPTY_LIST );
+
File pomFile = new File( "src/test/resources/pom.xml" );
pomFile.setLastModified( System.currentTimeMillis() - 60000L );
project.setFile( pomFile );
Build build = new Build();
build.setDirectory( "target" );
+ build.setOutputDirectory( "target" );
project.setBuild( build );
project.setName( "archiver test" );
Organization organization = new Organization();
@@ -469,6 +608,89 @@
artifact.setVersion( "0.1" );
artifact.setType( "jar" );
project.setArtifact( artifact );
+
+
+
+ ArtifactHandler artifactHandler = new ArtifactHandler()
+ {
+
+ public String getClassifier()
+ {
+ return null;
+ }
+
+ public String getDirectory()
+ {
+ return null;
+ }
+
+ public String getExtension()
+ {
+ return null;
+ }
+
+ public String getLanguage()
+ {
+ return null;
+ }
+
+ public String getPackaging()
+ {
+ return null;
+ }
+
+ public boolean isAddedToClasspath()
+ {
+ return true;
+ }
+
+ public boolean isIncludesDependencies()
+ {
+ return false;
+ }
+
+ };
+
+
+ Set artifacts = new TreeSet( new ArtifactComparator() );
+
+ MockArtifact artifact1 = new MockArtifact();
+ artifact1.setGroupId( "org.apache.dummy" );
+ artifact1.setArtifactId( "dummy1" );
+ artifact1.setVersion( "1.0" );
+ artifact1.setType( "jar" );
+ artifact1.setScope( "runtime" );
+ artifact1.setFile( new File( "target/test-classes",
artifact1.getArtifactId() + "-" + artifact1.getVersion() + ".jar" ) );
+
+ artifact1.setArtifactHandler( artifactHandler);
+
+ artifacts.add( artifact1 );
+
+
+ MockArtifact artifact2 = new MockArtifact();
+ artifact2.setGroupId( "org.apache.dummy.foo" );
+ artifact2.setArtifactId( "dummy2" );
+ artifact2.setVersion( "1.5" );
+ artifact2.setType( "jar" );
+ artifact2.setScope( "runtime" );
+ artifact2.setFile( new File( "target/test-classes",
artifact2.getArtifactId() + "-" + artifact2.getVersion() + ".jar" ) );
+
+ artifact2.setArtifactHandler( artifactHandler);
+ artifacts.add( artifact2 );
+
+
+ MockArtifact artifact3 = new MockArtifact();
+ artifact3.setGroupId( "org.apache.dummy.bar" );
+ artifact3.setArtifactId( "dummy3" );
+ artifact3.setVersion( "2.0" );
+ artifact3.setScope( "runtime" );
+ artifact3.setType( "jar" );
+ artifact3.setFile( new File( "target/test-classes",
artifact3.getArtifactId() + "-" + artifact3.getVersion() + ".jar" ) );
+ artifact3.setArtifactHandler( artifactHandler);
+ artifacts.add( artifact3 );
+
+ project.setArtifacts( artifacts );
+
return project;
}
}
Modified:
maven/shared/trunk/maven-archiver/src/test/java/org/apache/maven/archiver/MockArtifact.java
URL:
http://svn.apache.org/viewvc/maven/shared/trunk/maven-archiver/src/test/java/org/apache/maven/archiver/MockArtifact.java?rev=605055&r1=605054&r2=605055&view=diff
==============================================================================
---
maven/shared/trunk/maven-archiver/src/test/java/org/apache/maven/archiver/MockArtifact.java
(original)
+++
maven/shared/trunk/maven-archiver/src/test/java/org/apache/maven/archiver/MockArtifact.java
Mon Dec 17 16:29:50 2007
@@ -53,6 +53,8 @@
private String classifier;
private String baseVersion;
+
+ private ArtifactHandler artifactHandler;
public String getGroupId()
{
@@ -181,8 +183,7 @@
public ArtifactHandler getArtifactHandler()
{
- // TODO
- return null; //To change body of implemented methods use File |
Settings | File Templates.
+ return artifactHandler;
}
public List getDependencyTrail()
@@ -241,8 +242,7 @@
public void setArtifactHandler( ArtifactHandler artifactHandler )
{
- // TODO
- //To change body of implemented methods use File | Settings | File
Templates.
+ this.artifactHandler = artifactHandler;
}
public boolean isRelease()
Added: maven/shared/trunk/maven-archiver/src/test/resources/dummy1-1.0.jar
URL:
http://svn.apache.org/viewvc/maven/shared/trunk/maven-archiver/src/test/resources/dummy1-1.0.jar?rev=605055&view=auto
==============================================================================
Binary file - no diff available.
Propchange: maven/shared/trunk/maven-archiver/src/test/resources/dummy1-1.0.jar
------------------------------------------------------------------------------
svn:executable = *
Propchange: maven/shared/trunk/maven-archiver/src/test/resources/dummy1-1.0.jar
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: maven/shared/trunk/maven-archiver/src/test/resources/dummy2-1.5.jar
URL:
http://svn.apache.org/viewvc/maven/shared/trunk/maven-archiver/src/test/resources/dummy2-1.5.jar?rev=605055&view=auto
==============================================================================
Binary file - no diff available.
Propchange: maven/shared/trunk/maven-archiver/src/test/resources/dummy2-1.5.jar
------------------------------------------------------------------------------
svn:executable = *
Propchange: maven/shared/trunk/maven-archiver/src/test/resources/dummy2-1.5.jar
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: maven/shared/trunk/maven-archiver/src/test/resources/dummy3-2.0.jar
URL:
http://svn.apache.org/viewvc/maven/shared/trunk/maven-archiver/src/test/resources/dummy3-2.0.jar?rev=605055&view=auto
==============================================================================
Binary file - no diff available.
Propchange: maven/shared/trunk/maven-archiver/src/test/resources/dummy3-2.0.jar
------------------------------------------------------------------------------
svn:executable = *
Propchange: maven/shared/trunk/maven-archiver/src/test/resources/dummy3-2.0.jar
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream