Author: rmannibucau Date: Tue Oct 30 18:19:45 2012 New Revision: 1403811 URL: http://svn.apache.org/viewvc?rev=1403811&view=rev Log: TOMEE-510 shade mbean annotation api in openejb-api
Modified: openejb/trunk/openejb/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java openejb/trunk/openejb/container/openejb-api/pom.xml openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ReloadableEntityManagerFactory.java openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/monitoring/JMXContainer.java openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/monitoring/JMXDeployer.java openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/MBeanDeployer.java openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/DynamicMBeanWrapper.java openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/JMXBasicDataSource.java openejb/trunk/openejb/osgi/openejb-core-osgi/pom.xml Modified: openejb/trunk/openejb/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java?rev=1403811&r1=1403810&r2=1403811&view=diff ============================================================================== --- openejb/trunk/openejb/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java (original) +++ openejb/trunk/openejb/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java Tue Oct 30 18:19:45 2012 @@ -273,7 +273,7 @@ public abstract class TomEEContainer<Con final String name = file.getName(); folderFile = new File(file.getParentFile(), name.substring(0, name.length() - 4)); } - } while (file.exists() || folderFile.exists()); // we unpack the war/ear and the delete of "i" can fail (on win in particular) + } while (file.getParentFile().exists()); // we will delete the parent (to clean even complicated unpacking) if (!file.getParentFile().exists() && !file.getParentFile().mkdirs()) { LOGGER.warning("can't create " + file.getParent()); } Modified: openejb/trunk/openejb/container/openejb-api/pom.xml URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-api/pom.xml?rev=1403811&r1=1403810&r2=1403811&view=diff ============================================================================== --- openejb/trunk/openejb/container/openejb-api/pom.xml (original) +++ openejb/trunk/openejb/container/openejb-api/pom.xml Tue Oct 30 18:19:45 2012 @@ -32,11 +32,43 @@ <dependencies> <dependency> - <groupId>org.apache.geronimo.specs</groupId> - <artifactId>geronimo-jpa_2.0_spec</artifactId> - <version>1.1</version> - <scope>provided</scope> + <groupId>${project.groupId}</groupId> + <artifactId>mbean-annotation-api</artifactId> + <version>${project.version}</version> </dependency> </dependencies> -</project> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-shade-plugin</artifactId> + <version>2.0</version> + <executions> + <execution> + <phase>package</phase> + <goals> + <goal>shade</goal> + </goals> + <configuration> + <relocations> + <relocation> + <pattern>javax.management</pattern> + <shadedPattern>org.apache.openejb.api.jmx</shadedPattern> + <includes> + <include>javax.management.MBean</include> + <include>javax.management.Description</include> + <include>javax.management.ManagedAttribute</include> + <include>javax.management.ManagedOperation</include> + <include>javax.management.NotificationInfo</include> + <include>javax.management.NotificationInfos</include> + </includes> + </relocation> + </relocations> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> +</project> Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ReloadableEntityManagerFactory.java URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ReloadableEntityManagerFactory.java?rev=1403811&r1=1403810&r2=1403811&view=diff ============================================================================== --- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ReloadableEntityManagerFactory.java (original) +++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ReloadableEntityManagerFactory.java Tue Oct 30 18:19:45 2012 @@ -20,6 +20,10 @@ package org.apache.openejb.assembler.cla import org.apache.openejb.OpenEJBException; import org.apache.openejb.OpenEJBRuntimeException; import org.apache.openejb.api.internal.Internal; +import org.apache.openejb.api.jmx.Description; +import org.apache.openejb.api.jmx.MBean; +import org.apache.openejb.api.jmx.ManagedAttribute; +import org.apache.openejb.api.jmx.ManagedOperation; import org.apache.openejb.jee.JAXBContextFactory; import org.apache.openejb.jee.Persistence; import org.apache.openejb.jee.PersistenceUnitCaching; @@ -34,11 +38,7 @@ import org.apache.openejb.persistence.Qu import org.apache.openejb.util.LogCategory; import org.apache.openejb.util.Logger; -import javax.management.Description; -import javax.management.MBean; import javax.management.MBeanServer; -import javax.management.ManagedAttribute; -import javax.management.ManagedOperation; import javax.management.ObjectName; import javax.management.openmbean.CompositeData; import javax.management.openmbean.CompositeDataSupport; Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/monitoring/JMXContainer.java URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/monitoring/JMXContainer.java?rev=1403811&r1=1403810&r2=1403811&view=diff ============================================================================== --- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/monitoring/JMXContainer.java (original) +++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/monitoring/JMXContainer.java Tue Oct 30 18:19:45 2012 @@ -16,13 +16,14 @@ */ package org.apache.openejb.assembler.monitoring; -import java.util.Map; -import javax.management.Description; -import javax.management.ManagedAttribute; import org.apache.openejb.BeanContext; import org.apache.openejb.Container; +import org.apache.openejb.api.jmx.Description; +import org.apache.openejb.api.jmx.ManagedAttribute; import org.apache.openejb.assembler.classic.ContainerInfo; +import java.util.Map; + @Description("describe a container") public class JMXContainer { private final Container container; Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/monitoring/JMXDeployer.java URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/monitoring/JMXDeployer.java?rev=1403811&r1=1403810&r2=1403811&view=diff ============================================================================== --- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/monitoring/JMXDeployer.java (original) +++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/monitoring/JMXDeployer.java Tue Oct 30 18:19:45 2012 @@ -18,10 +18,10 @@ package org.apache.openejb.assembler.mon import java.util.Collection; import java.util.Properties; -import javax.management.Description; -import javax.management.MBean; -import javax.management.ManagedAttribute; -import javax.management.ManagedOperation; +import org.apache.openejb.api.jmx.Description; +import org.apache.openejb.api.jmx.MBean; +import org.apache.openejb.api.jmx.ManagedAttribute; +import org.apache.openejb.api.jmx.ManagedOperation; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/MBeanDeployer.java URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/MBeanDeployer.java?rev=1403811&r1=1403810&r2=1403811&view=diff ============================================================================== --- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/MBeanDeployer.java (original) +++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/MBeanDeployer.java Tue Oct 30 18:19:45 2012 @@ -23,9 +23,10 @@ import org.apache.xbean.finder.Annotated import org.apache.xbean.finder.AnnotationFinder; import org.apache.xbean.finder.IAnnotationFinder; -import javax.management.MBean; +import java.lang.annotation.Annotation; import java.net.URL; import java.util.ArrayList; +import java.util.Collection; import java.util.Iterator; import java.util.List; @@ -47,12 +48,16 @@ public class MBeanDeployer implements Dy cl = getClass().getClassLoader(); } } + + final Collection<Class<? extends Annotation>> mbeanClasses = new ArrayList<Class<? extends Annotation>>(2); + mbeanClasses.add(org.apache.openejb.api.jmx.MBean.class); + try { // for OSGi environment, javax.management is imported by the JRE - cl.loadClass("javax.management.MBean"); + mbeanClasses.add((Class<? extends Annotation>) cl.loadClass("javax.management.MBean")); } catch (NoClassDefFoundError noClassDefFoundError) { - return appModule; + // ignored } catch (ClassNotFoundException e) { - return appModule; + // ignored } // there is an ejbmodule by webapp so we should't need to go through the webapp @@ -62,15 +67,17 @@ public class MBeanDeployer implements Dy continue; } - for (Annotated<Class<?>> clazz : ejbModule.getFinder().findMetaAnnotatedClasses(MBean.class)) { - final Class<?> realClass = clazz.get(); - final String name = realClass.getName(); - if (done.contains(name)) { - continue; - } + for (Class<? extends Annotation> mclazz : mbeanClasses) { + for (Annotated<Class<?>> clazz : ejbModule.getFinder().findMetaAnnotatedClasses(mclazz)) { + final Class<?> realClass = clazz.get(); + final String name = realClass.getName(); + if (done.contains(name)) { + continue; + } - ejbModule.getMbeans().add(name); - done.add(name); + ejbModule.getMbeans().add(name); + done.add(name); + } } } for (ClientModule clientModule : appModule.getClientModules()) { @@ -78,13 +85,15 @@ public class MBeanDeployer implements Dy continue; } - for (Annotated<Class<?>> clazz : clientModule.getFinder().findMetaAnnotatedClasses(MBean.class)) { - final String name = clazz.get().getName(); - if (done.contains(name)) { - continue; - } + for (Class<? extends Annotation> mclazz : mbeanClasses) { + for (Annotated<Class<?>> clazz : clientModule.getFinder().findMetaAnnotatedClasses(mclazz)) { + final String name = clazz.get().getName(); + if (done.contains(name)) { + continue; + } - clientModule.getMbeans().add(name); + clientModule.getMbeans().add(name); + } } } @@ -101,13 +110,15 @@ public class MBeanDeployer implements Dy if (libs.size() > 0) { // force descriptor for additinal libs since it shouldn't occur often and can save some time final IAnnotationFinder finder = new AnnotationFinder(new ConfigurableClasspathArchive(appModule.getClassLoader(), true, libs)); - for (Annotated<Class<?>> clazz : finder.findMetaAnnotatedClasses(MBean.class)) { - final String name = clazz.get().getName(); - if (done.contains(name)) { - continue; - } + for (Class<? extends Annotation> mclazz : mbeanClasses) { + for (Annotated<Class<?>> clazz : finder.findMetaAnnotatedClasses(mclazz)) { + final String name = clazz.get().getName(); + if (done.contains(name)) { + continue; + } - appModule.getAdditionalLibMbeans().add(name); + appModule.getAdditionalLibMbeans().add(name); + } } } Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java?rev=1403811&r1=1403810&r2=1403811&view=diff ============================================================================== --- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java (original) +++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java Tue Oct 30 18:19:45 2012 @@ -853,7 +853,6 @@ public class StatefulContainer implement EntityManagerFactory entityManagerFactory = entry.getKey(); Map properties = entry.getValue(); - JtaEntityManagerRegistry.EntityManagerTracker entityManagerTracker = entityManagerRegistry.getInheritedEntityManager(entityManagerFactory); EntityManager entityManager; if (entityManagerTracker == null) { Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/DynamicMBeanWrapper.java URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/DynamicMBeanWrapper.java?rev=1403811&r1=1403810&r2=1403811&view=diff ============================================================================== --- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/DynamicMBeanWrapper.java (original) +++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/DynamicMBeanWrapper.java Tue Oct 30 18:19:45 2012 @@ -17,13 +17,18 @@ package org.apache.openejb.monitoring; import javassist.util.proxy.ProxyFactory; +import org.apache.openejb.api.jmx.Description; +import org.apache.openejb.api.jmx.MBean; +import org.apache.openejb.api.jmx.ManagedAttribute; +import org.apache.openejb.api.jmx.ManagedOperation; +import org.apache.openejb.api.jmx.NotificationInfo; +import org.apache.openejb.api.jmx.NotificationInfos; import org.apache.openejb.util.LogCategory; import org.apache.openejb.util.Logger; import javax.management.Attribute; import javax.management.AttributeList; import javax.management.AttributeNotFoundException; -import javax.management.Description; import javax.management.DynamicMBean; import javax.management.ImmutableDescriptor; import javax.management.IntrospectionException; @@ -33,14 +38,14 @@ import javax.management.MBeanException; import javax.management.MBeanInfo; import javax.management.MBeanNotificationInfo; import javax.management.MBeanOperationInfo; -import javax.management.ManagedAttribute; -import javax.management.ManagedOperation; -import javax.management.NotificationInfo; -import javax.management.NotificationInfos; import javax.management.ReflectionException; +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -50,6 +55,23 @@ import java.util.ResourceBundle; public class DynamicMBeanWrapper implements DynamicMBean { public static final Logger logger = Logger.getInstance(LogCategory.OPENEJB_DEPLOY, DynamicMBeanWrapper.class); + private static final Map<Class<?>, Class<? extends Annotation>> OPENEJB_API_TO_JAVAX = new HashMap<Class<?>, Class<? extends Annotation>>(); + static { + final ClassLoader loader = DynamicMBeanWrapper.class.getClassLoader(); + try { + OPENEJB_API_TO_JAVAX.put(MBean.class, (Class<? extends Annotation>) loader.loadClass("javax.management.MBean")); + OPENEJB_API_TO_JAVAX.put(Description.class, (Class<? extends Annotation>) loader.loadClass("javax.management.Description")); + OPENEJB_API_TO_JAVAX.put(ManagedOperation.class, (Class<? extends Annotation>) loader.loadClass("javax.management.ManagedOperation")); + OPENEJB_API_TO_JAVAX.put(ManagedAttribute.class, (Class<? extends Annotation>) loader.loadClass("javax.management.ManagedAttribute")); + OPENEJB_API_TO_JAVAX.put(NotificationInfo.class, (Class<? extends Annotation>) loader.loadClass("javax.management.NotificationInfo")); + OPENEJB_API_TO_JAVAX.put(NotificationInfos.class, (Class<? extends Annotation>) loader.loadClass("javax.management.NotificationInfos")); + } catch (ClassNotFoundException cnfe) { + // ignored + } catch (NoClassDefFoundError ncdfe) { + // ignored + } + } + private final MBeanInfo info; private final Map<String, Method> getters = new HashMap<String, Method>(); private final Map<String, Method> setters = new HashMap<String, Method>(); @@ -75,16 +97,16 @@ public class DynamicMBeanWrapper impleme instance = givenInstance; // class - Description classDescription = annotatedMBean.getAnnotation(Description.class); + Description classDescription = findAnnotation(annotatedMBean, Description.class); description = getDescription(classDescription, "a MBean built by OpenEJB"); - NotificationInfo notification = annotatedMBean.getAnnotation(NotificationInfo.class); + NotificationInfo notification = findAnnotation(annotatedMBean, NotificationInfo.class); if (notification != null) { MBeanNotificationInfo notificationInfo = getNotificationInfo(notification); notificationInfos.add(notificationInfo); } - NotificationInfos notifications = annotatedMBean.getAnnotation(NotificationInfos.class); + NotificationInfos notifications = findAnnotation(annotatedMBean, NotificationInfos.class); if (notifications != null && notifications.value() != null) { for (NotificationInfo n : notifications.value()) { MBeanNotificationInfo notificationInfo = getNotificationInfo(n); @@ -102,7 +124,7 @@ public class DynamicMBeanWrapper impleme continue; } - if (m.getAnnotation(ManagedAttribute.class) != null) { + if (findAnnotation(m, ManagedAttribute.class) != null) { String methodName = m.getName(); String attrName = methodName; if (((attrName.startsWith("get") && m.getParameterTypes().length == 0) @@ -123,11 +145,11 @@ public class DynamicMBeanWrapper impleme } else if (methodName.startsWith("set")) { setters.put(attrName, m); } - } else if (m.getAnnotation(ManagedOperation.class) != null) { + } else if (findAnnotation(m, ManagedOperation.class) != null) { operations.put(m.getName(), m); String operationDescr = ""; - Description descr = m.getAnnotation(Description.class); + Description descr = findAnnotation(m, Description.class); if (descr != null) { operationDescr = getDescription(descr, "-"); } @@ -141,7 +163,7 @@ public class DynamicMBeanWrapper impleme Method mtd = e.getValue(); String attrDescr = ""; - Description descr = mtd.getAnnotation(Description.class); + Description descr = findAnnotation(mtd, Description.class); if (descr != null) { attrDescr = getDescription(descr, "-"); } @@ -161,6 +183,58 @@ public class DynamicMBeanWrapper impleme notificationInfos.toArray(new MBeanNotificationInfo[notificationInfos.size()])); } + private <T extends Annotation> T findAnnotation(final Method method, final Class<T> searchedAnnotation) { + final T annotation = method.getAnnotation(searchedAnnotation); + if (annotation != null) { + return annotation; + } + + if (OPENEJB_API_TO_JAVAX.containsKey(searchedAnnotation)) { + final Class<? extends Annotation> clazz = OPENEJB_API_TO_JAVAX.get(searchedAnnotation); + final Object javaxAnnotation = method.getAnnotation(clazz); + if (javaxAnnotation != null) { + return annotationProxy(javaxAnnotation, searchedAnnotation); + } + } + return null; + } + + private <T extends Annotation> T findAnnotation(final Field field, final Class<T> searchedAnnotation) { + final T annotation = field.getAnnotation(searchedAnnotation); + if (annotation != null) { + return annotation; + } + + if (OPENEJB_API_TO_JAVAX.containsKey(searchedAnnotation)) { + final Class<? extends Annotation> clazz = OPENEJB_API_TO_JAVAX.get(searchedAnnotation); + final Object javaxAnnotation = field.getAnnotation(clazz); + if (javaxAnnotation != null) { + return annotationProxy(javaxAnnotation, searchedAnnotation); + } + } + return null; + } + + private <T extends Annotation> T findAnnotation(final Class<?> annotatedMBean, final Class<T> searchedAnnotation) { + final T annotation = annotatedMBean.getAnnotation(searchedAnnotation); + if (annotation != null) { + return annotation; + } + + if (OPENEJB_API_TO_JAVAX.containsKey(searchedAnnotation)) { + final Class<? extends Annotation> clazz = OPENEJB_API_TO_JAVAX.get(searchedAnnotation); + final Object javaxAnnotation = annotatedMBean.getAnnotation(clazz); + if (javaxAnnotation != null) { + return annotationProxy(javaxAnnotation, searchedAnnotation); + } + } + return null; + } + + private static <T extends Annotation> T annotationProxy(final Object javaxAnnotation, final Class<T> clazz) { + return (T) Proxy.newProxyInstance(DynamicMBeanWrapper.class.getClassLoader(), new Class<?>[]{clazz}, new AnnotationHandler(javaxAnnotation)); + } + private MBeanNotificationInfo getNotificationInfo(NotificationInfo n) { String description = getDescription(n.description(), "-"); return new MBeanNotificationInfo(n.types(), @@ -283,4 +357,41 @@ public class DynamicMBeanWrapper impleme } throw new MBeanException(new IllegalArgumentException(), actionName + " doesn't exist"); } + + private static class AnnotationHandler implements InvocationHandler { + private final Object delegate; + + public AnnotationHandler(final Object javaxAnnotation) { + delegate = javaxAnnotation; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + Object result = null; + for (Method mtd : delegate.getClass().getMethods()) { // simple heurisitc which should be enough + if (mtd.getName().equals(method.getName())) { + result = mtd.invoke(delegate, args); + break; + } + } + + if (result == null) { + return null; + } + + if (result.getClass().isArray()) { + final Object[] array = (Object[]) result; + if (array.length == 0 || !OPENEJB_API_TO_JAVAX.containsValue(array[0].getClass())) { + return array; + } + + final Object[] translated = new Object[array.length]; + for (int i = 0; i < translated.length; i++) { + translated[i] = annotationProxy(array[i], OPENEJB_API_TO_JAVAX.get(array[i].getClass())); + } + } + + return result; + } + } } Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/JMXBasicDataSource.java URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/JMXBasicDataSource.java?rev=1403811&r1=1403810&r2=1403811&view=diff ============================================================================== --- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/JMXBasicDataSource.java (original) +++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/JMXBasicDataSource.java Tue Oct 30 18:19:45 2012 @@ -19,10 +19,10 @@ package org.apache.openejb.resource.jdbc import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; -import javax.management.Description; +import org.apache.openejb.api.jmx.Description; import javax.management.MBeanServer; -import javax.management.ManagedAttribute; -import javax.management.ManagedOperation; +import org.apache.openejb.api.jmx.ManagedAttribute; +import org.apache.openejb.api.jmx.ManagedOperation; import javax.management.ObjectName; import org.apache.openejb.monitoring.DynamicMBeanWrapper; import org.apache.openejb.monitoring.LocalMBeanServer; Modified: openejb/trunk/openejb/osgi/openejb-core-osgi/pom.xml URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/osgi/openejb-core-osgi/pom.xml?rev=1403811&r1=1403810&r2=1403811&view=diff ============================================================================== --- openejb/trunk/openejb/osgi/openejb-core-osgi/pom.xml (original) +++ openejb/trunk/openejb/osgi/openejb-core-osgi/pom.xml Tue Oct 30 18:19:45 2012 @@ -356,6 +356,7 @@ '=META-INF.org^.apache^.openejb', org.apache.openejb;version=${openejb.osgi.export.version}, org.apache.openejb.api.internal;version=${openejb.osgi.export.version}, + org.apache.openejb.api.jmx;version=${openejb.osgi.export.version}, org.apache.openejb.async;version=${openejb.osgi.export.version}, org.apache.openejb.assembler;version=${openejb.osgi.export.version}, org.apache.openejb.assembler.classic;version=${openejb.osgi.export.version},