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$appclassloa...@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