You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@felix.apache.org by David Leangen <os...@leangen.net> on 2009/04/29 08:02:45 UTC
Resolution of embedded dependencies during compilation
Hi,
I just updated to maven-bundle-plugin 2.0.0. It appears that there
have been a few changes to the way things compile, and I'm just
discovering many interesting things in my own projects. This is of
course a good thing, as it's bringing out many erroneous
interpretations I made earlier.
Anyway, here's my current issue.
In project A, I have an embedded jar that I want to export. POM and
bnd file below.
In project B, I want to use the embedded package, but I only want to
depend on the containing bundle, not the embedded bundle. Since the
containing bundle exports this, my assumption is that this should be
possible.
However, the embedded jar in project A is only contained in the final
installed jar, not in the target/classes directory. The problem is
that maven wants to read from the target/classes directory rather than
from the installed jar, so it can't find the embedded packages.
Any ideas?
Here's the essential of project A:
<dependencies>
<dependency>
<groupId>org.junit</groupId>
<artifactId>com.springsource.org.junit</artifactId>
</dependency>
<dependency>
<groupId>net.jcip</groupId>
<artifactId>com.springsource.net.jcip.annotations</artifactId>
<version>1.0.0</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
</dependencies>
and the bnd file:
Export-Package: ${bundle.namespace}.*;version="${pom.version}"
Embed-Dependency:
com.springsource.net.jcip.annotations;groupId=net.jcip;inline=false
Bundle-RequiredExecutionEnvironment: J2SE-1.5
-exportcontents: net.jcip.*;version="1.0"
And here's the POM from project B:
<dependencies>
...
<dependency>
<groupId>net.leangen.expedition.util</groupId>
<artifactId>expedition_object_api</artifactId>
<scope>provided</scope>
</dependency>
...
</dependencies>
The output from Maven looks like this:
[DEBUG] Classpath: [/Users/dleangen/bioscene/dev/trunk/domains/lsd/
model/impl/target/classes
/Users/dleangen/.m2/repository/org/osgi/org.osgi.core/4.1.0/
org.osgi.core-4.1.0.jar
/Users/dleangen/bioscene/dev/trunk/domains/lsd/model/si/target/classes
/Users/dleangen/bioscene/dev/trunk/platform/util/object/api/target/
classes
/Users/dleangen/.m2/repository/org/ops4j/pax/logging/pax-logging-api/
1.3.0/pax-logging-api-1.3.0.jar
/Users/dleangen/.m2/repository/org/osgi/org.osgi.compendium/4.1.0/
org.osgi.compendium-4.1.0.jar]
[DEBUG] Output directory: /Users/dleangen/bioscene/dev/trunk/domains/
lsd/model/impl/target/classes
So, in some cases it uses the jar file from the local cache, but in
others, the output in the target/classes dir.
Thanks!
=David
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@felix.apache.org
For additional commands, e-mail: users-help@felix.apache.org
Re: Resolution of embedded dependencies during compilation
Posted by David Leangen <os...@leangen.net>.
Once again, many thanks!
>> I'll try inlining to see what happens...
That worked, and is sufficient for now.
> ( FYI, this is also another thing the maven-pax-plugin lifecycle
> helps out
> with, as it modifies
> the compilation phase to support compilation against embedded jars -
> however, this does
> sometimes make bundle compilation slower )
Ahhh, that's what you were getting at in your last message. Guess that
went over my head, but now I think I get it.
I'll keep this in mind if there comes a time I don't want to inline
embedded packages.
Thanks again!
=David
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@felix.apache.org
For additional commands, e-mail: users-help@felix.apache.org
Re: Resolution of embedded dependencies during compilation
Posted by Stuart McCulloch <mc...@gmail.com>.
2009/4/29 David Leangen <os...@leangen.net>
>
> Stuart,
>
> As always, your reply is very quick, timely, and extremely informative.
> Thanks!
>
> I updated to maven 2.1.0, and this indeed _appears_ to fix the classpath
> problem:
>
> [DEBUG] Classpath:
> [/Users/dleangen/bioscene/dev/trunk/domains/lsd/model/impl/target/classes
>
> /Users/dleangen/.m2/repository/net/leangen/expedition/util/expedition_object_api/0.1.1-SNAPSHOT/expedition_object_api-0.1.1-SNAPSHOT.jar
>
> /Users/dleangen/.m2/repository/com/bioscene/lsd/lsd-model-si/0.1.1-SNAPSHOT/lsd-model-si-0.1.1-SNAPSHOT.jar
>
> /Users/dleangen/.m2/repository/org/osgi/org.osgi.core/4.1.0/org.osgi.core-4.1.0.jar
>
> /Users/dleangen/.m2/repository/org/osgi/org.osgi.compendium/4.1.0/org.osgi.compendium-4.1.0.jar
>
> /Users/dleangen/.m2/repository/org/ops4j/pax/logging/pax-logging-api/1.3.0/pax-logging-api-1.3.0.jar]
>
> So, now rather than using the output from target/classes, it is using the
> installed jar file. Great!
>
> However, I'm still getting this:
>
> /Users/dleangen/bioscene/dev/trunk/domains/lsd/model/impl/src/main/java/com/bioscene/lsd/model/impl/TranslationImpl.java:[3,28]
> package net.jcip.annotations does not exist
>
>
> /Users/dleangen/bioscene/dev/trunk/domains/lsd/model/impl/src/main/java/com/bioscene/lsd/model/impl/TranslationImpl.java:[7,1]
> cannot find symbol
> symbol: class Immutable
> @Immutable
>
> I'll try inlining to see what happens...
>
Remember that javac can't handle embedded jars, so you will need to inline
dependencies
if you want to be able to compile against the bundle. The alternative is of
course to compile
against the original (non-OSGi) dependencies, as the bundle is more of a
runtime artifact...
( FYI, this is also another thing the maven-pax-plugin lifecycle helps out
with, as it modifies
the compilation phase to support compilation against embedded jars -
however, this does
sometimes make bundle compilation slower )
=David
>
> On Apr 29, 2009, at 3:11 PM, Stuart McCulloch wrote:
>
> 2009/4/29 David Leangen <os...@leangen.net>
>>
>>
>>> Hi,
>>>
>>> I just updated to maven-bundle-plugin 2.0.0. It appears that there have
>>> been a few changes to the way things compile, and I'm just discovering
>>> many
>>> interesting things in my own projects. This is of course a good thing, as
>>> it's bringing out many erroneous interpretations I made earlier.
>>>
>>>
>>> Anyway, here's my current issue.
>>>
>>> In project A, I have an embedded jar that I want to export. POM and bnd
>>> file below.
>>>
>>> In project B, I want to use the embedded package, but I only want to
>>> depend
>>> on the containing bundle, not the embedded bundle. Since the containing
>>> bundle exports this, my assumption is that this should be possible.
>>>
>>> However, the embedded jar in project A is only contained in the final
>>> installed jar, not in the target/classes directory. The problem is that
>>> maven wants to read from the target/classes directory rather than from
>>> the
>>> installed jar, so it can't find the embedded packages.
>>>
>>>
>>> Any ideas?
>>>
>>>
>>> Here's the essential of project A:
>>>
>>> <dependencies>
>>> <dependency>
>>> <groupId>org.junit</groupId>
>>> <artifactId>com.springsource.org.junit</artifactId>
>>> </dependency>
>>> <dependency>
>>> <groupId>net.jcip</groupId>
>>> <artifactId>com.springsource.net.jcip.annotations</artifactId>
>>> <version>1.0.0</version>
>>> <scope>compile</scope>
>>> <optional>true</optional>
>>> </dependency>
>>> </dependencies>
>>>
>>> and the bnd file:
>>>
>>> Export-Package: ${bundle.namespace}.*;version="${pom.version}"
>>>
>>> Embed-Dependency:
>>> com.springsource.net.jcip.annotations;groupId=net.jcip;inline=false
>>>
>>> Bundle-RequiredExecutionEnvironment: J2SE-1.5
>>>
>>> -exportcontents: net.jcip.*;version="1.0"
>>>
>>>
>>>
>>> And here's the POM from project B:
>>>
>>> <dependencies>
>>> ...
>>> <dependency>
>>> <groupId>net.leangen.expedition.util</groupId>
>>> <artifactId>expedition_object_api</artifactId>
>>> <scope>provided</scope>
>>> </dependency>
>>> ...
>>> </dependencies>
>>>
>>>
>>> The output from Maven looks like this:
>>>
>>> [DEBUG] Classpath:
>>> [/Users/dleangen/bioscene/dev/trunk/domains/lsd/model/impl/target/classes
>>>
>>>
>>> /Users/dleangen/.m2/repository/org/osgi/org.osgi.core/4.1.0/org.osgi.core-4.1.0.jar
>>> /Users/dleangen/bioscene/dev/trunk/domains/lsd/model/si/target/classes
>>>
>>> /Users/dleangen/bioscene/dev/trunk/platform/util/object/api/target/classes
>>>
>>>
>>> /Users/dleangen/.m2/repository/org/ops4j/pax/logging/pax-logging-api/1.3.0/pax-logging-api-1.3.0.jar
>>>
>>>
>>> /Users/dleangen/.m2/repository/org/osgi/org.osgi.compendium/4.1.0/org.osgi.compendium-4.1.0.jar]
>>> [DEBUG] Output directory:
>>> /Users/dleangen/bioscene/dev/trunk/domains/lsd/model/impl/target/classes
>>>
>>> So, in some cases it uses the jar file from the local cache, but in
>>> others,
>>> the output in the target/classes dir.
>>>
>>>
>> this is a core Maven issue, specifically code in MavenProject.java:
>>
>> http://jira.codehaus.org/browse/MNG-2720
>>
>> apparently it's fixed in Maven 2.1.0 so you might want to try that
>>
>> BTW, you might not have noticed this before if you're using Pax-Construct
>> generated
>> projects because the maven-pax-plugin does some unpacking to make sure
>> that
>> the
>> compilation classpath has the additional classes from the embedded
>> dependencies
>> (but this is only if you have <extensions>true</extensions for the
>> paxplugin
>> and not
>> set for the bundleplugin, otherwise Maven will use the bundleplugin
>> lifecycle)
>>
>> you can get the same effect by unpacking the final bundle into
>> "target/classes" after
>> the packaging step (either by using the maven-ant-plugin or the
>> maven-exec-plugin)
>>
>> so I'd give Maven 2.1.0 a whirl and report back if that fixes your problem
>>
>> Thanks!
>>
>>> =David
>>>
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscribe@felix.apache.org
>>> For additional commands, e-mail: users-help@felix.apache.org
>>>
>>>
>> --
>> Cheers, Stuart
>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@felix.apache.org
> For additional commands, e-mail: users-help@felix.apache.org
>
>
--
Cheers, Stuart
Re: Resolution of embedded dependencies during compilation
Posted by David Leangen <os...@leangen.net>.
Stuart,
As always, your reply is very quick, timely, and extremely
informative. Thanks!
I updated to maven 2.1.0, and this indeed _appears_ to fix the
classpath problem:
[DEBUG] Classpath: [/Users/dleangen/bioscene/dev/trunk/domains/lsd/
model/impl/target/classes
/Users/dleangen/.m2/repository/net/leangen/expedition/util/
expedition_object_api/0.1.1-SNAPSHOT/expedition_object_api-0.1.1-
SNAPSHOT.jar
/Users/dleangen/.m2/repository/com/bioscene/lsd/lsd-model-si/0.1.1-
SNAPSHOT/lsd-model-si-0.1.1-SNAPSHOT.jar
/Users/dleangen/.m2/repository/org/osgi/org.osgi.core/4.1.0/
org.osgi.core-4.1.0.jar
/Users/dleangen/.m2/repository/org/osgi/org.osgi.compendium/4.1.0/
org.osgi.compendium-4.1.0.jar
/Users/dleangen/.m2/repository/org/ops4j/pax/logging/pax-logging-api/
1.3.0/pax-logging-api-1.3.0.jar]
So, now rather than using the output from target/classes, it is using
the installed jar file. Great!
However, I'm still getting this:
/Users/dleangen/bioscene/dev/trunk/domains/lsd/model/impl/src/main/
java/com/bioscene/lsd/model/impl/TranslationImpl.java:[3,28] package
net.jcip.annotations does not exist
/Users/dleangen/bioscene/dev/trunk/domains/lsd/model/impl/src/main/
java/com/bioscene/lsd/model/impl/TranslationImpl.java:[7,1] cannot
find symbol
symbol: class Immutable
@Immutable
I'll try inlining to see what happens...
=David
On Apr 29, 2009, at 3:11 PM, Stuart McCulloch wrote:
> 2009/4/29 David Leangen <os...@leangen.net>
>
>>
>> Hi,
>>
>> I just updated to maven-bundle-plugin 2.0.0. It appears that there
>> have
>> been a few changes to the way things compile, and I'm just
>> discovering many
>> interesting things in my own projects. This is of course a good
>> thing, as
>> it's bringing out many erroneous interpretations I made earlier.
>>
>>
>> Anyway, here's my current issue.
>>
>> In project A, I have an embedded jar that I want to export. POM and
>> bnd
>> file below.
>>
>> In project B, I want to use the embedded package, but I only want
>> to depend
>> on the containing bundle, not the embedded bundle. Since the
>> containing
>> bundle exports this, my assumption is that this should be possible.
>>
>> However, the embedded jar in project A is only contained in the final
>> installed jar, not in the target/classes directory. The problem is
>> that
>> maven wants to read from the target/classes directory rather than
>> from the
>> installed jar, so it can't find the embedded packages.
>>
>>
>> Any ideas?
>>
>>
>> Here's the essential of project A:
>>
>> <dependencies>
>> <dependency>
>> <groupId>org.junit</groupId>
>> <artifactId>com.springsource.org.junit</artifactId>
>> </dependency>
>> <dependency>
>> <groupId>net.jcip</groupId>
>> <artifactId>com.springsource.net.jcip.annotations</artifactId>
>> <version>1.0.0</version>
>> <scope>compile</scope>
>> <optional>true</optional>
>> </dependency>
>> </dependencies>
>>
>> and the bnd file:
>>
>> Export-Package: ${bundle.namespace}.*;version="${pom.version}"
>>
>> Embed-Dependency:
>> com.springsource.net.jcip.annotations;groupId=net.jcip;inline=false
>>
>> Bundle-RequiredExecutionEnvironment: J2SE-1.5
>>
>> -exportcontents: net.jcip.*;version="1.0"
>>
>>
>>
>> And here's the POM from project B:
>>
>> <dependencies>
>> ...
>> <dependency>
>> <groupId>net.leangen.expedition.util</groupId>
>> <artifactId>expedition_object_api</artifactId>
>> <scope>provided</scope>
>> </dependency>
>> ...
>> </dependencies>
>>
>>
>> The output from Maven looks like this:
>>
>> [DEBUG] Classpath:
>> [/Users/dleangen/bioscene/dev/trunk/domains/lsd/model/impl/target/
>> classes
>>
>> /Users/dleangen/.m2/repository/org/osgi/org.osgi.core/4.1.0/
>> org.osgi.core-4.1.0.jar
>> /Users/dleangen/bioscene/dev/trunk/domains/lsd/model/si/target/
>> classes
>> /Users/dleangen/bioscene/dev/trunk/platform/util/object/api/target/
>> classes
>>
>> /Users/dleangen/.m2/repository/org/ops4j/pax/logging/pax-logging-
>> api/1.3.0/pax-logging-api-1.3.0.jar
>>
>> /Users/dleangen/.m2/repository/org/osgi/org.osgi.compendium/4.1.0/
>> org.osgi.compendium-4.1.0.jar]
>> [DEBUG] Output directory:
>> /Users/dleangen/bioscene/dev/trunk/domains/lsd/model/impl/target/
>> classes
>>
>> So, in some cases it uses the jar file from the local cache, but in
>> others,
>> the output in the target/classes dir.
>>
>
> this is a core Maven issue, specifically code in MavenProject.java:
>
> http://jira.codehaus.org/browse/MNG-2720
>
> apparently it's fixed in Maven 2.1.0 so you might want to try that
>
> BTW, you might not have noticed this before if you're using Pax-
> Construct
> generated
> projects because the maven-pax-plugin does some unpacking to make
> sure that
> the
> compilation classpath has the additional classes from the embedded
> dependencies
> (but this is only if you have <extensions>true</extensions for the
> paxplugin
> and not
> set for the bundleplugin, otherwise Maven will use the bundleplugin
> lifecycle)
>
> you can get the same effect by unpacking the final bundle into
> "target/classes" after
> the packaging step (either by using the maven-ant-plugin or the
> maven-exec-plugin)
>
> so I'd give Maven 2.1.0 a whirl and report back if that fixes your
> problem
>
> Thanks!
>> =David
>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@felix.apache.org
>> For additional commands, e-mail: users-help@felix.apache.org
>>
>
> --
> Cheers, Stuart
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@felix.apache.org
For additional commands, e-mail: users-help@felix.apache.org
Re: Resolution of embedded dependencies during compilation
Posted by Stuart McCulloch <mc...@gmail.com>.
2009/4/29 David Leangen <os...@leangen.net>
>
> Hi,
>
> I just updated to maven-bundle-plugin 2.0.0. It appears that there have
> been a few changes to the way things compile, and I'm just discovering many
> interesting things in my own projects. This is of course a good thing, as
> it's bringing out many erroneous interpretations I made earlier.
>
>
> Anyway, here's my current issue.
>
> In project A, I have an embedded jar that I want to export. POM and bnd
> file below.
>
> In project B, I want to use the embedded package, but I only want to depend
> on the containing bundle, not the embedded bundle. Since the containing
> bundle exports this, my assumption is that this should be possible.
>
> However, the embedded jar in project A is only contained in the final
> installed jar, not in the target/classes directory. The problem is that
> maven wants to read from the target/classes directory rather than from the
> installed jar, so it can't find the embedded packages.
>
>
> Any ideas?
>
>
> Here's the essential of project A:
>
> <dependencies>
> <dependency>
> <groupId>org.junit</groupId>
> <artifactId>com.springsource.org.junit</artifactId>
> </dependency>
> <dependency>
> <groupId>net.jcip</groupId>
> <artifactId>com.springsource.net.jcip.annotations</artifactId>
> <version>1.0.0</version>
> <scope>compile</scope>
> <optional>true</optional>
> </dependency>
> </dependencies>
>
> and the bnd file:
>
> Export-Package: ${bundle.namespace}.*;version="${pom.version}"
>
> Embed-Dependency:
> com.springsource.net.jcip.annotations;groupId=net.jcip;inline=false
>
> Bundle-RequiredExecutionEnvironment: J2SE-1.5
>
> -exportcontents: net.jcip.*;version="1.0"
>
>
>
> And here's the POM from project B:
>
> <dependencies>
> ...
> <dependency>
> <groupId>net.leangen.expedition.util</groupId>
> <artifactId>expedition_object_api</artifactId>
> <scope>provided</scope>
> </dependency>
> ...
> </dependencies>
>
>
> The output from Maven looks like this:
>
> [DEBUG] Classpath:
> [/Users/dleangen/bioscene/dev/trunk/domains/lsd/model/impl/target/classes
>
> /Users/dleangen/.m2/repository/org/osgi/org.osgi.core/4.1.0/org.osgi.core-4.1.0.jar
> /Users/dleangen/bioscene/dev/trunk/domains/lsd/model/si/target/classes
> /Users/dleangen/bioscene/dev/trunk/platform/util/object/api/target/classes
>
> /Users/dleangen/.m2/repository/org/ops4j/pax/logging/pax-logging-api/1.3.0/pax-logging-api-1.3.0.jar
>
> /Users/dleangen/.m2/repository/org/osgi/org.osgi.compendium/4.1.0/org.osgi.compendium-4.1.0.jar]
> [DEBUG] Output directory:
> /Users/dleangen/bioscene/dev/trunk/domains/lsd/model/impl/target/classes
>
> So, in some cases it uses the jar file from the local cache, but in others,
> the output in the target/classes dir.
>
this is a core Maven issue, specifically code in MavenProject.java:
http://jira.codehaus.org/browse/MNG-2720
apparently it's fixed in Maven 2.1.0 so you might want to try that
BTW, you might not have noticed this before if you're using Pax-Construct
generated
projects because the maven-pax-plugin does some unpacking to make sure that
the
compilation classpath has the additional classes from the embedded
dependencies
(but this is only if you have <extensions>true</extensions for the paxplugin
and not
set for the bundleplugin, otherwise Maven will use the bundleplugin
lifecycle)
you can get the same effect by unpacking the final bundle into
"target/classes" after
the packaging step (either by using the maven-ant-plugin or the
maven-exec-plugin)
so I'd give Maven 2.1.0 a whirl and report back if that fixes your problem
Thanks!
> =David
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@felix.apache.org
> For additional commands, e-mail: users-help@felix.apache.org
>
--
Cheers, Stuart