Java tutorial
/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.geronimo.mavenplugins.car; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.ServiceLoader; import java.util.Set; import org.apache.geronimo.kernel.util.IOUtils; import org.apache.geronimo.system.plugin.model.ArtifactType; import org.apache.geronimo.system.plugin.model.DependencyType; import org.apache.geronimo.system.plugin.model.ImportType; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.factory.ArtifactFactory; import org.apache.maven.artifact.metadata.ArtifactMetadataSource; import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.resolver.ArtifactCollector; import org.apache.maven.artifact.resolver.ArtifactResolutionException; import org.apache.maven.artifact.resolver.ArtifactResolutionResult; import org.apache.maven.execution.MavenSession; import org.apache.maven.plugin.Mojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugin.logging.Log; import org.apache.maven.plugin.logging.SystemStreamLog; import org.apache.maven.project.MavenProject; import org.apache.maven.project.MavenProjectHelper; import org.apache.maven.project.ProjectBuildingException; import org.apache.maven.project.artifact.InvalidDependencyVersionException; import org.apache.maven.shared.dependency.tree.DependencyNode; import org.apache.maven.shared.dependency.tree.DependencyTreeResolutionListener; import org.apache.maven.shared.filtering.MavenFileFilter; import org.apache.maven.shared.filtering.MavenFilteringException; import org.apache.maven.shared.filtering.MavenResourcesFiltering; import org.codehaus.plexus.logging.AbstractLogEnabled; import org.codehaus.plexus.util.ReaderFactory; import org.codehaus.plexus.util.StringUtils; import org.osgi.framework.BundleException; import org.osgi.framework.Constants; import org.osgi.framework.launch.Framework; import org.osgi.framework.launch.FrameworkFactory; /** * Support for <em>packaging</em> Mojos. * * @version $Rev: 1307840 $ $Date: 2012-04-01 00:13:05 +0800 (Sun, 01 Apr 2012) $ */ public abstract class AbstractCarMojo extends AbstractLogEnabled implements Mojo { private Log log; /** * The maven project. * * @parameter expression="${project}" * @required * @readonly */ protected MavenProject project; /** * The maven project's helper. * * @component * @required * @readonly */ protected MavenProjectHelper projectHelper; /** * The basedir of the project. * * @parameter expression="${basedir}" * @required * @readonly */ protected File basedir; protected Set<Artifact> dependencyArtifacts; protected Set<Artifact> localDependencies; /** * The artifact repository to use. * * @parameter expression="${localRepository}" * @required * @readonly */ private ArtifactRepository localRepository; /** * The artifact factory to use. * * @component * @required * @readonly */ protected ArtifactFactory artifactFactory; /** * The artifact metadata source to use. * * @component * @required * @readonly */ private ArtifactMetadataSource artifactMetadataSource; /** * The artifact collector to use. * * @component * @required * @readonly */ private ArtifactCollector artifactCollector; protected String treeListing; //filtering support /** * The character encoding scheme to be applied when filtering resources. * * @parameter expression="${encoding}" default-value="${project.build.sourceEncoding}" */ protected String encoding; /** * @component role="org.apache.maven.shared.filtering.MavenResourcesFiltering" role-hint="default" * @required */ protected MavenResourcesFiltering mavenResourcesFiltering; /** * @parameter expression="${session}" * @readonly * @required */ protected MavenSession session; /** * Expression preceded with the String won't be interpolated * \${foo} will be replaced with ${foo} * * @parameter expression="${maven.resources.escapeString}" * @since 2.3 */ protected String escapeString = "\\"; /** * @plexus.requirement role-hint="default" * @component * @required */ protected MavenFileFilter mavenFileFilter; /** * System properties. * * @parameter */ protected Map<String, String> systemProperties; private Map<String, String> previousSystemProperties; // // MojoSupport Hooks // protected MavenProject getProject() { return project; } /** * @parameter expression="${localRepository}" * @readonly * @required */ protected ArtifactRepository artifactRepository = null; protected ArtifactRepository getArtifactRepository() { return artifactRepository; } protected void init() throws MojoExecutionException, MojoFailureException { // super.init(); } /** * Generates a properties file with explicit versions of artifacts of the current project transitivly. */ protected void generateExplicitVersionProperties(final File outputFile, Set<org.apache.maven.artifact.Artifact> dependencies) throws MojoExecutionException, IOException { getLog().debug("Generating explicit version properties: " + outputFile); // Generate explicit_versions for all our dependencies... Properties props = new Properties(); for (org.apache.maven.artifact.Artifact artifact : dependencies) { String name = artifact.getGroupId() + "/" + artifact.getArtifactId() + "//" + artifact.getType(); String value = artifact.getGroupId() + "/" + artifact.getArtifactId() + "/" + artifact.getVersion() + "/" + artifact.getType(); if (getLog().isDebugEnabled()) { getLog().debug("Setting " + name + "=" + value); } props.setProperty(name, value); } BufferedOutputStream output = null; try { output = new BufferedOutputStream(new FileOutputStream(outputFile)); props.store(output, null); } finally { IOUtils.close(output); } } protected static File getArchiveFile(final File basedir, final String finalName, String classifier) { if (classifier == null) { classifier = ""; } else if (classifier.trim().length() > 0 && !classifier.startsWith("-")) { classifier = "-" + classifier; } return new File(basedir, finalName + classifier + ".car"); } // // Geronimo/Maven Artifact Interop // protected org.apache.geronimo.kernel.repository.Artifact mavenToGeronimoArtifact( final org.apache.maven.artifact.Artifact artifact) { assert artifact != null; return new org.apache.geronimo.kernel.repository.Artifact(artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(), artifact.getType()); } protected org.apache.geronimo.kernel.repository.Artifact mavenToGeronimoArtifact( final org.apache.maven.model.Dependency artifact) { assert artifact != null; return new org.apache.geronimo.kernel.repository.Artifact(artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(), artifact.getType()); } protected org.apache.maven.artifact.Artifact geronimoToMavenArtifact( final org.apache.geronimo.kernel.repository.Artifact artifact) throws MojoExecutionException { assert artifact != null; return artifactFactory.createArtifactWithClassifier(artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion().toString(), artifact.getType(), null); } /** * Determine if the given artifact is a Geronimo module. * * @param artifact The artifact to check; must not be null. * @return True if the artifact is a Geronimo module. */ protected boolean isModuleArtifact(final org.apache.geronimo.kernel.repository.Artifact artifact) { assert artifact != null; return "car".equals(artifact.getType()); } protected boolean includeDependency(org.apache.maven.model.Dependency dependency) { if (dependency.getGroupId().startsWith("org.apache.geronimo.genesis")) { return false; } String scope = dependency.getScope(); return scope == null || "runtime".equalsIgnoreCase(scope) || "compile".equalsIgnoreCase(scope); } protected org.apache.maven.model.Dependency resolveDependency(org.apache.maven.model.Dependency dependency, List<org.apache.maven.model.Dependency> artifacts) { for (org.apache.maven.model.Dependency match : artifacts) { if (matches(dependency, match)) { return match; } } throw new IllegalStateException("Dependency " + dependency + " is not resolved in project"); } private boolean matches(org.apache.maven.model.Dependency dependency, org.apache.maven.model.Dependency match) { if (dependency.getGroupId() != null && !dependency.getGroupId().equals(match.getGroupId())) { return false; } if (dependency.getArtifactId() != null && !dependency.getArtifactId().equals(match.getArtifactId())) { return false; } if (dependency.getType() != null && !dependency.getType().equals(match.getType())) { return false; } return true; } protected void getDependencies(MavenProject project, boolean useTransitiveDependencies) throws MojoExecutionException { DependencyTreeResolutionListener listener = new DependencyTreeResolutionListener(getLogger()); DependencyNode rootNode; try { Map managedVersions = project.getManagedVersionMap(); Set dependencyArtifacts = project.getDependencyArtifacts(); if (dependencyArtifacts == null) { dependencyArtifacts = project.createArtifacts(artifactFactory, null, null); } ArtifactResolutionResult result = artifactCollector.collect(dependencyArtifacts, project.getArtifact(), managedVersions, localRepository, project.getRemoteArtifactRepositories(), artifactMetadataSource, null, Collections.singletonList(listener)); this.dependencyArtifacts = result.getArtifacts(); rootNode = listener.getRootNode(); } catch (ArtifactResolutionException exception) { throw new MojoExecutionException("Cannot build project dependency tree", exception); } catch (InvalidDependencyVersionException e) { throw new MojoExecutionException("Invalid dependency version for artifact " + project.getArtifact()); } Scanner scanner = new Scanner(); scanner.scan(rootNode, useTransitiveDependencies); localDependencies = scanner.localDependencies.keySet(); treeListing = scanner.getLog(); } public void setLog(Log log) { this.log = log; } public Log getLog() { if (log == null) { setLog(new SystemStreamLog()); } return log; } protected static org.apache.geronimo.kernel.repository.Dependency toGeronimoDependency( final Artifact dependency, boolean includeVersion) { org.apache.geronimo.kernel.repository.Artifact artifact = toGeronimoArtifact(dependency, includeVersion); return new org.apache.geronimo.kernel.repository.Dependency(artifact, org.apache.geronimo.kernel.repository.ImportType.ALL); } private static org.apache.geronimo.kernel.repository.Artifact toGeronimoArtifact(final Artifact dependency, boolean includeVersion) { String groupId = dependency.getGroupId(); String artifactId = dependency.getArtifactId(); String version = includeVersion ? dependency.getVersion() : null; String type = dependency.getType(); return new org.apache.geronimo.kernel.repository.Artifact(groupId, artifactId, version, type); } protected LinkedHashSet<DependencyType> toDependencies(List<Dependency> explicitDependencies, UseMavenDependencies useMavenDependencies, boolean includeImport) throws InvalidDependencyVersionException, ArtifactResolutionException, ProjectBuildingException, MojoExecutionException { List<DependencyType> dependencyTypes = new ArrayList<DependencyType>(); for (Dependency dependency : explicitDependencies) { dependencyTypes.add(dependency.toDependencyType()); } LinkedHashSet<DependencyType> dependencies = new LinkedHashSet<DependencyType>(); if (useMavenDependencies == null || !useMavenDependencies.isValue()) { dependencies.addAll(dependencyTypes); localDependencies = new HashSet<Artifact>(); for (DependencyType dependency : dependencies) { localDependencies.add(geronimoToMavenArtifact(dependency.toArtifact())); } } else { Map<String, DependencyType> explicitDependencyMap = new HashMap<String, DependencyType>(); for (DependencyType dependency : dependencyTypes) { explicitDependencyMap.put(getKey(dependency), dependency); } getDependencies(project, useMavenDependencies.isUseTransitiveDependencies()); for (Artifact entry : localDependencies) { dependencies.add(toDependencyType(entry, explicitDependencyMap, useMavenDependencies.isIncludeVersion(), includeImport)); } } return dependencies; } DependencyType toDependencyType(Artifact artifact, Map<String, DependencyType> explicitDependencyMap, boolean includeVersion, boolean includeImport) { DependencyType explicitDependency = explicitDependencyMap.get(getKey(artifact)); DependencyType dependency = toDependencyType(artifact, includeVersion, explicitDependency, includeImport); return dependency; } DependencyType toDependencyType(Artifact artifact, boolean includeVersion, DependencyType explicitDependency, boolean includeImport) { DependencyType dependency = new DependencyType(); dependency.setGroupId(artifact.getGroupId()); dependency.setArtifactId(artifact.getArtifactId()); String version = null; if (includeVersion) { if (artifact.getVersionRange() == null) { version = artifact.getVersion(); } else { version = artifact.getVersionRange().getRecommendedVersion().toString(); } } dependency.setVersion(version); dependency.setType(artifact.getType()); if (includeImport) { ImportType importType = ImportType.ALL; if (explicitDependency != null && explicitDependency.getImport() != null) { importType = explicitDependency.getImport(); } dependency.setImport(importType); } if (explicitDependency != null) { dependency.setStart(explicitDependency.isStart()); } return dependency; } private static String getKey(DependencyType dependency) { return dependency.getGroupId() + "/" + dependency.getArtifactId() + "/" + dependency.getType(); } private static String getKey(Artifact dependency) { return dependency.getGroupId() + "/" + dependency.getArtifactId() + "/" + dependency.getType(); } protected ArtifactType getModuleId() { ArtifactType artifactType = new ArtifactType(); artifactType.setGroupId(project.getGroupId()); artifactType.setArtifactId(project.getArtifactId()); artifactType.setVersion(project.getVersion()); artifactType.setType(project.getArtifact().getType()); return artifactType; } protected void cleanup() { unsetSystemProperties(previousSystemProperties); } protected Map<String, String> setSystemProperties() { if (previousSystemProperties != null) { throw new IllegalStateException("setSystemProperties called twice"); } if (systemProperties == null) { return Collections.emptyMap(); } else { getLog().debug("Setting system properties: " + systemProperties); previousSystemProperties = new HashMap<String, String>(); for (Map.Entry<String, String> entry : systemProperties.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); String oldValue = System.setProperty(key, value); previousSystemProperties.put(key, oldValue); } return previousSystemProperties; } } protected void unsetSystemProperties(Map<String, String> previousSystemProperties) { if (previousSystemProperties != null) { for (Map.Entry<String, String> entry : previousSystemProperties.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); if (value == null) { System.clearProperty(key); } else { System.setProperty(key, value); } } } } private static class Scanner { private static enum Accept { ACCEPT(true, true), PROVIDED(true, false), STOP(false, false); private final boolean more; private final boolean local; private Accept(boolean more, boolean local) { this.more = more; this.local = local; } public boolean isContinue() { return more; } public boolean isLocal() { return local; } } //all the dependencies needed for this car, with provided dependencies removed private final Map<Artifact, Set<Artifact>> localDependencies = new LinkedHashMap<Artifact, Set<Artifact>>(); //dependencies from ancestor cars, to be removed from localDependencies. private final Set<Artifact> carDependencies = new LinkedHashSet<Artifact>(); private final StringBuilder log = new StringBuilder(); public void scan(DependencyNode rootNode, boolean useTransitiveDependencies) { Set<Artifact> children = new LinkedHashSet<Artifact>(); for (DependencyNode child : (List<DependencyNode>) rootNode.getChildren()) { scan(child, Accept.ACCEPT, useTransitiveDependencies, false, "", children); } if (useTransitiveDependencies) { localDependencies.keySet().removeAll(carDependencies); } } private void scan(DependencyNode rootNode, Accept parentAccept, boolean useTransitiveDependencies, boolean isFromCar, String indent, Set<Artifact> parentsChildren) { Artifact artifact = getArtifact(rootNode); Accept accept = accept(artifact, parentAccept); if (accept.isContinue()) { Set<Artifact> children = localDependencies.get(artifact); if (isFromCar) { if (!artifact.getType().equals("car")) { log.append(indent).append("from car:").append(artifact).append("\n"); carDependencies.add(artifact); } else { log.append(indent).append("is car:").append(artifact).append("\n"); } } else { log.append(indent).append("local:").append(artifact).append("\n"); if (carDependencies.contains(artifact)) { log.append(indent).append("already in car, returning:").append(artifact).append("\n"); parentsChildren.add(artifact); return; } parentsChildren.add(artifact); if (children == null) { children = new LinkedHashSet<Artifact>(); localDependencies.put(artifact, children); } if (artifact.getType().equals("car") || !useTransitiveDependencies) { isFromCar = true; } } for (DependencyNode child : (List<DependencyNode>) rootNode.getChildren()) { scan(child, accept, useTransitiveDependencies, isFromCar, indent + " ", children); } } } public String getLog() { return log.toString(); } private Artifact getArtifact(DependencyNode rootNode) { Artifact artifact = rootNode.getArtifact(); if (rootNode.getRelatedArtifact() != null) { artifact = rootNode.getRelatedArtifact(); } return artifact; } private Accept accept(Artifact dependency, Accept previous) { if (dependency.getGroupId().startsWith("org.apache.geronimo.genesis")) { return Accept.STOP; } String scope = dependency.getScope(); if (scope == null || "runtime".equalsIgnoreCase(scope) || "compile".equalsIgnoreCase(scope)) { return previous; } return Accept.STOP; } } protected class ArtifactLookupImpl implements Maven2RepositoryAdapter.ArtifactLookup { public File getBasedir() { String path = getArtifactRepository().getBasedir(); return new File(path); } private boolean isProjectArtifact(final org.apache.geronimo.kernel.repository.Artifact artifact) { MavenProject project = getProject(); return artifact.getGroupId().equals(project.getGroupId()) && artifact.getArtifactId().equals(project.getArtifactId()); } public File getLocation(final org.apache.geronimo.kernel.repository.Artifact artifact) { assert artifact != null; Artifact mavenArtifact; // Do not attempt to resolve an artifact that is the same as the project if (isProjectArtifact(artifact) && artifact.getVersion() == null) { throw new IllegalStateException("WTF? project has no version??"); } if (artifact.getVersion() == null) { if (log.isDebugEnabled()) { getLog().debug("Resolving artifact: " + artifact); } mavenArtifact = resolveArtifact(artifact.getGroupId(), artifact.getArtifactId(), artifact.getType()); } else { mavenArtifact = artifactFactory.createArtifactWithClassifier(artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion().toString(), artifact.getType(), null); } String path = getArtifactRepository().pathOf(mavenArtifact); return new File(getBasedir(), path); } } protected Artifact resolveArtifact(String groupId, String artifactId, String type) { for (Artifact artifact : dependencyArtifacts) { if (matches(groupId, artifactId, type, artifact)) { return artifact; } } return null; } private boolean matches(String groupId, String artifactId, String type, Artifact artifact) { if (!groupId.equals(artifact.getGroupId())) return false; if (!artifactId.equals(artifact.getArtifactId())) return false; if (!type.equals(artifact.getType())) return false; return true; } protected void filter(File sourceFile, File targetFile) throws MojoExecutionException { try { if (StringUtils.isEmpty(encoding)) { getLog().warn("File encoding has not been set, using platform encoding " + ReaderFactory.FILE_ENCODING + ", i.e. build is platform dependent!"); } targetFile.getParentFile().mkdirs(); List filters = mavenFileFilter.getDefaultFilterWrappers(project, null, true, session, null); mavenFileFilter.copyFile(sourceFile, targetFile, true, filters, encoding, true); } catch (MavenFilteringException e) { throw new MojoExecutionException(e.getMessage(), e); } } private void setLoggingLevel() { if (System.getProperty("org.ops4j.pax.logging.DefaultServiceLog.level") == null) { System.setProperty("org.ops4j.pax.logging.DefaultServiceLog.level", log.isDebugEnabled() ? "DEBUG" : "INFO"); } } protected Framework getFramework(String extraPackages) throws BundleException { setLoggingLevel(); Map<String, String> properties = new HashMap<String, String>(); // properties.put(FelixConstants.EMBEDDED_EXECUTION_PROP, "true"); // The following set of packages are the ones that will be exported by the // framework bundle from the core system. We need to explicitly specify // these to give explicit versions to many of the javax.* packages so that // they'll match any of the versions exported by the Geronimo spec jars. // This list and the version numbers needs to be synchronized with the list // in the karaf framework config.properties file. properties.put(Constants.FRAMEWORK_SYSTEMPACKAGES, "org.osgi.framework; version=1.6.0," + "org.osgi.framework.launch; version=1.0.0," + "org.osgi.framework.startlevel; version=1.0.0," + "org.osgi.framework.wiring; version=1.0.0," + "org.osgi.framework.hooks.service; version=1.1.0," + "org.osgi.framework.hooks.bundle; version=1.0.0," + "org.osgi.framework.hooks.resolver; version=1.0.0," + "org.osgi.framework.hooks.weaving; version=1.0.0," + "org.osgi.service.packageadmin; version=1.2.0," + "org.osgi.service.startlevel; version=1.1.0," + "org.osgi.service.url; version=1.0.0," + "org.osgi.util.tracker; version=1.5.0," + "javax.accessibility," + "javax.annotation.processing," + "javax.activity," + "javax.crypto," + "javax.crypto.interfaces," + "javax.crypto.spec," + "javax.imageio," + "javax.imageio.event," + "javax.imageio.metadata," + "javax.imageio.plugins.bmp," + "javax.imageio.plugins.jpeg," + "javax.imageio.spi," + "javax.imageio.stream," + "javax.jws;version=2.0," + "javax.jws.soap;version=2.0," + "javax.lang.model," + "javax.lang.model.element," + "javax.lang.model.type," + "javax.lang.model.util," + "javax.management," + "javax.management.loading," + "javax.management.modelmbean," + "javax.management.monitor," + "javax.management.openmbean," + "javax.management.relation," + "javax.management.remote," + "javax.management.remote.rmi," + "javax.management.timer," + "javax.naming," + "javax.naming.directory," + "javax.naming.event," + "javax.naming.ldap," + "javax.naming.spi," + "javax.net," + "javax.net.ssl," + "javax.print," + "javax.print.attribute," + "javax.print.attribute.standard," + "javax.print.event," + "javax.rmi," + "javax.rmi.CORBA," + "javax.rmi.ssl," + "javax.script," + "javax.security.auth," + "javax.security.auth.callback," + "javax.security.auth.kerberos," + "javax.security.auth.login," + "javax.security.auth.spi," + "javax.security.auth.x500," + "javax.security.cert," + "javax.security.sasl," + "javax.sound.midi," + "javax.sound.midi.spi," + "javax.sound.sampled," + "javax.sound.sampled.spi," + "javax.sql," + "javax.sql.rowset," + "javax.sql.rowset.serial," + "javax.sql.rowset.spi," + "javax.swing," + "javax.swing.border," + "javax.swing.colorchooser," + "javax.swing.event," + "javax.swing.filechooser," + "javax.swing.plaf," + "javax.swing.plaf.basic," + "javax.swing.plaf.metal," + "javax.swing.plaf.multi," + "javax.swing.plaf.synth," + "javax.swing.table," + "javax.swing.text," + "javax.swing.text.html," + "javax.swing.text.html.parser," + "javax.swing.text.rtf," + "javax.swing.tree," + "javax.swing.undo," + "javax.tools," + "javax.transaction;javax.transaction.xa;version=1.1;partial=true;mandatory:=partial," + "javax.xml," + "javax.xml.namespace;version=1.0," + "javax.xml.crypto," + "javax.xml.crypto.dom," + "javax.xml.crypto.dsig," + "javax.xml.crypto.dsig.dom," + "javax.xml.crypto.dsig.keyinfo," + "javax.xml.crypto.dsig.spec," + "javax.xml.datatype," + "javax.xml.parsers," + "javax.xml.transform," + "javax.xml.transform.dom," + "javax.xml.transform.sax," + "javax.xml.transform.stax," + "javax.xml.transform.stream," + "javax.xml.validation," + "javax.xml.xpath," + "org.ietf.jgss," + "org.omg.CORBA," + "org.omg.CORBA_2_3," + "org.omg.CORBA_2_3.portable," + "org.omg.CORBA.DynAnyPackage," + "org.omg.CORBA.ORBPackage," + "org.omg.CORBA.portable," + "org.omg.CORBA.TypeCodePackage," + "org.omg.CosNaming," + "org.omg.CosNaming.NamingContextExtPackage," + "org.omg.CosNaming.NamingContextPackage," + "org.omg.Dynamic," + "org.omg.DynamicAny," + "org.omg.DynamicAny.DynAnyFactoryPackage," + "org.omg.DynamicAny.DynAnyPackage," + "org.omg.IOP," + "org.omg.IOP.CodecFactoryPackage," + "org.omg.IOP.CodecPackage," + "org.omg.Messaging," + "org.omg.PortableInterceptor," + "org.omg.PortableInterceptor.ORBInitInfoPackage," + "org.omg.PortableServer," + "org.omg.PortableServer.CurrentPackage," + "org.omg.PortableServer.POAManagerPackage," + "org.omg.PortableServer.POAPackage," + "org.omg.PortableServer.portable," + "org.omg.PortableServer.ServantLocatorPackage," + "org.omg.SendingContext," + "org.omg.stub.java.rmi," + "org.omg.stub.javax.management.remote.rmi," + "org.w3c.dom," + "org.w3c.dom.bootstrap," + "org.w3c.dom.css," + "org.w3c.dom.events," + "org.w3c.dom.html," + "org.w3c.dom.ls," + "org.w3c.dom.ranges," + "org.w3c.dom.stylesheets," + "org.w3c.dom.traversal," + "org.w3c.dom.views," + "org.w3c.dom.xpath," + "org.xml.sax," + "org.xml.sax.ext," + "org.xml.sax.helpers"); properties.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, "net.sf.cglib.asm," + "net.sf.cglib.core," + "net.sf.cglib.proxy," + "net.sf.cglib.reflect," + "sun.misc," + "sun.reflect," + "org.apache.commons.jexl;version=\"1.1\"," + "org.apache.commons.jexl.context;version=\"1.1\"," + "org.apache.commons.jexl.resolver;version=\"1.1\"," + "org.apache.geronimo.main," + "org.apache.geronimo.cli," + "org.apache.geronimo.cli.client," + "org.apache.geronimo.cli.daemon," + "org.apache.geronimo.common," + "org.apache.geronimo.common.propertyeditor," + "org.apache.geronimo.crypto," + "org.apache.geronimo.gbean," + "org.apache.geronimo.gbean.annotation," + "org.apache.geronimo.gbean.runtime," + "org.apache.geronimo.kernel," + "org.apache.geronimo.kernel.basic," + "org.apache.geronimo.kernel.classloader," + "org.apache.geronimo.kernel.config," + "org.apache.geronimo.kernel.config.xstream," + "org.apache.geronimo.kernel.lifecycle," + "org.apache.geronimo.kernel.management," + "org.apache.geronimo.kernel.osgi," + "org.apache.geronimo.kernel.proxy," + "org.apache.geronimo.kernel.repository," + "org.apache.geronimo.kernel.rmi," + "org.apache.geronimo.kernel.util," + "org.apache.geronimo.system.configuration," + "org.apache.geronimo.system.configuration.cli," + "org.apache.geronimo.system.configuration.condition," + "org.apache.geronimo.system.jmx," + "org.apache.geronimo.system.logging," + "org.apache.geronimo.system.logging.log4j," + "org.apache.geronimo.system.main," + "org.apache.geronimo.system.plugin," + "org.apache.geronimo.system.plugin.model," + "org.apache.geronimo.system.properties," + "org.apache.geronimo.system.repository," + "org.apache.geronimo.system.resolver," + "org.apache.geronimo.system.serverinfo," + "org.apache.geronimo.system.threads," + "org.apache.geronimo.system.util," + "org.apache.geronimo.transformer," + "org.apache.geronimo.mavenplugins.car," + "org.apache.karaf.jaas.boot;version=\"2.2.1\"," + "org.apache.yoko," + "org.apache.yoko.osgi," + "org.apache.yoko.rmispec.util," + "org.apache.geronimo.hook" + extraPackages ); /* "org.apache.log4j;version=\"1.2.12\"," + "org.apache.log4j.helpers;version=\"1.2.12\"," + "org.apache.log4j.spi;version=\"1.2.12\"," + "org.apache.log4j.xml;version=\"1.2.12\"," + "org.codehaus.classworlds," + "org.codehaus.classworlds.realm," + "org.codehaus.plexus," + "org.codehaus.plexus.archiver," + "org.codehaus.plexus.archiver.jar," + "org.codehaus.plexus.archiver.tar," + "org.codehaus.plexus.archiver.util," + "org.codehaus.plexus.archiver.zip," + "org.codehaus.plexus.component," + "org.codehaus.plexus.component.annotations," + "org.codehaus.plexus.component.composition," + "org.codehaus.plexus.component.configurator," + "org.codehaus.plexus.component.configurator.converters," + "org.codehaus.plexus.component.configurator.expression," + "org.codehaus.plexus.component.discovery," + "org.codehaus.plexus.component.factory," + "org.codehaus.plexus.component.manager," + "org.codehaus.plexus.component.repository," + "org.codehaus.plexus.component.repository.exception," + "org.codehaus.plexus.component.repository.io," + "org.codehaus.plexus.configuration," + "org.codehaus.plexus.configuration.processor," + "org.codehaus.plexus.configuration.xml," + "org.codehaus.plexus.context," + "org.codehaus.plexus.embed," + "org.codehaus.plexus.lifecycle," + "org.codehaus.plexus.lifecycle.phase," + "org.codehaus.plexus.logging," + "org.codehaus.plexus.logging.console," + "org.codehaus.plexus.personality," + "org.codehaus.plexus.personality.plexus," + "org.codehaus.plexus.personality.plexus.lifecycle," + "org.codehaus.plexus.personality.plexus.lifecycle.phase," + "org.codehaus.plexus.util," + "org.codehaus.plexus.util.xml," + "org.apache.maven," + "org.apache.maven.plugin," + "org.apache.maven.lifecyle," + "org.apache.maven.shared," + "org.apache.maven.shared.filtering," + "com.thoughtworks.xstream," + "com.thoughtworks.xstream.alias," + "com.thoughtworks.xstream.converters," + "com.thoughtworks.xstream.converters.basic," + "com.thoughtworks.xstream.converters.reflection," + "com.thoughtworks.xstream.core," + "com.thoughtworks.xstream.io," + "com.thoughtworks.xstream.io.xml," + "com.thoughtworks.xstream.mapper," + "javax.management," + "javax.rmi.ssl," + "javax.xml.parsers," + "javax.xml.transform," + "net.sf.cglib.asm," + "net.sf.cglib.core," + "net.sf.cglib.proxy," + "net.sf.cglib.reflect," + "org.apache.xbean.recipe;version=\"3.6\"," + "org.objectweb.asm," + "org.objectweb.asm.commons," + "org.osgi.framework;version=\"1.4\"," + "org.slf4j;version=\"1.5.6\"," + "org.slf4j.impl;version=\"1.5.6\"," + "org.slf4j.bridge;version=\"1.5.6\"," + "org.w3c.dom," + "org.xml.sax," + "org.xml.sax.helpers," + "sun.misc," + "org.apache.xmlbeans," + "org.apache.xml.resolver," + "org.apache.commons.cli," + "javax.enterprise.deploy," + "javax.enterprise.deploy.model," + "javax.enterprise.deploy.shared," + "javax.enterprise.deploy.spi"); */ properties.put(Constants.FRAMEWORK_BOOTDELEGATION, "sun.*,com.sun.*"); File storageDir = new File(basedir, "target/bundle-cache"); properties.put(Constants.FRAMEWORK_STORAGE, storageDir.getAbsolutePath()); if (log.isDebugEnabled()) { properties.put("felix.log.level", "4"); } /* * A hack for Equinox to restore FrameworkProperties to the initial state. * If the FrameworkProperties is not restored to the initial state, Equinox * will create a separate classloader and load the Geronimo kernel classes * from deployed geronimo-kernel bundle instead of the system bundle. * That will result in ClassCastException. */ resetFrameworkProperties(); ServiceLoader<FrameworkFactory> loader = ServiceLoader.load(FrameworkFactory.class); Framework framework = loader.iterator().next().newFramework(properties); framework.start(); //enable mvn url handling // new org.ops4j.pax.url.mvn.internal.Activator().start(framework.getBundleContext()); //don't allow mvn urls if (systemProperties == null) { systemProperties = new HashMap<String, String>(); } systemProperties.put("geronimo.build.car", "true"); //Fix JIRA GERONIMO-5400 if (null == System.getProperty("openejb.log.factory")) { systemProperties.put("openejb.log.factory", "org.apache.openejb.util.PaxLogStreamFactory"); } systemProperties.put("karaf.startLocalConsole", "false"); systemProperties.put("openejb.geronimo", "true"); setSystemProperties(); return framework; } private static void resetFrameworkProperties() { try { Class clazz = Class.forName("org.eclipse.osgi.framework.internal.core.FrameworkProperties"); Field f = clazz.getDeclaredField("properties"); f.setAccessible(true); f.set(null, null); } catch (ClassNotFoundException e) { // ignore } catch (Throwable e) { e.printStackTrace(); } } }