You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@felix.apache.org by Alexander Blotny <Al...@fokus.fraunhofer.de> on 2010/01/28 13:45:46 UTC
Using maven embedder in Felix
Hi,
I am trying to use maven embedder inside the Felix OSGi framework.
At first I created the MANIFEST files for all the dependencies of maven
embedder and used jardir for starting the bundles.
Following jars are started:
aspectjrt-1.5.3.jar
commons-cli-1.0.jar
doxia-sink-api-1.0-alpha-9.jar
jsch-0.1.27.jar
jtidy-4aug2000r7-dev.jar
maven-artifact-3.0-SNAPSHOT.jar
maven-core-2.1-SNAPSHOT.jar
maven-embedder-2.1-SNAPSHOT.jar
maven-lifecycle-2.1-SNAPSHOT.jar
maven-model-2.1-SNAPSHOT.jar
maven-plugin-api-2.1-SNAPSHOT.jar
maven-profile-2.1-SNAPSHOT.jar
maven-project-2.1-SNAPSHOT.jar
maven-reporting-api-2.1-SNAPSHOT.jar
maven-toolchain-2.1-SNAPSHOT.jar
maven-workspace-2.1-SNAPSHOT.jar
plexus-classworlds-1.2-alpha-12.jar
plexus-container-default-1.0-alpha-44.jar
plexus-interactivity-api-1.0-alpha-6.jar
plexus-interpolation-1.0-SNAPSHOT.jar
plexus-utils-1.5.1.jar
wagon-file-1.0-beta-2.jar
wagon-http-lightweight-1.0-beta-2.jar
wagon-http-shared-1.0-beta-2.jar
wagon-provider-api-1.0-beta-2.jar
wagon-ssh-1.0-beta-2.jar
wagon-ssh-common-1.0-beta-2.jar
wagon-ssh-external-1.0-beta-2.jar
Using maven embedder from within eclipse was no problem but starting it in
the OSGi framework throws exceptions.
The code for using maven embedder I got from the apache maven homepage
(excerpt) and started it in the Activator of a bundle:
File projectDirectory = new File(folder);
File user = new File(projectDirectory, "settings.xml");
Configuration configuration = new
DefaultConfiguration().setUserSettingsFile( user ).setClassLoader(
context.getBundle().getClass().getClassLoader() );
ConfigurationValidationResult validationResult =
MavenEmbedder.validateConfiguration(configuration);
if ( validationResult.isValid() )
{
MavenEmbedder embedder = null;
try {
embedder = new MavenEmbedder( configuration );
} catch (MavenEmbedderException e) {
e.printStackTrace();
}
}
As you can see, as Classloader I am using the one from the bundle.
The problem is now that inside the jar plexus-container is a resource as xml
which is accessed via getResourceStream of the Classloader. But the resource
cannot be found:
java.lang.IllegalStateException: The internal default plexus-bootstrap.xml
is missing. This is highly irregular, your plexus JAR is most likely
corrupt. Realms:
plexus.core parent=sun.misc.Launcher$AppClassLoader@6a765291 (null)
at
org.codehaus.plexus.DefaultPlexusContainer.initializeConfiguration(DefaultPl
exusContainer.java:1017) [na:na]
at
org.codehaus.plexus.DefaultPlexusContainer.initialize(DefaultPlexusContainer
.java:812) [na:na]
at
org.codehaus.plexus.DefaultPlexusContainer.construct(DefaultPlexusContainer.
java:406) [na:na]
at
org.codehaus.plexus.DefaultPlexusContainer.<init>(DefaultPlexusContainer.jav
a:199) [na:na]
at org.apache.maven.embedder.MavenEmbedder.start(MavenEmbedder.java:652)
[na:na]
at
org.apache.maven.embedder.MavenEmbedder.<init>(MavenEmbedder.java:198)
[na:na]
The source code of accessing the xml file in plexus-container.jar looks like
this:
InputStream is = containerRealm.getResourceAsStream(
"org/codehaus/plexus/plexus-bootstrap.xml" ); if ( is == null )
{ ClassRealm cr = containerRealm; String realmStack =
""; while ( cr != null ) { realmStack
+= "\n " + cr.getId() + " parent=" + cr.getParent() + " ("
+ cr.getResource( "org/codehaus/plexus/plexus-bootstrap.xml" ) + ")";
cr = cr.getParentRealm(); } containerRealm.display();
throw new IllegalStateException( "The internal default plexus-bootstrap.xml
is missing. " + "This is highly irregular, your plexus JAR is
most likely corrupt. Realms:" + realmStack ); }
Is there a possibility to assure access to that resource without changing
the source code?
Has anyone an idea?
Thanks,
Alex
Re: Using maven embedder in Felix
Posted by Guo Du <mr...@gmail.com>.
On Thu, Jan 28, 2010 at 5:45 PM, Alexander Blotny
<Al...@fokus.fraunhofer.de> wrote:
> configuration = new DefaultConfiguration().setUserSettingsFile( user
> ).setClassLoader( DefaultPlexusConfiguration.class.getClassLoader());
maven as build tool it has special class loader algorithm which
designed to dynamic load class from project/plugin dependencies. While
the bundle class loader is designed for modular component to isolate
each other.
You may create a new class loader in a maven bootstrap bundle to load
maven related class from some a lib/jar path outside osgi class
loader. Then export maven functions as a service interface for other
bundles to use.
-Guo
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@felix.apache.org
For additional commands, e-mail: users-help@felix.apache.org
Re: Using maven embedder in Felix
Posted by Alexander Blotny <Al...@fokus.fraunhofer.de>.
Now I managed the problem with getting the xml file. I used the classloader
from the bundle containing the xml file:
configuration = new DefaultConfiguration().setUserSettingsFile( user
).setClassLoader( DefaultPlexusConfiguration.class.getClassLoader());
But now I am facing the next issues.
Log:
this realm = plexus.core
this strategy = org.codehaus.plexus.classworlds.strategy.ForeignStrategy
Number of imports: 0
-----------------------------------------------------
Caused by:
org.codehaus.plexus.component.repository.exception.ComponentLookupException:
Unable to lookup component 'org.apache.maven.plugin.MavenPluginCollector',
it could not be created.
role: org.apache.maven.plugin.MavenPluginCollector
roleHint: default
classRealm: plexus.core
at
org.codehaus.plexus.DefaultComponentLookupManager.lookup(DefaultComponentLoo
kupManager.java:151)
at
org.codehaus.plexus.DefaultComponentLookupManager.lookup(DefaultComponentLoo
kupManager.java:69)
at
org.codehaus.plexus.DefaultPlexusContainer.lookup(DefaultPlexusContainer.jav
a:431)
at
org.codehaus.plexus.DefaultPlexusContainer.lookup(DefaultPlexusContainer.jav
a:425)
at
org.codehaus.plexus.container.initialization.InitializeComponentDiscovererMa
nagerPhase.initializeCoreComponent(InitializeComponentDiscovererManagerPhase
.java:51)
... 55 more
Caused by:
org.codehaus.plexus.component.factory.ComponentInstantiationException: Could
not instantiate component: role:
'org.apache.maven.plugin.MavenPluginCollector', implementation:
'org.apache.maven.plugin.MavenPluginCollector', role hint: 'default' realm:
plexus.core
at
org.codehaus.plexus.component.factory.java.JavaComponentFactory.makeExceptio
n(JavaComponentFactory.java:116)
at
org.codehaus.plexus.component.factory.java.JavaComponentFactory.newInstance(
JavaComponentFactory.java:82)
at
org.codehaus.plexus.component.manager.AbstractComponentManager.createCompone
ntInstance(AbstractComponentManager.java:203)
at
org.codehaus.plexus.component.manager.AbstractComponentManager.createCompone
ntInstance(AbstractComponentManager.java:125)
at
org.codehaus.plexus.component.manager.ClassicSingletonComponentManager.getCo
mponent(ClassicSingletonComponentManager.java:96)
at
org.codehaus.plexus.DefaultComponentLookupManager.lookup(DefaultComponentLoo
kupManager.java:147)
... 59 more
Caused by: java.lang.ClassNotFoundException:
org.apache.maven.plugin.MavenPluginCollector
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:315)
at java.lang.ClassLoader.loadClass(ClassLoader.java:250)
at
org.codehaus.plexus.classworlds.realm.ClassRealm.loadRealmClass(ClassRealm.j
ava:174)
at
org.codehaus.plexus.classworlds.strategy.DefaultStrategy.loadClass(DefaultSt
rategy.java:67)
at
org.codehaus.plexus.classworlds.strategy.ForeignStrategy.loadClass(ForeignSt
rategy.java:39)
at
org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:2
01)
at
org.codehaus.plexus.component.factory.java.JavaComponentFactory.newInstance(
JavaComponentFactory.java:53)
So I think the problem is that the jar is using the classloader I passed in
creating the configuration. Instantiating the component fails because the
classloader cannot find the class and as a consequence I am getting the
ClassNotFoundException.
I tried to add the package org.apache.maven.plugin to the bootdelegation but
it did not work.
Is there a possible workaround for my described class loading issue?
Maybe someone had similar problems using libraries not written as OSGi
bundles?
Thanks,
Alex
Am 28.01.10 17:22 schrieb "Chris Custine" unter <ch...@gmail.com>:
> I would say that either the bundle with that xml resource does not export
> the org.codehaus.plexus package where the xml file is, and/or the bundle
> containing your activator does not import that package. If those are both
> true, it should work as far as I can tell.
>
> Chris
>
> --
> Chris Custine
> FUSESource :: http://fusesource.com
> My Blog :: http://blog.organicelement.com
> Apache ServiceMix :: http://servicemix.apache.org
> Apache Felix :: http://felix.apache.org
> Apache Directory Server :: http://directory.apache.org
>
>
> On Thu, Jan 28, 2010 at 5:45 AM, Alexander Blotny <
> Alexander.Blotny@fokus.fraunhofer.de> wrote:
>
>> Hi,
>>
>> I am trying to use maven embedder inside the Felix OSGi framework.
>> At first I created the MANIFEST files for all the dependencies of maven
>> embedder and used jardir for starting the bundles.
>>
>> Following jars are started:
>>
>> aspectjrt-1.5.3.jar
>> commons-cli-1.0.jar
>> doxia-sink-api-1.0-alpha-9.jar
>> jsch-0.1.27.jar
>> jtidy-4aug2000r7-dev.jar
>> maven-artifact-3.0-SNAPSHOT.jar
>> maven-core-2.1-SNAPSHOT.jar
>> maven-embedder-2.1-SNAPSHOT.jar
>> maven-lifecycle-2.1-SNAPSHOT.jar
>> maven-model-2.1-SNAPSHOT.jar
>> maven-plugin-api-2.1-SNAPSHOT.jar
>> maven-profile-2.1-SNAPSHOT.jar
>> maven-project-2.1-SNAPSHOT.jar
>> maven-reporting-api-2.1-SNAPSHOT.jar
>> maven-toolchain-2.1-SNAPSHOT.jar
>> maven-workspace-2.1-SNAPSHOT.jar
>> plexus-classworlds-1.2-alpha-12.jar
>> plexus-container-default-1.0-alpha-44.jar
>> plexus-interactivity-api-1.0-alpha-6.jar
>> plexus-interpolation-1.0-SNAPSHOT.jar
>> plexus-utils-1.5.1.jar
>> wagon-file-1.0-beta-2.jar
>> wagon-http-lightweight-1.0-beta-2.jar
>> wagon-http-shared-1.0-beta-2.jar
>> wagon-provider-api-1.0-beta-2.jar
>> wagon-ssh-1.0-beta-2.jar
>> wagon-ssh-common-1.0-beta-2.jar
>> wagon-ssh-external-1.0-beta-2.jar
>>
>> Using maven embedder from within eclipse was no problem but starting it in
>> the OSGi framework throws exceptions.
>> The code for using maven embedder I got from the apache maven homepage
>> (excerpt) and started it in the Activator of a bundle:
>>
>> File projectDirectory = new File(folder);
>> File user = new File(projectDirectory, "settings.xml");
>> Configuration configuration = new
>> DefaultConfiguration().setUserSettingsFile( user ).setClassLoader(
>> context.getBundle().getClass().getClassLoader() );
>> ConfigurationValidationResult validationResult =
>> MavenEmbedder.validateConfiguration(configuration);
>> if ( validationResult.isValid() )
>> {
>> MavenEmbedder embedder = null;
>> try {
>> embedder = new MavenEmbedder( configuration );
>> } catch (MavenEmbedderException e) {
>> e.printStackTrace();
>> }
>> }
>>
>> As you can see, as Classloader I am using the one from the bundle.
>> The problem is now that inside the jar plexus-container is a resource as
>> xml
>> which is accessed via getResourceStream of the Classloader. But the
>> resource
>> cannot be found:
>>
>> java.lang.IllegalStateException: The internal default plexus-bootstrap.xml
>> is missing. This is highly irregular, your plexus JAR is most likely
>> corrupt. Realms:
>> plexus.core parent=sun.misc.Launcher$AppClassLoader@6a765291 (null)
>> at
>>
>> org.codehaus.plexus.DefaultPlexusContainer.initializeConfiguration(DefaultPl
>> exusContainer.java:1017) [na:na]
>> at
>>
>> org.codehaus.plexus.DefaultPlexusContainer.initialize(DefaultPlexusContainer
>> .java:812) [na:na]
>> at
>>
>> org.codehaus.plexus.DefaultPlexusContainer.construct(DefaultPlexusContainer.
>> java:406) [na:na]
>> at
>>
>> org.codehaus.plexus.DefaultPlexusContainer.<init>(DefaultPlexusContainer.jav
>> a:199) [na:na]
>> at org.apache.maven.embedder.MavenEmbedder.start(MavenEmbedder.java:652)
>> [na:na]
>> at
>> org.apache.maven.embedder.MavenEmbedder.<init>(MavenEmbedder.java:198)
>> [na:na]
>>
>> The source code of accessing the xml file in plexus-container.jar looks
>> like
>> this:
>>
>> InputStream is = containerRealm.getResourceAsStream(
>> "org/codehaus/plexus/plexus-bootstrap.xml" ); if ( is == null )
>> { ClassRealm cr = containerRealm; String realmStack =
>> ""; while ( cr != null ) { realmStack
>> += "\n " + cr.getId() + " parent=" + cr.getParent() + " ("
>> + cr.getResource( "org/codehaus/plexus/plexus-bootstrap.xml" ) + ")";
>> cr = cr.getParentRealm(); }
>> containerRealm.display();
>> throw new IllegalStateException( "The internal default plexus-bootstrap.xml
>> is missing. " + "This is highly irregular, your plexus JAR
>> is
>> most likely corrupt. Realms:" + realmStack ); }
>>
>> Is there a possibility to assure access to that resource without changing
>> the source code?
>> Has anyone an idea?
>>
>> Thanks,
>> Alex
>>
>>
>>
Re: Using maven embedder in Felix
Posted by Chris Custine <ch...@gmail.com>.
I would say that either the bundle with that xml resource does not export
the org.codehaus.plexus package where the xml file is, and/or the bundle
containing your activator does not import that package. If those are both
true, it should work as far as I can tell.
Chris
--
Chris Custine
FUSESource :: http://fusesource.com
My Blog :: http://blog.organicelement.com
Apache ServiceMix :: http://servicemix.apache.org
Apache Felix :: http://felix.apache.org
Apache Directory Server :: http://directory.apache.org
On Thu, Jan 28, 2010 at 5:45 AM, Alexander Blotny <
Alexander.Blotny@fokus.fraunhofer.de> wrote:
> Hi,
>
> I am trying to use maven embedder inside the Felix OSGi framework.
> At first I created the MANIFEST files for all the dependencies of maven
> embedder and used jardir for starting the bundles.
>
> Following jars are started:
>
> aspectjrt-1.5.3.jar
> commons-cli-1.0.jar
> doxia-sink-api-1.0-alpha-9.jar
> jsch-0.1.27.jar
> jtidy-4aug2000r7-dev.jar
> maven-artifact-3.0-SNAPSHOT.jar
> maven-core-2.1-SNAPSHOT.jar
> maven-embedder-2.1-SNAPSHOT.jar
> maven-lifecycle-2.1-SNAPSHOT.jar
> maven-model-2.1-SNAPSHOT.jar
> maven-plugin-api-2.1-SNAPSHOT.jar
> maven-profile-2.1-SNAPSHOT.jar
> maven-project-2.1-SNAPSHOT.jar
> maven-reporting-api-2.1-SNAPSHOT.jar
> maven-toolchain-2.1-SNAPSHOT.jar
> maven-workspace-2.1-SNAPSHOT.jar
> plexus-classworlds-1.2-alpha-12.jar
> plexus-container-default-1.0-alpha-44.jar
> plexus-interactivity-api-1.0-alpha-6.jar
> plexus-interpolation-1.0-SNAPSHOT.jar
> plexus-utils-1.5.1.jar
> wagon-file-1.0-beta-2.jar
> wagon-http-lightweight-1.0-beta-2.jar
> wagon-http-shared-1.0-beta-2.jar
> wagon-provider-api-1.0-beta-2.jar
> wagon-ssh-1.0-beta-2.jar
> wagon-ssh-common-1.0-beta-2.jar
> wagon-ssh-external-1.0-beta-2.jar
>
> Using maven embedder from within eclipse was no problem but starting it in
> the OSGi framework throws exceptions.
> The code for using maven embedder I got from the apache maven homepage
> (excerpt) and started it in the Activator of a bundle:
>
> File projectDirectory = new File(folder);
> File user = new File(projectDirectory, "settings.xml");
> Configuration configuration = new
> DefaultConfiguration().setUserSettingsFile( user ).setClassLoader(
> context.getBundle().getClass().getClassLoader() );
> ConfigurationValidationResult validationResult =
> MavenEmbedder.validateConfiguration(configuration);
> if ( validationResult.isValid() )
> {
> MavenEmbedder embedder = null;
> try {
> embedder = new MavenEmbedder( configuration );
> } catch (MavenEmbedderException e) {
> e.printStackTrace();
> }
> }
>
> As you can see, as Classloader I am using the one from the bundle.
> The problem is now that inside the jar plexus-container is a resource as
> xml
> which is accessed via getResourceStream of the Classloader. But the
> resource
> cannot be found:
>
> java.lang.IllegalStateException: The internal default plexus-bootstrap.xml
> is missing. This is highly irregular, your plexus JAR is most likely
> corrupt. Realms:
> plexus.core parent=sun.misc.Launcher$AppClassLoader@6a765291 (null)
> at
>
> org.codehaus.plexus.DefaultPlexusContainer.initializeConfiguration(DefaultPl
> exusContainer.java:1017) [na:na]
> at
>
> org.codehaus.plexus.DefaultPlexusContainer.initialize(DefaultPlexusContainer
> .java:812) [na:na]
> at
>
> org.codehaus.plexus.DefaultPlexusContainer.construct(DefaultPlexusContainer.
> java:406) [na:na]
> at
>
> org.codehaus.plexus.DefaultPlexusContainer.<init>(DefaultPlexusContainer.jav
> a:199) [na:na]
> at org.apache.maven.embedder.MavenEmbedder.start(MavenEmbedder.java:652)
> [na:na]
> at
> org.apache.maven.embedder.MavenEmbedder.<init>(MavenEmbedder.java:198)
> [na:na]
>
> The source code of accessing the xml file in plexus-container.jar looks
> like
> this:
>
> InputStream is = containerRealm.getResourceAsStream(
> "org/codehaus/plexus/plexus-bootstrap.xml" ); if ( is == null )
> { ClassRealm cr = containerRealm; String realmStack =
> ""; while ( cr != null ) { realmStack
> += "\n " + cr.getId() + " parent=" + cr.getParent() + " ("
> + cr.getResource( "org/codehaus/plexus/plexus-bootstrap.xml" ) + ")";
> cr = cr.getParentRealm(); }
> containerRealm.display();
> throw new IllegalStateException( "The internal default plexus-bootstrap.xml
> is missing. " + "This is highly irregular, your plexus JAR
> is
> most likely corrupt. Realms:" + realmStack ); }
>
> Is there a possibility to assure access to that resource without changing
> the source code?
> Has anyone an idea?
>
> Thanks,
> Alex
>
>
>