You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2015/02/12 21:26:56 UTC

tomee git commit: TOMEE-1512 basic application composer plugin

Repository: tomee
Updated Branches:
  refs/heads/develop 55d733209 -> c325195e0


TOMEE-1512 basic application composer plugin


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/c325195e
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/c325195e
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/c325195e

Branch: refs/heads/develop
Commit: c325195e00d5d2228b4f3154803b77b4140bec11
Parents: 55d7332
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Thu Feb 12 21:26:29 2015 +0100
Committer: Romain Manni-Bucau <rm...@apache.org>
Committed: Thu Feb 12 21:26:29 2015 +0100

----------------------------------------------------------------------
 .../openejb/testing/ApplicationComposers.java   |  30 +++-
 maven/applicationcomposer-maven-plugin/pom.xml  |  67 ++++++++
 .../mojo/ApplicationComposerMojo.java           |  56 ++++++
 .../mojo/ApplicationComposerRunMojo.java        |  94 ++++++++++
 .../mojo/ApplicationComposerZipMojo.java        | 171 +++++++++++++++++++
 .../src/main/resources/bin/applicationcomposer  |  64 +++++++
 maven/pom.xml                                   |   1 +
 7 files changed, 474 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/c325195e/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java b/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java
index 43543e6..bb457ab 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java
@@ -92,15 +92,6 @@ import org.apache.xbean.finder.archive.FileArchive;
 import org.apache.xbean.finder.archive.JarArchive;
 import org.xml.sax.InputSource;
 
-import javax.annotation.PostConstruct;
-import javax.annotation.PreDestroy;
-import javax.enterprise.context.ConversationScoped;
-import javax.enterprise.context.RequestScoped;
-import javax.enterprise.context.SessionScoped;
-import javax.enterprise.inject.spi.Extension;
-import javax.inject.Inject;
-import javax.naming.Context;
-import javax.naming.InitialContext;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -122,6 +113,15 @@ import java.util.Map;
 import java.util.Properties;
 import java.util.concurrent.Callable;
 import java.util.concurrent.CountDownLatch;
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import javax.enterprise.context.ConversationScoped;
+import javax.enterprise.context.RequestScoped;
+import javax.enterprise.context.SessionScoped;
+import javax.enterprise.inject.spi.Extension;
+import javax.inject.Inject;
+import javax.naming.Context;
+import javax.naming.InitialContext;
 
 import static java.util.Arrays.asList;
 import static org.apache.openejb.config.DeploymentFilterable.DEPLOYMENTS_CLASSPATH_PROPERTY;
@@ -1391,4 +1391,16 @@ public final class ApplicationComposers {
             throw new OpenEJBRuntimeException(e);
         }
     }
+
+    public static void main(final String[] args) throws Exception {
+        if (args.length < 1) {
+            throw new IllegalArgumentException("provide at least application class as parameter");
+        }
+
+        final Class<?> c = Thread.currentThread().getContextClassLoader().loadClass(args[0]);
+
+        final List<String> a = new ArrayList<String>(asList(args));
+        a.remove(0);
+        run(c, a.toArray(new String[a.size()]));
+    }
 }

