summaryrefslogtreecommitdiffstats
path: root/branches/sca-equinox
diff options
context:
space:
mode:
authorjsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68>2008-09-13 09:22:32 +0000
committerjsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68>2008-09-13 09:22:32 +0000
commit1195364128f6513c02bded22580fa0e830e587d6 (patch)
tree4f7d7f6fe4e465dde13b17597f92f86a8fa6498d /branches/sca-equinox
parent31ccbc38cdf5d31b728642d324df1f5ec1a3d0e7 (diff)
Fixed maven bundle plugin to generate the correct list of JARs from the dependency tree (including transitive dependencies in addition to direct dependencies). Generated third-party library Manifest with the Manifest symbolic name and version before the lists of imports, exports and classpath entries to make the PDE happy.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@694906 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'branches/sca-equinox')
-rw-r--r--branches/sca-equinox/modules/thirdparty-library/pom.xml59
-rw-r--r--branches/sca-equinox/tools/maven/maven-tuscany-bundle-plugin/src/main/java/org/apache/tuscany/tools/sca/tuscany/bundle/plugin/LibraryBundleMojo.java145
-rw-r--r--branches/sca-equinox/tools/maven/maven-tuscany-bundle-plugin/src/main/java/org/apache/tuscany/tools/sca/tuscany/bundle/plugin/LibraryBundleUtil.java53
3 files changed, 191 insertions, 66 deletions
diff --git a/branches/sca-equinox/modules/thirdparty-library/pom.xml b/branches/sca-equinox/modules/thirdparty-library/pom.xml
index a866958ffa..6e45ad4e89 100644
--- a/branches/sca-equinox/modules/thirdparty-library/pom.xml
+++ b/branches/sca-equinox/modules/thirdparty-library/pom.xml
@@ -27,51 +27,37 @@
</parent>
<artifactId>tuscany-thirdparty-library</artifactId>
<name>Apache Tuscany OSGi Bundle for Third Party Jars</name>
- <properties>
- <maven.test.skip>true</maven.test.skip>
- <tuscany.version>${pom.version}</tuscany.version>
- </properties>
+
<dependencies>
<dependency>
- <groupId>${pom.groupId}</groupId>
- <artifactId>tuscany-core</artifactId>
- <version>${pom.version}</version>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-distribution-all</artifactId>
+ <version>1.4-SNAPSHOT</version>
</dependency>
- <dependency>
- <groupId>${pom.groupId}</groupId>
- <artifactId>tuscany-implementation-java-runtime</artifactId>
- <version>${pom.version}</version>
- </dependency>
- <dependency>
- <groupId>${pom.groupId}</groupId>
- <artifactId>tuscany-node-impl</artifactId>
- <version>${pom.version}</version>
- </dependency>
- <dependency>
- <groupId>${pom.groupId}</groupId>
- <artifactId>tuscany-host-jetty</artifactId>
- <version>${pom.version}</version>
- </dependency>
</dependencies>
+
<build>
<plugins>
- <!--
- <plugin> <artifactId>maven-eclipse-plugin</artifactId> <version>2.5.1</version> <configuration>
- <pde>true</pde> </configuration> </plugin>
- -->
<plugin>
- <artifactId>maven-jar-plugin</artifactId>
- <configuration>
- <archive>
- <manifestFile>${basedir}/META-INF/MANIFEST.MF</manifestFile>
- </archive>
- </configuration>
- </plugin>
+ <artifactId>maven-clean-plugin</artifactId>
+ <configuration>
+ <filesets>
+ <fileset>
+ <directory>${basedir}/lib</directory>
+ <includes>
+ <include>*</include>
+ </includes>
+ <followSymlinks>false</followSymlinks>
+ </fileset>
+ </filesets>
+ </configuration>
+ </plugin>
+
<plugin>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-maven-bundle-plugin</artifactId>
<configuration>
- <copyJars>false</copyJars>
+ <copyJars>true</copyJars>
</configuration>
<executions>
<execution>
@@ -79,10 +65,11 @@
<goals>
<goal>build</goal>
</goals>
- <phase>process-sources</phase>
+ <phase>process-classes</phase>
</execution>
</executions>
</plugin>
+
</plugins>
</build>
-</project> \ No newline at end of file
+</project>
diff --git a/branches/sca-equinox/tools/maven/maven-tuscany-bundle-plugin/src/main/java/org/apache/tuscany/tools/sca/tuscany/bundle/plugin/LibraryBundleMojo.java b/branches/sca-equinox/tools/maven/maven-tuscany-bundle-plugin/src/main/java/org/apache/tuscany/tools/sca/tuscany/bundle/plugin/LibraryBundleMojo.java
index 5fbd3008d2..a1189d91b7 100644
--- a/branches/sca-equinox/tools/maven/maven-tuscany-bundle-plugin/src/main/java/org/apache/tuscany/tools/sca/tuscany/bundle/plugin/LibraryBundleMojo.java
+++ b/branches/sca-equinox/tools/maven/maven-tuscany-bundle-plugin/src/main/java/org/apache/tuscany/tools/sca/tuscany/bundle/plugin/LibraryBundleMojo.java
@@ -18,19 +18,33 @@
*/
package org.apache.tuscany.tools.sca.tuscany.bundle.plugin;
+import static org.apache.tuscany.tools.sca.tuscany.bundle.plugin.LibraryBundleUtil.write;
+
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
-import java.util.ArrayList;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import java.util.jar.Manifest;
import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.factory.ArtifactFactory;
+import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.resolver.ArtifactCollector;
+import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
+import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import org.apache.maven.artifact.resolver.ArtifactResolver;
+import org.apache.maven.artifact.versioning.VersionRange;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.project.MavenProject;
+import org.apache.maven.shared.dependency.tree.DependencyTree;
+import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
+import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
/**
* @version $Rev$ $Date$
@@ -55,7 +69,7 @@ public class LibraryBundleMojo extends AbstractMojo {
* @parameter expression="${basedir}"
* @required @readonly
*/
- protected File basedir;
+ private File basedir;
/**
* Used to look up Artifacts in the remote repository.
@@ -64,7 +78,7 @@ public class LibraryBundleMojo extends AbstractMojo {
* @required
* @readonly
*/
- protected org.apache.maven.artifact.factory.ArtifactFactory factory;
+ private org.apache.maven.artifact.factory.ArtifactFactory factory;
/**
* Used to look up Artifacts in the remote repository.
@@ -73,7 +87,7 @@ public class LibraryBundleMojo extends AbstractMojo {
* @required
* @readonly
*/
- protected org.apache.maven.artifact.resolver.ArtifactResolver resolver;
+ private org.apache.maven.artifact.resolver.ArtifactResolver resolver;
/**
* Location of the local repository.
@@ -82,7 +96,7 @@ public class LibraryBundleMojo extends AbstractMojo {
* @readonly
* @required
*/
- protected org.apache.maven.artifact.repository.ArtifactRepository local;
+ private org.apache.maven.artifact.repository.ArtifactRepository local;
/**
* List of Remote Repositories used by the resolver
@@ -91,42 +105,128 @@ public class LibraryBundleMojo extends AbstractMojo {
* @readonly
* @required
*/
- protected java.util.List remoteRepos;
+ private java.util.List remoteRepos;
/**
* @parameter
*/
- protected boolean copyJars = false;
+ private boolean copyJars = false;
+
+ /**
+ * Dependency tree builder
+ *
+ * @component
+ */
+ private DependencyTreeBuilder dependencyTreeBuilder;
+
+ /**
+ * Artifact factory
+ *
+ * @component
+ */
+ private ArtifactFactory artifactFactory;
+
+ /**
+ * @component
+ */
+ private ArtifactMetadataSource artifactMetadataSource;
+
+ /**
+ * @component
+ */
+ private ArtifactCollector collector;
+
+ /**
+ * The local repository
+ *
+ * @parameter expression="${localRepository}"
+ * @required
+ */
+ private ArtifactRepository localRepository;
+
+ /**
+ * The remote repositories
+ *
+ * @parameter expression="${project.remoteArtifactRepositories}"
+ */
+ private List remoteRepositories;
+
+ /**
+ * Artifact resolver
+ *
+ * @component
+ */
+ private ArtifactResolver artifactResolver;
public void execute() throws MojoExecutionException {
+ Log log = getLog();
+
if (project.getPackaging().equals("pom")) {
return;
}
- Log log = getLog();
- List<File> jarFiles = new ArrayList<File>();
- for (Object o : project.getArtifacts()) {
- Artifact a = (Artifact)o;
- if (!(Artifact.SCOPE_COMPILE.equals(a.getScope()) || Artifact.SCOPE_RUNTIME.equals(a.getScope()))) {
+ DependencyTree dependencyTree;
+ try {
+ dependencyTree = dependencyTreeBuilder.buildDependencyTree(project,
+ localRepository, artifactFactory,
+ artifactMetadataSource, collector );
+
+ } catch (DependencyTreeBuilderException e) {
+ throw new MojoExecutionException("Could not build dependency tree", e);
+ }
+
+ Set<File> jarFiles = new HashSet<File>();
+ for (Object o : dependencyTree.getArtifacts()) {
+ Artifact artifact = (Artifact)o;
+
+ if (!(Artifact.SCOPE_COMPILE.equals(artifact.getScope()) || Artifact.SCOPE_RUNTIME.equals(artifact.getScope()))) {
if (log.isDebugEnabled()) {
- log.debug("Skipping artifact: " + a);
+ log.debug("Skipping artifact: " + artifact);
}
continue;
}
+ if (!"jar".equals(artifact.getType())) {
+ continue;
+ }
+ if ("org.apache.tuscany.sca".equals(artifact.getGroupId())) {
+ continue;
+ }
+
+ VersionRange versionRange = artifact.getVersionRange();
+ if (versionRange == null)
+ versionRange = VersionRange.createFromVersion(artifact.getVersion());
+ Artifact dependencyArtifact = artifactFactory.createDependencyArtifact(artifact.getGroupId(),
+ artifact.getArtifactId(),
+ versionRange,
+ artifact.getType(),
+ artifact.getClassifier(),
+ artifact.getScope());
+
+ try {
+ artifactResolver.resolve(dependencyArtifact, remoteRepositories, localRepository);
+ } catch (ArtifactResolutionException e) {
+ log.warn("Artifact " + artifact + " could not be resolved.");
+ } catch (ArtifactNotFoundException e) {
+ log.warn("Artifact " + artifact + " could not be found.");
+ }
+ artifact = dependencyArtifact;
+
if (log.isDebugEnabled()) {
- log.debug("Artifact: " + a);
+ log.debug("Artifact: " + artifact);
}
String bundleName = null;
try {
- bundleName = LibraryBundleUtil.getBundleName(a.getFile());
+ bundleName = LibraryBundleUtil.getBundleName(artifact.getFile());
} catch (IOException e) {
throw new MojoExecutionException(e.getMessage(), e);
}
if (bundleName == null) {
- if (log.isDebugEnabled()) {
- log.debug("Adding non-OSGi jar: " + a);
+ if (artifact.getFile().exists()) {
+ log.info("Adding third party jar: " + artifact);
+ jarFiles.add(artifact.getFile());
+ } else {
+ log.warn("Third party jar not found: " + artifact);
}
- jarFiles.add(a.getFile());
}
}
@@ -145,7 +245,7 @@ public class LibraryBundleMojo extends AbstractMojo {
}
FileOutputStream fos = new FileOutputStream(file);
- mf.write(fos);
+ write(mf, fos);
fos.close();
if (copyJars) {
@@ -164,11 +264,12 @@ public class LibraryBundleMojo extends AbstractMojo {
}
FileInputStream in = new FileInputStream(jar);
FileOutputStream out = new FileOutputStream(jarFile);
- int len = 0;
- while (len > 0) {
- len = in.read(buf);
+ for (;;) {
+ int len = in.read(buf);
if (len > 0) {
out.write(buf, 0, len);
+ } else {
+ break;
}
}
in.close();
diff --git a/branches/sca-equinox/tools/maven/maven-tuscany-bundle-plugin/src/main/java/org/apache/tuscany/tools/sca/tuscany/bundle/plugin/LibraryBundleUtil.java b/branches/sca-equinox/tools/maven/maven-tuscany-bundle-plugin/src/main/java/org/apache/tuscany/tools/sca/tuscany/bundle/plugin/LibraryBundleUtil.java
index ed4ac63533..39c02bd2b4 100644
--- a/branches/sca-equinox/tools/maven/maven-tuscany-bundle-plugin/src/main/java/org/apache/tuscany/tools/sca/tuscany/bundle/plugin/LibraryBundleUtil.java
+++ b/branches/sca-equinox/tools/maven/maven-tuscany-bundle-plugin/src/main/java/org/apache/tuscany/tools/sca/tuscany/bundle/plugin/LibraryBundleUtil.java
@@ -29,12 +29,13 @@ import static org.osgi.framework.Constants.EXPORT_PACKAGE;
import static org.osgi.framework.Constants.IMPORT_PACKAGE;
import java.io.ByteArrayOutputStream;
+import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
+import java.io.OutputStream;
import java.net.URL;
import java.util.HashSet;
-import java.util.List;
import java.util.Set;
import java.util.jar.Attributes;
import java.util.jar.JarFile;
@@ -99,15 +100,18 @@ public final class LibraryBundleUtil {
&& entryName.length() > 0
&& !entryName.startsWith(".")
&& entryName.endsWith(".class") // Exclude resources from Export-Package
- && entryName.lastIndexOf("/") > 0) {
- String pkg = entryName.substring(0, entryName.lastIndexOf("/")).replace('/', '.') + version;
- packages.add(pkg);
+ && entryName.lastIndexOf("/") > 0
+ && Character.isJavaIdentifierStart(entryName.charAt(0))) {
+ String pkg = entryName.substring(0, entryName.lastIndexOf("/")).replace('/', '.');
+ if (!("org.apache.commons.lang.enum".equals(pkg))) {
+ packages.add(pkg + version);
+ }
}
}
is.close();
}
- static Manifest libraryManifest(List<File> jarFiles, String name, String version, boolean copyJars)
+ static Manifest libraryManifest(Set<File> jarFiles, String name, String version, boolean copyJars)
throws IllegalStateException {
try {
@@ -119,9 +123,9 @@ public final class LibraryBundleUtil {
for (File jarFile : jarFiles) {
addPackages(jarFile, packages);
if (copyJars) {
- classpath.append("\"lib/");
+ classpath.append("lib/");
classpath.append(jarFile.getName());
- classpath.append("\",");
+ classpath.append(",");
} else {
classpath.append("\"external:");
classpath.append(jarFile.getPath().replace(File.separatorChar, '/'));
@@ -154,10 +158,10 @@ public final class LibraryBundleUtil {
attributes.putValue(BUNDLE_SYMBOLICNAME, LAUNCHER_EQUINOX_LIBRARIES);
attributes.putValue(BUNDLE_NAME, name);
attributes.putValue(BUNDLE_VERSION, version);
+ attributes.putValue(DYNAMICIMPORT_PACKAGE, "*");
attributes.putValue(EXPORT_PACKAGE, exports.substring(0, exports.length() - 1));
attributes.putValue(IMPORT_PACKAGE, imports.substring(0, imports.length() - 1));
attributes.putValue(BUNDLE_CLASSPATH, classpath.substring(0, classpath.length() - 1));
- attributes.putValue(DYNAMICIMPORT_PACKAGE, "*");
return manifest;
} catch (IOException e) {
@@ -178,6 +182,39 @@ public final class LibraryBundleUtil {
return bos.toByteArray();
}
+ static void write(Manifest manifest, OutputStream out) throws IOException {
+ DataOutputStream dos = new DataOutputStream(out);
+ Attributes attributes = manifest.getMainAttributes();
+ write(attributes, "Manifest-Version", dos);
+ write(attributes, BUNDLE_MANIFESTVERSION, dos);
+ write(attributes, BUNDLE_SYMBOLICNAME, dos);
+ write(attributes, BUNDLE_NAME, dos);
+ write(attributes, BUNDLE_VERSION, dos);
+ write(attributes, DYNAMICIMPORT_PACKAGE, dos);
+ write(attributes, EXPORT_PACKAGE, dos);
+ write(attributes, IMPORT_PACKAGE, dos);
+ write(attributes, BUNDLE_CLASSPATH, dos);
+ dos.flush();
+ }
+
+ private static void write(Attributes attributes, String key, DataOutputStream dos) throws IOException {
+ StringBuffer line = new StringBuffer();
+ line.append(key);
+ line.append(": ");
+ String value = attributes.getValue(key);
+ line.append(new String(value.getBytes("UTF8")));
+ line.append("\r\n");
+ int l = line.length();
+ if (l > 72) {
+ for (int i = 70; i < l - 2;) {
+ line.insert(i, "\r\n ");
+ i += 72;
+ l += 3;
+ }
+ }
+ dos.writeBytes(line.toString());
+ }
+
/**
* Returns the name of a bundle, or null if the given file is not a bundle.
*