Problem trying 
---------------

                 Key: FELIX-1819
                 URL: https://issues.apache.org/jira/browse/FELIX-1819
             Project: Felix
          Issue Type: Bug
          Components: Maven SCR Plugin
    Affects Versions: maven-scr-plugin-1.2.0
            Reporter: Rembert Magri
             Fix For: maven-scr-plugin-1.4.1
         Attachments: JavaClassDescriptorManager.java

When adding dependencies with "provided" scope, the plugin cannot find the 
bundle correctly. I fixed the problem by changing the getManifest and getFile 
methods as follows:

protected Manifest getManifest(Artifact artifact) throws IOException {
        if (!this.isJavaArtifact(artifact)) {
                throw new IllegalArgumentException("Trying to load Manifest 
from a non-Java type");
        }
        
        if ("bundle".equals(artifact.getType())) {
                return getManifestFromBundle(artifact);
        }
        
        return getManifestFromJarFile(artifact);
        
    }

        private Manifest getManifestFromBundle(Artifact artifact)
                        throws FileNotFoundException, IOException {
                //artifact.getFile() returns {project}/target/classes, and I 
want {project}/META-INF/MANIFEST.MF
                File file = getFileFromBundle(artifact, "META-INF/MANIFEST.MF");
                FileInputStream manifestInputStream = null;
                try {
                        manifestInputStream = new FileInputStream(file);
                        return new Manifest(manifestInputStream);
                } finally {
                        if (manifestInputStream != null) {
                                try {
                                        manifestInputStream.close();
                        } catch (IOException ignore) {
                        }
                        }
                }
        }

        private Manifest getManifestFromJarFile(Artifact artifact)
                        throws IOException {
                JarFile file = null;
                try {
                    file = new JarFile(artifact.getFile());
                    return file.getManifest();
                } finally {
                    if (file != null) {
                        try {
                            file.close();
                        } catch (IOException ignore) {
                        }
                    }
                }
        }

    protected File getFile(Artifact artifact, String path) throws IOException {
        if ("bundle".equals(artifact.getType())) {
                return getFileFromBundle(artifact, path);
        }
        
        return getFileFromJar(artifact, path);
    }

        private File getFileFromBundle(Artifact artifact, String path) throws 
FileNotFoundException {
                //artifact.getFile() returns {project}/target/classes, and I 
want {project}/path
                File file = artifact.getFile();
                File targetFile = new 
File(file.getParentFile().getParentFile(),path);
                if (targetFile.canRead()) {
                        return targetFile;
                }
                log.warn("Won't be able to read: " + targetFile);
                return null;
        }

        private File getFileFromJar(Artifact artifact, String path)
                        throws IOException, FileNotFoundException {
                final int pos = path.lastIndexOf('.');
        final String suffix = path.substring(pos + 1);
        JarFile file = null;
        File tmpFile = null;
        try {
            file = new JarFile(artifact.getFile());
            final JarEntry entry = file.getJarEntry(path);
            if ( entry != null ) {
                tmpFile = File.createTempFile("scrjcdm" + 
artifact.getArtifactId(), suffix);
                tmpFile.deleteOnExit();
                final FileOutputStream fos = new FileOutputStream(tmpFile);
                IOUtil.copy(file.getInputStream(entry), fos);
                IOUtil.close(fos);
                return tmpFile;
            }
            return null;
        } finally {
            if (file != null) {
                try {
                    file.close();
                } catch (IOException ignore) {
                }
            }
        }
        }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to