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>