After playing around a bit (the note about importing your exports
helped a ton) I have semi-resolved this by using lots of filtering in
the import and export statements:


<Export-Package>!org.sakaiproject.entitybus.impl.*,!org.sakaiproject.entitybus.util.*,org.sakaiproject.entitybus.*,org.sakaiproject.eb.osgi.util.*,org.apache.commons.logging,org.apache.log4j,</Export-Package>

<Embed-Dependency>*;scope=compile|runtime;inline=false</Embed-Dependency>
                        <Embed-Transitive>true</Embed-Transitive>
                        <!-- logging adds
!org.apache.log,!org.apache.avalon.*,!com.sun.*,!org.w3c.dom, -->

<Import-Package>!org.apache.commons.beanutils.*,!javax.*,!org.xml.*,!org.apache.log,!org.apache.avalon.*,!com.sun.*,!org.w3c.dom,org.apache.commons.logging,org.apache.log4j,*</Import-Package>

I'm not sure if this is correct or not but it seems to at least reduce
the imports down tot he ones I know I need. There is probably a better
option than simply marking these ignored (which is what it ends up
doing). I think optional may be better but I am not sure how to handle
that yet.

I have more questions about logging and servlets but I will put those
in a new thread.
I attached my pom so I hope this helps someone else.
-AZ


