MPECLIPSE-60: Now trying to download java sources archives from the remote repositories.
git-svn-id: https://svn.apache.org/repos/asf/maven/maven-1/plugins/trunk@368890 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
59fb5043e7
commit
6ab7ecb36d
@ -17,9 +17,14 @@
|
|||||||
*/
|
*/
|
||||||
-->
|
-->
|
||||||
<project xmlns:j="jelly:core" xmlns:ant="jelly:ant" xmlns:util="jelly:util" xmlns:define="jelly:define"
|
<project xmlns:j="jelly:core" xmlns:ant="jelly:ant" xmlns:util="jelly:util" xmlns:define="jelly:define"
|
||||||
xmlns:maven="jelly:maven">
|
xmlns:maven="jelly:maven" xmlns:eclipse="eclipse">
|
||||||
|
|
||||||
<define:taglib uri="eclipse">
|
<define:taglib uri="eclipse">
|
||||||
|
<define:jellybean
|
||||||
|
name="download-sources"
|
||||||
|
className="org.apache.maven.eclipse.JavaSourcesDownloader"
|
||||||
|
method="downloadJavaSources"/>
|
||||||
|
|
||||||
<define:tag name="write-classpath-entry">
|
<define:tag name="write-classpath-entry">
|
||||||
<maven:param-check value="${groupId}" fail="true" message="'groupId' must be specified" />
|
<maven:param-check value="${groupId}" fail="true" message="'groupId' must be specified" />
|
||||||
<maven:param-check value="${artifactId}" fail="true" message="'artifactId' must be specified" />
|
<maven:param-check value="${artifactId}" fail="true" message="'artifactId' must be specified" />
|
||||||
@ -30,6 +35,17 @@
|
|||||||
<j:if test='${relativePathCheck == "X"}'>
|
<j:if test='${relativePathCheck == "X"}'>
|
||||||
<j:set var="relativePath" value="${groupId}/jars/${artifactId}-${version}.jar" />
|
<j:set var="relativePath" value="${groupId}/jars/${artifactId}-${version}.jar" />
|
||||||
</j:if>
|
</j:if>
|
||||||
|
|
||||||
|
<!-- download the source from the remote repository if necessary -->
|
||||||
|
<j:if test="${maven.eclipse.src.download}">
|
||||||
|
<eclipse:download-sources
|
||||||
|
project="${pom}"
|
||||||
|
groupId="${groupId}"
|
||||||
|
artifactId="${artifactId}"
|
||||||
|
version="${version}"
|
||||||
|
/>
|
||||||
|
</j:if>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
should be (m1 repo layout):
|
should be (m1 repo layout):
|
||||||
${groupId}/java-sources/${artifactId}-${version}-sources.jar
|
${groupId}/java-sources/${artifactId}-${version}-sources.jar
|
||||||
|
|||||||
@ -26,5 +26,6 @@
|
|||||||
maven.eclipse.goals = plugins
|
maven.eclipse.goals = plugins
|
||||||
maven.gen.src=${maven.build.dir}/generated-sources
|
maven.gen.src=${maven.build.dir}/generated-sources
|
||||||
maven.eclipse.src.extension = zip
|
maven.eclipse.src.extension = zip
|
||||||
|
maven.eclipse.src.download = true
|
||||||
maven.eclipse.resources.addtoclasspath=false
|
maven.eclipse.resources.addtoclasspath=false
|
||||||
maven.eclipse.servletapilist=javax.servlet:servlet-api,servletapi:servletapi,geronimo-spec:geronimo-spec-servlet
|
maven.eclipse.servletapilist=javax.servlet:servlet-api,servletapi:servletapi,geronimo-spec:geronimo-spec-servlet
|
||||||
@ -116,5 +116,47 @@
|
|||||||
</roles>
|
</roles>
|
||||||
<timezone>+1</timezone>
|
<timezone>+1</timezone>
|
||||||
</developer>
|
</developer>
|
||||||
|
<developer>
|
||||||
|
<name>Stephane Nicoll</name>
|
||||||
|
<id>snicoll</id>
|
||||||
|
<email>snicoll@apache.org</email>
|
||||||
|
<organization>ASF</organization>
|
||||||
|
<roles>
|
||||||
|
<role>Java Developer</role>
|
||||||
|
</roles>
|
||||||
|
<timezone>+1</timezone>
|
||||||
|
</developer>
|
||||||
</developers>
|
</developers>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>maven</groupId>
|
||||||
|
<artifactId>maven</artifactId>
|
||||||
|
<version>1.0.2</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-logging</groupId>
|
||||||
|
<artifactId>commons-logging</artifactId>
|
||||||
|
<version>1.0.4</version>
|
||||||
|
<properties>
|
||||||
|
<comment>This library is already loaded by maven's core. Be careful to use the same version number as in the core.</comment>
|
||||||
|
</properties>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-lang</groupId>
|
||||||
|
<artifactId>commons-lang</artifactId>
|
||||||
|
<version>2.0</version>
|
||||||
|
<type>jar</type>
|
||||||
|
<properties>
|
||||||
|
<comment>This library is already loaded by maven's core. Be careful to use the same version number as in the core.</comment>
|
||||||
|
</properties>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-jelly</groupId>
|
||||||
|
<artifactId>commons-jelly</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
<properties>
|
||||||
|
<comment>This library is already loaded by maven's core. Be careful to use the same version number as in the core.</comment>
|
||||||
|
</properties>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
279
eclipse/src/main/org/maven/eclipse/JavaSourcesDownloader.java
Normal file
279
eclipse/src/main/org/maven/eclipse/JavaSourcesDownloader.java
Normal file
@ -0,0 +1,279 @@
|
|||||||
|
package org.apache.maven.eclipse;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
import org.apache.maven.AbstractMavenComponent;
|
||||||
|
import org.apache.maven.MavenConstants;
|
||||||
|
import org.apache.maven.project.Dependency;
|
||||||
|
import org.apache.maven.project.Project;
|
||||||
|
import org.apache.maven.util.HttpUtils;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
/* ====================================================================
|
||||||
|
* Copyright 2001-2004 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.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An helper class used to download java sources archives.
|
||||||
|
*
|
||||||
|
* @author <a href="snicoll@apache.org">Stephane Nicoll</a>
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class JavaSourcesDownloader
|
||||||
|
extends AbstractMavenComponent
|
||||||
|
{
|
||||||
|
private static final Log log = LogFactory.getLog( JavaSourcesDownloader.class );
|
||||||
|
|
||||||
|
private Project project;
|
||||||
|
|
||||||
|
private String groupId;
|
||||||
|
|
||||||
|
private String artifactId;
|
||||||
|
|
||||||
|
private String version;
|
||||||
|
|
||||||
|
|
||||||
|
public void downloadJavaSources()
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
if (project == null) {
|
||||||
|
throw new NullPointerException("project should be set.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (groupId == null) {
|
||||||
|
throw new NullPointerException("groupId should be set.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (artifactId == null) {
|
||||||
|
throw new NullPointerException("artifactId should be set.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (version == null) {
|
||||||
|
throw new NullPointerException("version should be set.");
|
||||||
|
}
|
||||||
|
|
||||||
|
final String dependencyId = groupId + ":" + artifactId;
|
||||||
|
Dependency dependency = project.getDependency( dependencyId );
|
||||||
|
if ( dependency == null )
|
||||||
|
{
|
||||||
|
log.warn("Could not retrieve dependency object for[" + dependencyId + "] - skipping" );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String relativePath = buildRelativePath();
|
||||||
|
File localFile = new File( project.getContext().getMavenRepoLocal(), relativePath );
|
||||||
|
if ( isSnapshot() )
|
||||||
|
{
|
||||||
|
getRemoteArtifact( localFile, relativePath, dependency );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( localFile.exists() )
|
||||||
|
{
|
||||||
|
log.debug( "source for[" + groupId + ":" + artifactId + ":" + version +
|
||||||
|
"] is available in the local repository." );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// download it
|
||||||
|
getRemoteArtifact( localFile, relativePath, dependency );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String buildRelativePath()
|
||||||
|
{
|
||||||
|
StringBuffer sb = new StringBuffer();
|
||||||
|
sb.append( groupId ).append( "/java-sources/" ).append( artifactId ).append( "-" ).append( version ).append(
|
||||||
|
"-sources.jar" );
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isSnapshot()
|
||||||
|
{
|
||||||
|
return version.endsWith( "SNAPSHOT" );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Getters & Setters
|
||||||
|
|
||||||
|
|
||||||
|
public Project getProject()
|
||||||
|
{
|
||||||
|
return project;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProject( final Project project )
|
||||||
|
{
|
||||||
|
this.project = project;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getGroupId()
|
||||||
|
{
|
||||||
|
return groupId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGroupId( final String groupId )
|
||||||
|
{
|
||||||
|
this.groupId = groupId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getArtifactId()
|
||||||
|
{
|
||||||
|
return artifactId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setArtifactId( final String artifactId )
|
||||||
|
{
|
||||||
|
this.artifactId = artifactId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getVersion()
|
||||||
|
{
|
||||||
|
return version;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVersion( final String version )
|
||||||
|
{
|
||||||
|
this.version = version;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Taken from maven core code in order to mimic the current behavior
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve a <code>remoteFile</code> from the maven remote repositories
|
||||||
|
* and store it at <code>destinationFile</code>
|
||||||
|
*
|
||||||
|
* @param destinationFile the destination file in the local repository
|
||||||
|
* @param relativePath the relative path to the dependency
|
||||||
|
* @return true if the retrieval succeeds, false otherwise.
|
||||||
|
*/
|
||||||
|
private boolean getRemoteArtifact( File destinationFile, String relativePath, Dependency relatedDependency )
|
||||||
|
{
|
||||||
|
|
||||||
|
// The directory structure for the project this dependency belongs to
|
||||||
|
// may not exists so attempt to create the project directory structure
|
||||||
|
// before attempting to download the dependency.
|
||||||
|
File directory = destinationFile.getParentFile();
|
||||||
|
|
||||||
|
if ( !directory.exists() )
|
||||||
|
{
|
||||||
|
directory.mkdirs();
|
||||||
|
}
|
||||||
|
|
||||||
|
log.info( "Attempting to download sources for " + relatedDependency.getArtifact());
|
||||||
|
|
||||||
|
boolean artifactFound = false;
|
||||||
|
|
||||||
|
for ( Iterator i = getProject().getContext().getMavenRepoRemote().iterator(); i.hasNext(); )
|
||||||
|
{
|
||||||
|
String remoteRepo = (String) i.next();
|
||||||
|
|
||||||
|
if ( remoteRepo.endsWith( "/" ) )
|
||||||
|
{
|
||||||
|
remoteRepo = remoteRepo.substring( 0, remoteRepo.length() - 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
// The username and password parameters are not being
|
||||||
|
// used here. Those are the "" parameters you see below.
|
||||||
|
String url = remoteRepo + "/" + relativePath;
|
||||||
|
url = StringUtils.replace( url, "//", "/" );
|
||||||
|
|
||||||
|
if ( !url.startsWith( "file" ) )
|
||||||
|
{
|
||||||
|
if ( url.startsWith( "https" ) )
|
||||||
|
{
|
||||||
|
url = StringUtils.replace( url, "https:/", "https://" );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
url = StringUtils.replace( url, "http:/", "http://" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log.debug("Trying to download source at " + url);
|
||||||
|
|
||||||
|
// Attempt to retrieve the artifact and set the checksum if retrieval
|
||||||
|
// of the checksum file was successful.
|
||||||
|
try
|
||||||
|
{
|
||||||
|
String loginHost = (String) getProject().getContext().getVariable( MavenConstants.PROXY_LOGINHOST );
|
||||||
|
String loginDomain = (String) getProject().getContext().getVariable( MavenConstants.PROXY_LOGINDOMAIN );
|
||||||
|
String meterType = (String) getProject().getContext().getVariable( MavenConstants.DOWNLOAD_METER );
|
||||||
|
if ( meterType != null )
|
||||||
|
{
|
||||||
|
HttpUtils.setMeterType( meterType );
|
||||||
|
}
|
||||||
|
HttpUtils.getFile( url, destinationFile, false, true, getProject().getContext().getProxyHost(),
|
||||||
|
getProject().getContext().getProxyPort(),
|
||||||
|
getProject().getContext().getProxyUserName(),
|
||||||
|
getProject().getContext().getProxyPassword(), loginHost, loginDomain, true );
|
||||||
|
|
||||||
|
// Artifact was found, continue checking additional remote repos (if any)
|
||||||
|
// in case there is a newer version (i.e. snapshots) in another repo
|
||||||
|
artifactFound = true;
|
||||||
|
|
||||||
|
if ( !isSnapshot() )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch ( FileNotFoundException e )
|
||||||
|
{
|
||||||
|
// Multiple repositories may exist, and if the file is not found
|
||||||
|
// in just one of them, it's no problem, and we don't want to
|
||||||
|
// even print out an error.
|
||||||
|
// if it's not found at all, artifactFound will be false, and the
|
||||||
|
// build _will_ break, and the user will get an error message
|
||||||
|
log.debug( "File not found on one of the repos", e );
|
||||||
|
}
|
||||||
|
catch ( Exception e )
|
||||||
|
{
|
||||||
|
// If there are additional remote repos, then ignore exception
|
||||||
|
// as artifact may be found in another remote repo. If there
|
||||||
|
// are no more remote repos to check and the artifact wasn't found in
|
||||||
|
// a previous remote repo, then artifactFound is false indicating
|
||||||
|
// that the artifact could not be found in any of the remote repos
|
||||||
|
//
|
||||||
|
// arguably, we need to give the user better control (another command-
|
||||||
|
// line switch perhaps) of what to do in this case? Maven already has
|
||||||
|
// a command-line switch to work in offline mode, but what about when
|
||||||
|
// one of two or more remote repos is unavailable? There may be multiple
|
||||||
|
// remote repos for redundancy, in which case you probably want the build
|
||||||
|
// to continue. There may however be multiple remote repos because some
|
||||||
|
// artifacts are on one, and some are on another. In this case, you may
|
||||||
|
// want the build to break.
|
||||||
|
//
|
||||||
|
// print a warning, in any case, so user catches on to mistyped
|
||||||
|
// hostnames, or other snafus
|
||||||
|
// FIXME: localize this message
|
||||||
|
String[] parsedUrl = HttpUtils.parseUrl( url );
|
||||||
|
log.warn( "Error retrieving artifact from [" + parsedUrl[2] + "]: " + e );
|
||||||
|
if ( parsedUrl[0] != null )
|
||||||
|
{
|
||||||
|
log.debug( "Username was '" + parsedUrl[0] + "', password hidden" );
|
||||||
|
}
|
||||||
|
log.debug( "Error details", e );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return artifactFound;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -23,6 +23,9 @@
|
|||||||
<author email="dion@multitask.com.au">dIon Gillard</author>
|
<author email="dion@multitask.com.au">dIon Gillard</author>
|
||||||
</properties>
|
</properties>
|
||||||
<body>
|
<body>
|
||||||
|
<release version="1.11" date="in SVN">
|
||||||
|
<action dev="snicoll" type="add" issue="MPECLIPSE-60">Now trying to download java sources archives from the remote repositories.</action>
|
||||||
|
</release>
|
||||||
<release version="1.10" date="2005-12-03">
|
<release version="1.10" date="2005-12-03">
|
||||||
<action dev="carlos" type="fix">Moved test classpath before main so test classpath resources override main ones</action>
|
<action dev="carlos" type="fix">Moved test classpath before main so test classpath resources override main ones</action>
|
||||||
<action dev="epugh" type="fix" issue="MPECLIPSE-68">eclipse:add-maven-repo doesn't update correct Eclipse property file for Eclipse 3.x</action>
|
<action dev="epugh" type="fix" issue="MPECLIPSE-68">eclipse:add-maven-repo doesn't update correct Eclipse property file for Eclipse 3.x</action>
|
||||||
|
|||||||
@ -75,14 +75,15 @@
|
|||||||
with debugging.
|
with debugging.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
The plugin will check if the file located at <code>MAVEN_REPO${groupId}/java-sources/${artifactId}-${version}-sources.jar</code>
|
The plugin is able to download sources archive at <code>${groupId}/java-sources/${artifactId}-${version}-sources.jar</code>
|
||||||
exists and will add it as a source attachment.
|
from the repository. This behavior can be disabled by configuring the <code>maven.eclipse.src.download</code> property.
|
||||||
As an example, the source archive for the dependency <code>MAVEN_REPO/eclipse/<em>jars</em>/eclipse-ui-3.0.0<em>.jar</em></code>
|
As an example, the source archive for the dependency <code>MAVEN_REPO/eclipse/<em>jars</em>/eclipse-ui-3.0.0<em>.jar</em></code>
|
||||||
will be mapped to <code>MAVEN_REPO/eclipse/<em>java-sources</em>/eclipse-ui-3.0.0<em>-sources.jar</em></code>
|
will be mapped to <code>MAVEN_REPO/eclipse/<em>java-sources</em>/eclipse-ui-3.0.0<em>-sources.jar</em></code>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
For backward compatibility the plugin still accepts source archives located at
|
For backward compatibility the plugin still accepts source archives located at
|
||||||
<code>MAVEN_REPO/${groupId}/src/${artifactId}-${version}.${maven.eclipse.src.extension}</code>.
|
<code>MAVEN_REPO/${groupId}/src/${artifactId}-${version}.${maven.eclipse.src.extension}</code> but it won't
|
||||||
|
download them from the repository.
|
||||||
</p>
|
</p>
|
||||||
</subsection>
|
</subsection>
|
||||||
<subsection name="Generated Source Code">
|
<subsection name="Generated Source Code">
|
||||||
|
|||||||
@ -135,6 +135,14 @@
|
|||||||
<code>MAVEN_REPO${groupId}/java-sources/${artifactId}-${version}-sources.jar</code>
|
<code>MAVEN_REPO${groupId}/java-sources/${artifactId}-${version}-sources.jar</code>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>maven.eclipse.src.downlad</td>
|
||||||
|
<td>Yes (default=<code>true</code>)</td>
|
||||||
|
<td>
|
||||||
|
Specify if java sources archives need to be downloaded from the configured
|
||||||
|
remote repositories. Defaults to true.
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<p>
|
<p>
|
||||||
Note that you will need to defined a <code>MAVEN_REPO</code> Java
|
Note that you will need to defined a <code>MAVEN_REPO</code> Java
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user