http://git-wip-us.apache.org/repos/asf/tomee/blob/c325195e/maven/applicationcomposer-maven-plugin/pom.xml
----------------------------------------------------------------------
diff --git a/maven/applicationcomposer-maven-plugin/pom.xml b/maven/applicationcomposer-maven-plugin/pom.xml
new file mode 100644
index 0000000..32e171b
--- /dev/null
+++ b/maven/applicationcomposer-maven-plugin/pom.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+      <artifactId>maven</artifactId>
+      <groupId>org.apache.openejb.maven</groupId>
+      <version>2.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>applicationcomposer-maven-plugin</artifactId>
+    <packaging>maven-plugin</packaging>
+    <version>5.0.0-SNAPSHOT</version>
+    <name>OpenEJB :: Maven Plugins :: ApplicationComposer Maven Plugin</name>
+
+    <dependencies>
+      <dependency>
+        <groupId>org.apache.maven</groupId>
+        <artifactId>maven-plugin-api</artifactId>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.maven</groupId>
+        <artifactId>maven-project</artifactId>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.openejb</groupId>
+        <artifactId>openejb-cxf-rs</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>${project.groupId}</groupId>
+        <artifactId>maven-util</artifactId>
+        <version>${project.parent.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.maven.plugin-tools</groupId>
+        <artifactId>maven-plugin-annotations</artifactId>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.maven</groupId>
+        <artifactId>maven-archiver</artifactId>
+        <version>2.5</version>
+      </dependency>
+    </dependencies>
+
+    <properties>
+      <maven-plugin.prefix>applicationcomposer</maven-plugin.prefix>
+    </properties>
+  </project>

http://git-wip-us.apache.org/repos/asf/tomee/blob/c325195e/maven/applicationcomposer-maven-plugin/src/main/java/org/apache/openejb/applicationcomposer/mojo/ApplicationComposerMojo.java
----------------------------------------------------------------------
diff --git a/maven/applicationcomposer-maven-plugin/src/main/java/org/apache/openejb/applicationcomposer/mojo/ApplicationComposerMojo.java b/maven/applicationcomposer-maven-plugin/src/main/java/org/apache/openejb/applicationcomposer/mojo/ApplicationComposerMojo.java
new file mode 100644
index 0000000..4586db9
--- /dev/null
+++ b/maven/applicationcomposer-maven-plugin/src/main/java/org/apache/openejb/applicationcomposer/mojo/ApplicationComposerMojo.java
@@ -0,0 +1,56 @@
+/**
+ * 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.openejb.applicationcomposer.mojo;
+
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.maven.project.MavenProject;
+import org.apache.openejb.core.ParentClassLoaderFinder;
+import org.apache.openejb.maven.util.MavenLogStreamFactory;
+
+import java.io.File;
+
+public abstract class ApplicationComposerMojo extends AbstractMojo {
+    @Parameter
+    protected String application;
+
+    @Parameter(defaultValue = "${project.build.outputDirectory}")
+    protected File binaries;
+
+    @Parameter(defaultValue = "${project}", readonly = true, required = true)
+    protected MavenProject project;
+
+    @Parameter(defaultValue = "true")
+    protected boolean mavenLog;
+
+    protected void setupLogs() {
+        if (mavenLog) {
+            MavenLogStreamFactory.setLogger(getLog());
+            System.setProperty("openejb.log.factory", MavenLogStreamFactory.class.getName());
+            System.setProperty("openejb.jul.forceReload", "true");
+        }
+    }
+
+    public static class LazyClassLoaderFinder implements ParentClassLoaderFinder {
+        protected static volatile ClassLoader loader;
+
+        @Override
+        public ClassLoader getParentClassLoader(ClassLoader fallback) {
+            return loader;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/tomee/blob/c325195e/maven/applicationcomposer-maven-plugin/src/main/java/org/apache/openejb/applicationcomposer/mojo/ApplicationComposerRunMojo.java
----------------------------------------------------------------------
diff --git a/maven/applicationcomposer-maven-plugin/src/main/java/org/apache/openejb/applicationcomposer/mojo/ApplicationComposerRunMojo.java b/maven/applicationcomposer-maven-plugin/src/main/java/org/apache/openejb/applicationcomposer/mojo/ApplicationComposerRunMojo.java
new file mode 100644
index 0000000..5d18770
--- /dev/null
+++ b/maven/applicationcomposer-maven-plugin/src/main/java/org/apache/openejb/applicationcomposer/mojo/ApplicationComposerRunMojo.java
@@ -0,0 +1,94 @@
+/**
+ * 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.openejb.applicationcomposer.mojo;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.openejb.core.ParentClassLoaderFinder;
+import org.apache.openejb.testing.ApplicationComposers;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+@Mojo(name = "run")
+public class ApplicationComposerRunMojo extends ApplicationComposerMojo {
+    @Parameter
+    private String[] args;
+
+    @Override
+    public void execute() throws MojoExecutionException, MojoFailureException {
+        if (application == null) {
+            getLog().error("You should specify <application>org.superbiz.MyApp</application>");
+            return;
+        }
+
+        setupLogs();
+
+        final Thread thread = Thread.currentThread();
+        final ClassLoader old = thread.getContextClassLoader();
+        final Collection<URL> depUrls = findDeps();
+        if (!depUrls.isEmpty()) {
+            try {
+                final ClassLoader loader = new URLClassLoader(new URL[]{binaries.toURI().toURL()}, old);
+                LazyClassLoaderFinder.loader = loader;
+                thread.setContextClassLoader(loader);
+            } catch (final MalformedURLException e) {
+                throw new IllegalArgumentException(e);
+            }
+        } else {
+            LazyClassLoaderFinder.loader = old;
+        }
+
+        // run do a reset of SystemInstance so we can't set it directly
+        System.setProperty(ParentClassLoaderFinder.class.getName(), LazyClassLoaderFinder.class.getName());
+
+        try {
+            ApplicationComposers.run(thread.getContextClassLoader().loadClass(application), args);
+        } catch (final ClassNotFoundException e) {
+            throw new IllegalArgumentException(e);
+        } finally {
+            thread.setContextClassLoader(old);
+        }
+    }
+
+    private Collection<URL> findDeps() {
+        final List<URL> urls = new ArrayList<>();
+        for (final Artifact artifact : (Set<Artifact>) project.getArtifacts()) {
+            try {
+                urls.add(artifact.getFile().toURI().toURL());
+            } catch (final MalformedURLException e) {
+                getLog().warn("can't use artifact " + artifact.toString());
+            }
+        }
+        if (binaries.exists()) {
+            try {
+                urls.add(binaries.toURI().toURL());
+            } catch (final MalformedURLException e) {
+                getLog().warn("can't use artifact " + binaries.getAbsolutePath());
+            }
+        }
+        return urls;
+    }
+}

http://git-wip-us.apache.org/repos/asf/tomee/blob/c325195e/maven/applicationcomposer-maven-plugin/src/main/java/org/apache/openejb/applicationcomposer/mojo/ApplicationComposerZipMojo.java
----------------------------------------------------------------------
diff --git a/maven/applicationcomposer-maven-plugin/src/main/java/org/apache/openejb/applicationcomposer/mojo/ApplicationComposerZipMojo.java b/maven/applicationcomposer-maven-plugin/src/main/java/org/apache/openejb/applicationcomposer/mojo/ApplicationComposerZipMojo.java
new file mode 100644
index 0000000..f461dac
--- /dev/null
+++ b/maven/applicationcomposer-maven-plugin/src/main/java/org/apache/openejb/applicationcomposer/mojo/ApplicationComposerZipMojo.java
@@ -0,0 +1,171 @@
+/**
+ * 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.openejb.applicationcomposer.mojo;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugins.annotations.Component;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.maven.project.MavenProjectHelper;
+import org.apache.openejb.loader.Files;
+import org.apache.openejb.loader.IO;
+import org.apache.openejb.util.URLs;
+import org.apache.xbean.finder.ClassLoaders;
+import org.codehaus.plexus.archiver.Archiver;
+import org.codehaus.plexus.archiver.zip.ZipArchiver;
+import org.codehaus.plexus.util.IOUtil;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Set;
+import java.util.jar.JarEntry;
+import java.util.jar.JarOutputStream;
+
+@Mojo(name = "zip")
+public class ApplicationComposerZipMojo extends ApplicationComposerMojo {
+    @Parameter(defaultValue = "${project.build.directory}/${project.build.finalName}-applicationcomposer")
+    protected File workDir;
+
+    @Parameter(defaultValue = "${project.build.directory}/${project.build.finalName}-applicationcomposer.zip")
+    protected File zip;
+
+    @Component(role = Archiver.class, hint = "zip")
+    private ZipArchiver archiver;
+
+    @Component
+    protected MavenProjectHelper projectHelper;
+
+    @Parameter(defaultValue = "true")
+    protected boolean attach;
+
+    @Parameter
+    protected String classifier;
+
+    @Override
+    public void execute() throws MojoExecutionException, MojoFailureException {
+        if (application == null) {
+            getLog().error("You should specify <application>org.superbiz.MyApp</application>");
+            return;
+        }
+
+        Files.mkdirs(workDir);
+
+        final File lib = Files.mkdirs(new File(workDir, "lib/"));
+        try { // container
+            for (final URL u : ClassLoaders.findUrls(ApplicationComposerZipMojo.class.getClassLoader())) {
+                final File file = URLs.toFile(u);
+                final String name = file.getName();
+                if (name.startsWith("doxia") || name.startsWith("maven") || name.startsWith("plexus")
+                        || name.startsWith("jcl-over-slf4j")) {
+                    continue;
+                }
+                try {
+                    final File to = new File(lib, file.getName());
+                    IO.copy(file, to);
+                } catch (final IOException e) {
+                    throw new MojoExecutionException(e.getMessage(), e);
+                }
+            }
+        } catch (final IOException e) {
+            throw new MojoExecutionException(e.getMessage(), e);
+        }
+
+        // app deps
+        for (final Artifact artifact : (Set<Artifact>) project.getArtifacts()) {
+            final File file = artifact.getFile();
+            try {
+                final File to = new File(lib, file.getName());
+                IO.copy(file, to);
+            } catch (final IOException e) {
+                throw new MojoExecutionException(e.getMessage(), e);
+            }
+        }
+
+        // apps bin
+        final File classes = Files.mkdirs(new File(workDir, "classes/"));
+        if (binaries.exists()) {
+            try {
+                IO.copy(binaries, classes);
+            } catch (final IOException e) {
+                throw new MojoExecutionException(e.getMessage(), e);
+            }
+        }
+
+        // scripts
+        final ClassLoader loader = Thread.currentThread().getContextClassLoader();
+        final File bin = Files.mkdirs(new File(workDir, "bin/"));
+        // TODO: .bat for windows
+        try {
+            final File to = new File(bin, "applicationcomposer");
+            IO.copy(loader.getResourceAsStream("bin/applicationcomposer"), to);
+            to.setExecutable(true);
+        } catch (final IOException e) {
+            throw new MojoExecutionException(e.getMessage(), e);
+        }
+        {
+            try {
+                final File environment = new File(bin, "environment");
+                final FileWriter writer = new FileWriter(environment);
+                writer.write("#! /bin/bash\n\nexport APPCOMPOSER_MAIN=" + application + "\n");
+                writer.close();
+                environment.setExecutable(true);
+            } catch (IOException e) {
+                throw new MojoExecutionException(e.getMessage(), e);
+            }
+        }
+
+        getLog().info("Created distribution in " + zip);
+
+        if (zip != null) {
+            getLog().info("Zipping distribution " + zip);
+            archiver.setDestFile(zip);
+            archiver.setIgnorePermissions(false);
+            archiver.addDirectory(workDir, zip.getName().replace(".zip", "") + '/');
+            try {
+                archiver.createArchive();
+            } catch (final IOException e) {
+                throw new MojoExecutionException(e.getMessage(), e);
+            }
+            if (attach) {
+                getLog().info("Attaching distribution " + zip);
+                if (classifier != null) {
+                    projectHelper.attachArtifact(project, "zip", classifier, zip);
+                } else {
+                    projectHelper.attachArtifact(project, "zip", zip);
+                }
+            }
+        }
+    }
+
+    private void addFile(final JarOutputStream os, final File source, final String key) throws IOException {
+        if (source.isDirectory()) {
+            os.putNextEntry(new JarEntry(key));
+            os.closeEntry();
+        } else {
+            os.putNextEntry(new JarEntry(key));
+            final FileInputStream input = new FileInputStream(source);
+            os.write(IOUtil.toByteArray(input));
+            input.close();
+            os.closeEntry();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/tomee/blob/c325195e/maven/applicationcomposer-maven-plugin/src/main/resources/bin/applicationcomposer
----------------------------------------------------------------------
diff --git a/maven/applicationcomposer-maven-plugin/src/main/resources/bin/applicationcomposer b/maven/applicationcomposer-maven-plugin/src/main/resources/bin/applicationcomposer
new file mode 100644
index 0000000..864f939
--- /dev/null
+++ b/maven/applicationcomposer-maven-plugin/src/main/resources/bin/applicationcomposer
@@ -0,0 +1,64 @@
+#! /bin/sh
+
+# 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.
+
+DEBUG=
+#DEBUG="-Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"
+
+cygwin=false
+darwin=false
+os400=false
+case "`uname`" in
+  CYGWIN*) cygwin=true;;
+  Darwin*) darwin=true;;
+esac
+
+if $cygwin; then
+  [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+  [ -n "$JRE_HOME" ] && JRE_HOME=`cygpath --unix "$JRE_HOME"`
+fi
+if $cygwin; then
+  JAVA_HOME=`cygpath --absolute --windows "$JAVA_HOME"`
+  JRE_HOME=`cygpath --absolute --windows "$JRE_HOME"`
+fi
+
+PRG="$0"
+while [ -h "$PRG" ]; do
+  ls=`ls -ld "$PRG"`
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    PRG="$link"
+  else
+    PRG=`dirname "$PRG"`/"$link"
+  fi
+done
+PRGDIR=`dirname "$PRG"`
+APPCOMPOSER_HOME=`cd "$PRGDIR/.." >/dev/null; pwd`
+
+if [ -d $JAVA_HOME ]; then
+  JAVA=$JAVA_HOME"/bin/java"
+else
+  JAVA="java"
+fi
+
+CP="$APPCOMPOSER_HOME/classes"
+for i in $APPCOMPOSER_HOME/lib/*.jar; do
+  CP="$CP:$i"
+done
+
+. "$APPCOMPOSER_HOME/bin/environment"
+
+$JAVA $DEBUG -Dopenejb.base="$APPCOMPOSER_HOME" -cp "$CP" org.apache.openejb.testing.ApplicationComposers $APPCOMPOSER_MAIN $*

http://git-wip-us.apache.org/repos/asf/tomee/blob/c325195e/maven/pom.xml
----------------------------------------------------------------------
diff --git a/maven/pom.xml b/maven/pom.xml
index 5f5af11..fcc8e0d 100644
--- a/maven/pom.xml
+++ b/maven/pom.xml
@@ -39,6 +39,7 @@
     <module>maven-util</module>
     <module>tomee-webapp-archetype</module>
     <module>jarstxt-maven-plugin</module>
+    <module>applicationcomposer-maven-plugin</module>
   </modules>
 
   <dependencyManagement>