On Fri, Apr 10, 2009 at 4:59 PM, Stuart McCulloch <mccu...@gmail.com> wrote:
> 2009/4/10 Aaron Zeckoski <aar...@vt.edu>
>
>> I am having trouble getting my Import-Package down to a reasonable
>> size. It currently pulls in a huge number of things (based on bytecode
>> scanning from what I understand). I think there may be 3 things I am
>> doing wrong here but I cannot seem to find the answers so I am asking
>> here instead. I attached the pom and the generated manifest for
>> reference:
>>
>
> it's very late over here so I'll keep my reply brief - others can fill in
> the details :)
>
> one thing to point out upfront - if your import list is big it's because you
> are either
> exporting a lot of packages (see below) or using a lot of packages from
> 'outside'
>
> so... breaking your code into smaller modules and reducing what you export
> would make it more manageable and make your imports much, much smaller
>
> the plugin is just being upfront, rather than hiding these issues away from
> you
>
> 1) Somehow I am getting duplicates of my exported packages in my
>> imports. I am exporting this stuff (org.sakaiproject.entitybus.*)
>
>
> this is by design:
>
>
> http://felix.apache.org/site/apache-felix-osgi-faq.html#ApacheFelixOSGiFAQ-Shouldabundleimportitsownexportedpackages%3F
>
> http://www.osgi.org/blog/2007/04/importance-of-exporting-nd-importing.html
>
> if you really want to turn this off, look here:
>
>   http://aqute.biz/Code/Bnd#export-package
>
> or manually set your Import-Package (not really advisable)
>
> For Example:
>> Import-Package: javax.crypto,javax.crypto.spec,javax.net,javax.net.ssl
>>  ,javax.xml.parsers,org.apache.avalon.framework.logger,org.apache.comm
>>  ons.beanutils,org.apache.log,org.apache.log4j,org.osgi.framework;vers
>>  ion="1.3",org.osgi.util.tracker;version="1.3",org.sakaiproject.entity
>>  bus,org.sakaiproject.entitybus.access,org.sakaiproject.entitybus.coll
>> ... (snip) ...
>> Embed-Transitive: true
>> Bnd-LastModified: 1239373356766
>> Export-Package: org.sakaiproject.entitybus.entityprovider.annotations,
>>  org.sakaiproject.entitybus.entityprovider.capabilities;uses:="org.sak
>>  aiproject.entitybus.entityprovider.extension,org.sakaiproject.entityb
>>  us.entityprovider,org.sakaiproject.entitybus,org.sakaiproject.entityb
>>  us.entityprovider.search,org.sakaiproject.entitybus.access",org.sakai
>> ... (snip) ...
>>
>> Here is the relelvant section of the pom:
>>                <groupId>org.apache.felix</groupId>
>>                <artifactId>maven-bundle-plugin</artifactId>
>>                <extensions>true</extensions>
>>                <configuration>
>>                    <instructions>
>>
>> <Bundle-Activator>org.sakaiproject.eb.osgi.EBActivator</Bundle-Activator>
>>
>>
>> <Export-Package>!org.sakaiproject.entitybus.impl.*,!org.sakaiproject.entitybus.util.*,org.sakaiproject.entitybus.*</Export-Package>
>>
>> <Embed-Dependency>*;scope=compile|runtime;inline=false</Embed-Dependency>
>>                        <Embed-Transitive>true</Embed-Transitive>
>>                    </instructions>
>>                </configuration>
>>
>> 2) I am getting a bunch of javax.*, org.apache.*, and org.xml.*
>> dependencies in the import of the manifest. Most of these are because
>> I need httputils and the servlet api (which are the only actual
>> dependencies I have that are not my own stuff) but I am not sure why
>> the relelvant stuff is not being included since these are transitive
>> dependencies and I have embed-transitive set to true. I am hoping
>> someone has pulled in the servlet api or commons-httpclient before and
>> knows how to deal with this.
>> (see the attached pom/manifest)
>>
>
> depends what version of the bundleplugin you're using, because until
> version 2.0.0 we weren't processing the dependency graph - but even
> then if your dependencies have optional/provided dependencies then
> these might not appear in the graph due to how the Maven resolver
> works (provided deps are not transitive)
>
>
> http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html
>
> and if they're not in the resolved graph provided by Maven then we
> won't know to embed them - optional dependencies (ie. where a pom
> depends optionally on various different logging impls) is so you can
> decide which logging impl you want to use
>
> if you use 2.0.0 you can do "mvn clean install -X" and you'll get all
> sorts of debug information about what the bundleplugin is doing
>
> also note some packages will come from the JVM runtime via the
> system bundle exports (like javax.* and org.xml.*) this is because
> only java.* packages are automatically exposed from the runtime
> - this is to allow javax.* packages to be replaced as necessary
>
> also do a "jar tvf" on your bundle to see what's being pulled in
> because if you're pulling in everything then it probably includes
> a lot of dependencies to javax packages that may not really be
> required at runtime (again there's no way for the bundleplugin
> to know this because Java doesn't have modularity built in!)
>
> in fact you may not need to embed all this stuff to begin with
> as there may be existing bundles you could install instead...
>
>   http://www.springsource.com/repository/app/
>
> 3) Is there way to correctly handle the servlet stuff? I know about
>> http.service but I don't really want to pack the servlet api into my
>> bundle because that does not work, but removing it causes the bundle
>> to fail so I am guessing I need to somehow fix my dependencies in the
>> pom so that it correctly creates the imports. Using provided seems to
>> correct the build failure issue but then it fails to resolve at
>> runtime so I am stuck.
>>
>
> if you don't pack the servlet api in your bundle then you'll need
> to install a bundle that does provide it - or put the servlet jar on
> the main classpath and either expose it via the system bundle or
> bootdelegation
>
>
>> 4) Is there a reference somewhere that explains how the changes in the
>> dependencies affect the import/export/private values in the manifest?
>> I figured out that excluding packages can keep them from ending up in
>> the import and priivate area but this only works if they are actual
>> transitive dependencies somewhere in the chain. For things which I am
>> not quite sure where they are coming from (like the org.xml.sax one) I
>> don't know how to control it. A RTFM with a link would be totally
>> great here.
>>
>
> the main docs are:
>
>   http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html
>   http://felix.apache.org/site/apache-felix-bundle-plugin-faq.html
>   http://aqute.biz/Code/Bnd
>
> basically, the bundleplugin asks Maven for the resolved dependencies
> (either direct/transitive) and applies the given filter to decided what to
> embed - matching dependencies are embedded using Include-Resource
> instructions (see the Bnd docs), which you can see when you use the
> Maven -X option to turn on debugging
>
> the Bnd tool pulls in the content according to the given instructions and
> creates export/import headers based on what is exported, and what is
> referenced (but not contained) inside the bundle.
>
> actually the underlying logic is rather mundane - it just exposes how
> tangled existing libraries and applications are, which is why you end
> up with large manifests packed with all sorts of exports and imports
>
> HTH - I'm sure others will add more and hopefully check your pom ;)
>
> Thanks for any help
>> -AZ
>>
>> --
>> Aaron Zeckoski (aar...@vt.edu)
>> Senior Research Engineer - CARET - Cambridge University
>> [http://bugs.sakaiproject.org/confluence/display/~aaronz/<http://bugs.sakaiproject.org/confluence/display/%7Eaaronz/>
>> ]
>> Sakai Fellow - [http://aaronz-sakai.blogspot.com/]
>>
>
> --
> Cheers, Stuart
>



-- 
Aaron Zeckoski (aar...@vt.edu)
Senior Research Engineer - CARET - Cambridge University
[http://bugs.sakaiproject.org/confluence/display/~aaronz/]
Sakai Fellow - [http://aaronz-sakai.blogspot.com/]
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd";>
    <modelVersion>4.0.0</modelVersion>
    <name>EntityBroker OSGi Services</name>
    <groupId>org.sakaiproject.osgi.eb</groupId>
    <artifactId>eb-services</artifactId>
    <packaging>bundle</packaging>

    <parent>
        <groupId>org.sakaiproject.osgi</groupId>
        <artifactId>eb</artifactId>
        <version>0.9-SNAPSHOT</version><!--eb-osgi.version-->
    </parent>

    <dependencies>
        <!-- internal deps -->
        <dependency>
            <groupId>org.sakaiproject.entitybus</groupId>
            <artifactId>entitybus-api</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.sakaiproject.entitybus</groupId>
            <artifactId>entitybus-impl</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.sakaiproject.entitybus</groupId>
            <artifactId>entitybus-utils</artifactId>
            <scope>compile</scope>
        </dependency>
        <!-- Common -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <scope>compile</scope>
        </dependency>
        <!-- OSGi -->
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>osgi_R4_core</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>osgi_R4_compendium</artifactId>
            <scope>provided</scope>
        </dependency>
        <!-- logging -->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        <Bundle-Activator>org.sakaiproject.eb.osgi.EBActivator</Bundle-Activator>
                        <Export-Package>!org.sakaiproject.entitybus.impl.*,!org.sakaiproject.entitybus.util.*,org.sakaiproject.entitybus.*,org.sakaiproject.eb.osgi.util.*,org.apache.commons.logging,org.apache.log4j,</Export-Package>
                        <Embed-Dependency>*;scope=compile|runtime;inline=false</Embed-Dependency>
                        <Embed-Transitive>true</Embed-Transitive>
                        <!-- logging adds !org.apache.log,!org.apache.avalon.*,!com.sun.*,!org.w3c.dom, -->
                        <Import-Package>!org.apache.commons.beanutils.*,!javax.*,!org.xml.*,!org.apache.log,!org.apache.avalon.*,!com.sun.*,!org.w3c.dom,org.apache.commons.logging,org.apache.log4j,*</Import-Package>
                    </instructions>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <inherited>true</inherited>
                <configuration>
                    <useFile>false</useFile>
                    <redirectTestOutputToFile>false</redirectTestOutputToFile>
                    <trimStackTrace>false</trimStackTrace>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@felix.apache.org
For additional commands, e-mail: users-h...@felix.apache.org

Reply via email to