You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by an...@apache.org on 2015/11/23 15:08:45 UTC

[8/9] tomee git commit: EOL

http://git-wip-us.apache.org/repos/asf/tomee/blob/5dd70c83/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java
----------------------------------------------------------------------
diff --git a/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java b/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java
index 2ebfbd9..2290e36 100644
--- a/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java
+++ b/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java
@@ -1,1363 +1,1363 @@
-/*
- * 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.maven.plugin;
-
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.factory.ArtifactFactory;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
-import org.apache.maven.artifact.repository.DefaultArtifactRepository;
-import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
-import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
-import org.apache.maven.artifact.resolver.ArtifactResolutionException;
-import org.apache.maven.artifact.resolver.ArtifactResolver;
-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.Parameter;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.settings.Settings;
-import org.apache.openejb.OpenEJBRuntimeException;
-import org.apache.openejb.config.RemoteServer;
-import org.apache.openejb.loader.Files;
-import org.apache.openejb.loader.IO;
-import org.apache.openejb.loader.Zips;
-import org.apache.openejb.maven.plugin.cli.Args;
-import org.apache.openejb.util.Join;
-import org.apache.openejb.util.NetworkUtil;
-import org.apache.openejb.util.OpenEjbVersion;
-import org.apache.tomee.util.QuickServerXmlParser;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.Closeable;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.FileWriter;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.Scanner;
-import java.util.concurrent.CountDownLatch;
-import java.util.logging.SimpleFormatter;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-
-import static org.apache.maven.artifact.Artifact.SCOPE_COMPILE;
-import static org.apache.maven.artifact.repository.ArtifactRepositoryPolicy.CHECKSUM_POLICY_WARN;
-import static org.apache.maven.artifact.repository.ArtifactRepositoryPolicy.UPDATE_POLICY_DAILY;
-import static org.apache.maven.artifact.repository.ArtifactRepositoryPolicy.UPDATE_POLICY_NEVER;
-import static org.apache.maven.artifact.versioning.VersionRange.createFromVersion;
-import static org.apache.openejb.util.JarExtractor.delete;
-import static org.codehaus.plexus.util.FileUtils.deleteDirectory;
-import static org.codehaus.plexus.util.IOUtil.close;
-import static org.codehaus.plexus.util.IOUtil.copy;
-
-public abstract class AbstractTomEEMojo extends AbstractAddressMojo {
-    // if we get let say > 5 patterns like it we should create a LocationAnalyzer
-    // for < 5 patterns it should be fine
-    private static final String NAME_STR = "?name=";
-    private static final String UNZIP_PREFIX = "unzip:";
-    private static final String REMOVE_PREFIX = "remove:";
-    public static final String QUIT_CMD = "quit";
-    public static final String EXIT_CMD = "exit";
-    public static final String TOM_EE = "TomEE";
-
-    @Component
-    protected ArtifactFactory factory;
-
-    @Component
-    protected ArtifactResolver resolver;
-
-    @Parameter(defaultValue = "${localRepository}", readonly = true)
-    protected ArtifactRepository local;
-
-    @Parameter(defaultValue = "${project.remoteArtifactRepositories}", readonly = true)
-    protected List<ArtifactRepository> remoteRepos;
-
-    @Parameter(property = "tomee-plugin.skipCurrentProject", defaultValue = "false")
-    protected boolean skipCurrentProject;
-
-    @Parameter(property = "tomee-plugin.version", defaultValue = "-1")
-    protected String tomeeVersion;
-
-    @Parameter(property = "tomee-plugin.groupId", defaultValue = "org.apache.openejb")
-    protected String tomeeGroupId;
-
-    @Parameter(property = "tomee-plugin.artifactId", defaultValue = "apache-tomee")
-    protected String tomeeArtifactId;
-
-    /**
-     * while tar.gz is not managed it is readonly
-     */
-    @Parameter(property = "tomee-plugin.type", defaultValue = "zip", readonly = true)
-    protected String tomeeType;
-
-    @Parameter(property = "tomee-plugin.apache-repos", defaultValue = "snapshots")
-    protected String apacheRepos;
-
-    @Parameter(property = "tomee-plugin.classifier", defaultValue = "webprofile")
-    protected String tomeeClassifier;
-
-    @Parameter(property = "tomee-plugin.shutdown", defaultValue = "8005")
-    protected int tomeeShutdownPort;
-
-    @Parameter(property = "tomee-plugin.shutdown.attempts", defaultValue = "60")
-    protected int tomeeShutdownAttempts;
-
-    @Parameter(property = "tomee-plugin.shutdown-command", defaultValue = "SHUTDOWN")
-    protected String tomeeShutdownCommand;
-
-    @Parameter(property = "tomee-plugin.ajp", defaultValue = "8009")
-    protected int tomeeAjpPort;
-
-    @Parameter(property = "tomee-plugin.https")
-    protected Integer tomeeHttpsPort;
-
-    @Parameter(property = "tomee-plugin.args")
-    protected String args;
-
-    @Parameter(property = "tomee-plugin.debug", defaultValue = "false")
-    protected boolean debug;
-
-    @Parameter(property = "tomee-plugin.simple-log", defaultValue = "false")
-    protected boolean simpleLog;
-
-    @Parameter(property = "tomee-plugin.debugPort", defaultValue = "5005")
-    protected int debugPort;
-
-    @Parameter(defaultValue = "${project.basedir}/src/main/webapp", property = "tomee-plugin.webappResources")
-    protected File webappResources;
-
-    @Parameter(defaultValue = "${project.build.outputDirectory}", property = "tomee-plugin.webappClasses")
-    protected File webappClasses;
-
-    @Parameter(defaultValue = "${project.build.directory}/apache-tomee", property = "tomee-plugin.catalina-base")
-    protected File catalinaBase;
-
-    /**
-     * rename the current artifact
-     */
-    @Parameter
-    protected String context;
-
-    /**
-     * relative to tomee.base.
-     */
-    @Parameter(defaultValue = "webapps")
-    protected String webappDir;
-
-    /**
-     * relative to tomee.base.
-     */
-    @Parameter(defaultValue = "apps")
-    protected String appDir;
-
-    /**
-     * relative to tomee.base.
-     */
-    @Parameter(defaultValue = "lib")
-    protected String libDir;
-
-    @Parameter(defaultValue = "${project.basedir}/src/main")
-    protected File mainDir;
-
-    @Parameter(defaultValue = "${project.build.directory}")
-    protected File target;
-
-    @Parameter(property = "tomee-plugin.conf", defaultValue = "${project.basedir}/src/main/tomee/conf")
-    protected File config;
-
-    @Parameter(property = "tomee-plugin.bin", defaultValue = "${project.basedir}/src/main/tomee/bin")
-    protected File bin;
-
-    @Parameter(property = "tomee-plugin.lib", defaultValue = "${project.basedir}/src/main/tomee/lib")
-    protected File lib;
-
-    @Parameter
-    protected Map<String, String> systemVariables;
-
-    @Parameter
-    private List<String> classpaths;
-
-    /**
-     * forcing nice default for war development (WEB-INF/classes and web resources)
-     */
-    @Parameter(property = "tomee-plugin.webappDefaultConfig", defaultValue = "false")
-    protected boolean webappDefaultConfig;
-
-    /**
-     * use a real random instead of secure random. saves few ms at startup.
-     */
-    @Parameter(property = "tomee-plugin.quick-session", defaultValue = "true")
-    protected boolean quickSession;
-
-    @Parameter
-    protected List<String> customizers;
-
-    @Parameter(defaultValue = "${project}", readonly = true, required = true)
-    protected MavenProject project;
-
-    /**
-     * force webapp to be reloadable
-     */
-    @Parameter(property = "tomee-plugin.force-reloadable", defaultValue = "false")
-    protected boolean forceReloadable;
-
-    /**
-     * supported formats:
-     * --> groupId:artifactId:version...
-     * --> unzip:groupId:artifactId:version...
-     * --> remove:prefix (often prefix = artifactId)
-     */
-    @Parameter
-    protected List<String> libs;
-
-    @Parameter
-    protected List<String> endorsedLibs;
-
-    @Parameter
-    protected List<String> javaagents;
-
-    @Parameter(property = "tomee-plugin.persist-javaagents", defaultValue = "false")
-    protected boolean persistJavaagents;
-
-    @Parameter
-    protected List<String> webapps;
-
-    @Parameter
-    protected List<String> apps;
-
-    @Parameter(property = "tomee-plugin.classes", defaultValue = "${project.build.outputDirectory}", readonly = true)
-    protected File classes;
-
-    @Parameter(defaultValue = "${project.build.directory}/${project.build.finalName}.${project.packaging}")
-    protected File warFile;
-
-    @Parameter(property = "tomee-plugin.remove-default-webapps", defaultValue = "true")
-    protected boolean removeDefaultWebapps;
-
-    @Parameter(property = "tomee-plugin.deploy-openejb-internal-application", defaultValue = "false")
-    protected boolean deployOpenEjbApplication;
-
-    @Parameter(property = "tomee-plugin.remove-tomee-webapps", defaultValue = "true")
-    protected boolean removeTomeeWebapp;
-
-    @Parameter(property = "tomee-plugin.ejb-remote", defaultValue = "true")
-    protected boolean ejbRemote;
-
-    @Parameter(defaultValue = "${project.packaging}", readonly = true)
-    protected String packaging;
-
-    @Parameter(property = "tomee-plugin.keep-server-xml", defaultValue = "false")
-    protected boolean keepServerXmlAsthis;
-
-    @Parameter(property = "tomee-plugin.check-started", defaultValue = "false")
-    protected boolean checkStarted;
-
-    @Parameter(property = "tomee-plugin.use-console", defaultValue = "true")
-    protected boolean useConsole;
-
-    @Parameter(property = "tomee-plugin.exiting", defaultValue = "false")
-    protected boolean tomeeAlreadyInstalled;
-
-    /**
-     * The current user system settings for use in Maven.
-     */
-    @Parameter(defaultValue = "${settings}", readonly = true)
-    protected Settings settings;
-
-    /**
-     * use openejb-standalone automatically instead of TomEE
-     */
-    @Parameter(property = "tomee-plugin.openejb", defaultValue = "false")
-    protected boolean useOpenEJB;
-
-    /**
-     * for TomEE and wars only, which docBase to use for this war.
-     */
-    @Parameter
-    protected List<File> docBases;
-
-    /**
-     * for TomEE and wars only, add some external repositories to classloader.
-     */
-    @Parameter
-    protected List<File> externalRepositories;
-
-    /**
-     * when you set docBases to src/main/webapp setting it to true will allow hot refresh.
-     */
-    @Parameter(property = "tomee-plugin.skipWarResources", defaultValue = "false")
-    protected boolean skipWarResources = false;
-
-    protected File deployedFile = null;
-    protected RemoteServer server = null;
-    protected String container = TOM_EE;
-
-    @Override
-    public void execute() throws MojoExecutionException, MojoFailureException {
-        fixConfig();
-
-        if ("-1".equals(tomeeVersion)) {
-            final String version = OpenEjbVersion.get().getVersion();
-            tomeeVersion = "1" + version.substring(1, version.length());
-        }
-
-        if (!tomeeAlreadyInstalled) {
-            final Collection<String> existingWebapps; // added before using the plugin with maven dependency plugin or sthg like that
-            if (removeDefaultWebapps) {
-                existingWebapps = webappsAlreadyAdded();
-            } else {
-                existingWebapps = Collections.emptyList();
-            }
-
-            unzip(resolve());
-            if (removeDefaultWebapps) { // do it first to let add other war
-                removeDefaultWebapps(removeTomeeWebapp, existingWebapps);
-            }
-            copyLibs(libs, new File(catalinaBase, libDir), "jar");
-            copyLibs(endorsedLibs, new File(catalinaBase, "endorsed"), "jar");
-            copyLibs(webapps, new File(catalinaBase, webappDir), "war");
-            copyLibs(apps, new File(catalinaBase, appDir), "jar");
-            overrideConf(config, "conf");
-            overrideConf(lib, "lib");
-            final Collection<File> copied = overrideConf(bin, "bin");
-
-            for (final File copy : copied) {
-                if (copy.getName().endsWith(".bat") || copy.getName().endsWith(".sh")) {
-                    if (!copy.setExecutable(true)) {
-                        getLog().warn("can't make " + copy.getPath() + " executable");
-                    }
-                }
-            }
-
-            if (classpaths == null) { // NPE protection for activateSimpleLog() and run()
-                classpaths = new ArrayList<String>();
-            }
-            if (simpleLog) {
-                activateSimpleLog();
-            }
-
-            if (!keepServerXmlAsthis) {
-                overrideAddresses();
-            }
-            if (!skipCurrentProject) {
-                copyWar();
-            }
-
-            if (customizers != null) {
-                final Thread thread = Thread.currentThread();
-                final ClassLoader currentLoader = thread.getContextClassLoader();
-                final ClassLoader tccl = createClassLoader(currentLoader);
-                thread.setContextClassLoader(tccl);
-                try {
-                    // a customizer is a Runnable with or without a constructor taking a File as parameter (catalina base)
-                    // one goal is to avoid coupling as much as possible with this plugin
-                    //
-                    // if really needed we could introduce a Customizer interface but then it has more impacts on your packaging/config
-                    for (final String customizer : customizers) {
-                        try {
-                            final Class<?> clazz = tccl.loadClass(customizer);
-                            try {
-                                final Constructor<?> cons = clazz.getConstructor(File.class);
-                                Runnable.class.cast(cons.newInstance(catalinaBase)).run();
-                            } catch (final NoSuchMethodException e) {
-                                try {
-                                    Runnable.class.cast(clazz.newInstance()).run();
-                                } catch (final Exception e1) {
-                                    throw new MojoExecutionException("can't create customizer: " + currentLoader, e);
-                                }
-                            }
-                        } catch (final ClassNotFoundException e) {
-                            throw new MojoExecutionException("can't find customizer: " + currentLoader, e);
-                        } catch (final InvocationTargetException e) {
-                            throw new MojoExecutionException("can't create customizer: " + currentLoader, e);
-                        } catch (final InstantiationException e) {
-                            throw new MojoExecutionException("can't create customizer: " + currentLoader, e);
-                        } catch (final IllegalAccessException e) {
-                            throw new MojoExecutionException("can't create customizer: " + currentLoader, e);
-                        }
-                    }
-                } finally {
-                    try {
-                        if (tccl != null && Closeable.class.isInstance(tccl)) {
-                            Closeable.class.cast(tccl).close();
-                        }
-                    } catch (final IOException e) {
-                        // no-op
-                    }
-                    thread.setContextClassLoader(currentLoader);
-                }
-            }
-        }
-
-        run();
-    }
-
-    @SuppressWarnings("unchecked")
-    private ClassLoader createClassLoader(final ClassLoader parent) {
-        final List<URL> urls = new ArrayList<URL>();
-        for (final Artifact artifact : (Collection<Artifact>) project.getArtifacts()) {
-            try {
-                urls.add(artifact.getFile().toURI().toURL());
-            } catch (final MalformedURLException e) {
-                getLog().warn("can't use artifact " + artifact.toString());
-            }
-        }
-        if (classes != null && classes.exists()) {
-            try {
-                urls.add(classes.toURI().toURL());
-            } catch (final MalformedURLException e) {
-                getLog().warn("can't use path " + classes.getAbsolutePath());
-            }
-        }
-        return new URLClassLoader(urls.toArray(new URL[urls.size()]), parent);
-    }
-
-    protected void fixConfig() {
-        if (useOpenEJB) {
-            tomeeGroupId = "org.apache.openejb";
-            tomeeArtifactId = "openejb-standalone";
-            tomeeClassifier = null;
-            tomeeShutdownCommand = "Q";
-            if (8005 == tomeeShutdownPort) { // default admin port
-                tomeeShutdownPort = 4200;
-            }
-            if (tomeeVersion.startsWith("1.")) {
-                tomeeVersion = OpenEjbVersion.get().getVersion();
-            }
-
-            if (catalinaBase.getName().equals("apache-tomee") && catalinaBase.getParentFile().equals(target)) {
-                catalinaBase = new File(target, "apache-openejb");
-            }
-            if (config.getParentFile().getName().equals("tomee") && config.getParentFile().getParentFile().equals(mainDir)) {
-                config = new File(mainDir, "openejb/conf");
-            }
-            if (lib.getParentFile().getName().equals("tomee") && lib.getParentFile().getParentFile().equals(mainDir)) {
-                lib = new File(mainDir, "openejb/lib");
-            }
-            if (bin.getParentFile().getName().equals("tomee") && bin.getParentFile().getParentFile().equals(mainDir)) {
-                bin = new File(mainDir, "openejb/bin");
-            }
-        }
-    }
-
-    protected String getAdditionalClasspath() {
-        if (!classpaths.isEmpty()) {
-            final StringBuilder cpBuilder = new StringBuilder();
-            for (final String cp : classpaths) {
-                cpBuilder.append(cp);
-                cpBuilder.append(File.pathSeparatorChar);
-            }
-            return cpBuilder.substring(0, cpBuilder.length() - 1); // Dump the final path separator
-        }
-        return null;
-    }
-
-    private List<String> webappsAlreadyAdded() {
-        final List<String> list = new ArrayList<String>();
-        final File webapps = new File(catalinaBase, webappDir);
-        if (webapps.exists() && webapps.isDirectory()) {
-            final File[] files = webapps.listFiles();
-            if (files != null) {
-                for (final File f : files) {
-                    list.add(f.getName());
-                }
-            }
-        }
-        return list;
-    }
-
-    private void activateSimpleLog() {
-        // replacing java.util.logging.SimpleFormatter by SimpleTomEEFormatter
-        final File loggingProperties = new File(catalinaBase, "conf/logging.properties");
-        if (loggingProperties.exists() && !new File(config, "conf/logging.properties").exists()) {
-            try {
-                String content = IO.slurp(loggingProperties);
-                if (!content.contains("java.util.logging.ConsoleHandler.formatter")) {
-                    content += System.getProperty("line.separator") + "java.util.logging.ConsoleHandler.formatter = org.apache.tomee.jul.formatter.SimpleTomEEFormatter";
-                } else {
-                    content = content.replace(SimpleFormatter.class.getName(), "org.apache.tomee.jul.formatter.SimpleTomEEFormatter");
-                }
-
-                doWrite(loggingProperties, content);
-            } catch (final Exception e) {
-                getLog().error("Can't set SimpleTomEEFormatter", e);
-            }
-        }
-    }
-
-    private void removeDefaultWebapps(final boolean removeTomee, final Collection<String> providedWebapps) {
-        final File webapps = new File(catalinaBase, webappDir);
-        if (webapps.isDirectory()) {
-            final File[] files = webapps.listFiles();
-            if (null != files) {
-                for (final File webapp : files) {
-                    final String name = webapp.getName();
-                    if (webapp.isDirectory() && !providedWebapps.contains(name) && (removeTomee || !name.equals("tomee"))) {
-                        try {
-                            deleteDirectory(webapp);
-                        } catch (final IOException ignored) {
-                            // no-op
-                        }
-                    }
-                }
-            }
-        }
-
-        getLog().info("Removed not mandatory default webapps");
-    }
-
-    private void copyLibs(final List<String> files, final File destParent, final String defaultType) {
-        if (files == null || files.isEmpty()) {
-            return;
-        }
-
-        if (!destParent.exists() && !destParent.mkdirs()) {
-            getLog().warn("can't create '" + destParent.getPath() + "'");
-        }
-
-        for (final String file : files) {
-            updateLib(file, destParent, defaultType);
-        }
-    }
-
-    private void updateLib(final String rawLib, final File destParent, final String defaultType) {
-        InputStream is = null;
-        OutputStream os = null;
-
-        // special hook to get more info
-        String lib = rawLib;
-        String extractedName = null;
-        if (lib.contains(NAME_STR)) {
-            lib = lib.substring(0, rawLib.indexOf(NAME_STR));
-            extractedName = rawLib.substring(rawLib.indexOf(NAME_STR) + NAME_STR.length(), rawLib.length());
-            if (!extractedName.endsWith(".jar") && !extractedName.endsWith(".war")
-                    && !extractedName.endsWith(".ear") && !extractedName.endsWith(".rar")) {
-                extractedName = extractedName + "." + defaultType;
-            }
-        }
-
-        boolean unzip = false;
-        if (lib.startsWith(UNZIP_PREFIX)) {
-            lib = lib.substring(UNZIP_PREFIX.length());
-            unzip = true;
-        }
-
-        if (lib.startsWith(REMOVE_PREFIX)) {
-            final String prefix = lib.substring(REMOVE_PREFIX.length());
-            final File[] files = destParent.listFiles(new FilenameFilter() {
-                @Override
-                public boolean accept(final File dir, final String name) {
-                    return name.startsWith(prefix);
-                }
-            });
-            if (files != null) {
-                for (final File file : files) {
-                    if (!IO.delete(file)) {
-                        file.deleteOnExit();
-                    }
-                    getLog().info("Deleted " + file.getPath());
-                }
-            }
-        } else {
-            try {
-                final File file = mvnToFile(lib, defaultType);
-                if (!unzip) {
-                    final File dest;
-                    if (extractedName == null) {
-                        dest = new File(destParent, file.getName());
-                    } else {
-                        dest = new File(destParent, extractedName);
-                    }
-
-                    is = new BufferedInputStream(new FileInputStream(file));
-                    os = new BufferedOutputStream(new FileOutputStream(dest));
-                    copy(is, os);
-
-                    getLog().info("Copied '" + lib + "' in '" + dest.getAbsolutePath());
-                } else {
-                    Zips.unzip(file, destParent, true);
-
-                    getLog().info("Unzipped '" + lib + "' in '" + destParent.getAbsolutePath());
-                }
-            } catch (final Exception e) {
-                getLog().error(e.getMessage(), e);
-                throw new TomEEException(e.getMessage(), e);
-            } finally {
-                close(is);
-                close(os);
-            }
-        }
-    }
-
-    private File mvnToFile(final String lib, final String defaultType) throws ArtifactResolutionException, ArtifactNotFoundException {
-        final String[] infos = lib.split(":");
-        final String classifier;
-        final String type;
-        if (infos.length < 3) {
-            throw new TomEEException("format for librairies should be <groupId>:<artifactId>:<version>[:<type>[:<classifier>]]");
-        }
-        if (infos.length >= 4) {
-            type = infos[3];
-        } else {
-            type = defaultType;
-        }
-        if (infos.length == 5) {
-            classifier = infos[4];
-        } else {
-            classifier = null;
-        }
-
-        final Artifact artifact = factory.createDependencyArtifact(infos[0], infos[1], createFromVersion(infos[2]), type, classifier, SCOPE_COMPILE);
-        resolver.resolve(artifact, remoteRepos, local);
-        return artifact.getFile();
-    }
-
-    private void copyWar() {
-        if ("pom".equals(packaging)) {
-            return;
-        }
-
-        final boolean war = "war".equals(packaging);
-        final String name = destinationName();
-        final File out;
-        if (war) {
-            out = new File(catalinaBase, webappDir + "/" + name);
-        } else {
-            final File parent = new File(catalinaBase, appDir);
-            if (!parent.exists() && !parent.mkdirs()) {
-                getLog().warn("can't create '" + parent.getPath() + "'");
-            }
-            out = new File(parent, name);
-        }
-        delete(out);
-        if (!warFile.isDirectory() && name.endsWith("." + packaging)) {
-            final String dir = name.substring(0, name.lastIndexOf('.'));
-            final File unpacked;
-            if (war) {
-                unpacked = new File(catalinaBase, webappDir + "/" + dir);
-            } else {
-                unpacked = new File(catalinaBase, appDir + "/" + dir);
-            }
-            delete(unpacked);
-        }
-
-        if (warFile.exists() && warFile.isDirectory()) {
-            try {
-                IO.copyDirectory(warFile, out);
-            } catch (final IOException e) {
-                throw new TomEEException(e.getMessage(), e);
-            }
-        } else if (warFile.exists()) {
-            InputStream is = null;
-            OutputStream os = null;
-            try {
-                is = new FileInputStream(warFile);
-                os = new FileOutputStream(out);
-                copy(is, os);
-
-                getLog().info("Installed '" + warFile.getAbsolutePath() + "' in " + out.getAbsolutePath());
-            } catch (final Exception e) {
-                throw new TomEEException(e.getMessage(), e);
-            } finally {
-                close(is);
-                close(os);
-            }
-        } else {
-            getLog().warn("'" + warFile + "' doesn't exist, ignoring (maybe run mvn package before this plugin)");
-        }
-
-        deployedFile = out;
-    }
-
-    protected String destinationName() {
-        if (context != null) {
-            if (!context.contains(".") && !warFile.isDirectory()) {
-                return context + "." + packaging;
-            }
-            return context;
-        }
-        return warFile.getName();
-    }
-
-    private void overrideAddresses() {
-        final File serverXml = new File(catalinaBase, "conf/server.xml");
-        if (!serverXml.exists()) { // openejb
-            return;
-        }
-
-        final QuickServerXmlParser parser = QuickServerXmlParser.parse(serverXml);
-
-        String value = read(serverXml);
-
-        File keystoreFile = new File(parser.keystore());
-
-        if (!keystoreFile.exists()) {
-            keystoreFile = new File(System.getProperty("user.home"), ".keystore");
-        }
-
-        if (!keystoreFile.exists()) {
-            keystoreFile = new File("target", ".keystore");
-        }
-
-        final String keystoreFilePath = (keystoreFile.exists() ? keystoreFile.getAbsolutePath() : "");
-
-
-        if (tomeeHttpsPort != null && tomeeHttpsPort > 0 && parser.value("HTTPS", null) == null) {
-            // ensure connector is not commented
-            value = value.replace("<Service name=\"Catalina\">", "<Service name=\"Catalina\">\n"
-                    + "    <Connector port=\"" + tomeeHttpsPort + "\" protocol=\"HTTP/1.1\" SSLEnabled=\"true\"\n" +
-                    "                scheme=\"https\" secure=\"true\"\n" +
-                    "                clientAuth=\"false\" sslProtocol=\"TLS\" keystoreFile=\"" + keystoreFilePath + "\" />\n");
-        }
-
-        if (tomeeHttpsPort == null) {
-            // avoid NPE
-            tomeeHttpsPort = 8443;
-        }
-
-        FileWriter writer = null;
-        try {
-            writer = new FileWriter(serverXml);
-            writer.write(value
-                    .replace(parser.http(), Integer.toString(this.getTomeeHttpPortChecked()))
-                    .replace(parser.https(), Integer.toString(this.getTomeeHttpsPortChecked()))
-                    .replace(parser.ajp(), Integer.toString(tomeeAjpPort))
-                    .replace(parser.stop(), Integer.toString(this.getTomeeShutdownPortChecked()))
-                    .replace(parser.host(), tomeeHost)
-                    .replace(parser.appBase(), webappDir));
-        } catch (final IOException e) {
-            throw new TomEEException(e.getMessage(), e);
-        } finally {
-            close(writer);
-        }
-    }
-
-    private static String read(final File file) {
-        FileInputStream in = null;
-        try {
-            in = new FileInputStream(file);
-            final StringBuilder sb = new StringBuilder();
-            int i = in.read();
-            while (i != -1) {
-                sb.append((char) i);
-                i = in.read();
-            }
-            return sb.toString();
-        } catch (final Exception e) {
-            throw new TomEEException(e.getMessage(), e);
-        } finally {
-            close(in);
-        }
-    }
-
-    private Collection<File> overrideConf(final File dir, final String baseDir) {
-        if (!dir.exists()) {
-            return Collections.emptyList();
-        }
-
-        final File[] files = dir.listFiles();
-        if (files != null) {
-            final Collection<File> copied = new ArrayList<File>();
-            for (final File f : files) {
-                if (f.isHidden()) {
-                    continue;
-                }
-
-                final String file = baseDir + "/" + f.getName();
-                final File destination = new File(catalinaBase, file);
-                if (f.isDirectory()) {
-                    Files.mkdirs(destination);
-                    try {
-                        IO.copyDirectory(f, destination);
-                    } catch (final IOException e) {
-                        throw new TomEEException(e.getMessage(), e);
-                    }
-                } else {
-                    InputStream in = null;
-                    OutputStream out = null;
-                    try {
-                        in = new FileInputStream(f);
-                        out = new FileOutputStream(destination);
-                        copy(in, out);
-
-                        copied.add(f);
-                        getLog().info("Override '" + file + "'");
-                    } catch (final Exception e) {
-                        throw new TomEEException(e.getMessage(), e);
-                    } finally {
-                        close(in);
-                        close(out);
-                    }
-                }
-            }
-
-            return copied;
-        }
-
-        return Collections.emptyList();
-    }
-
-    protected void run() {
-        if (classpaths == null) { // NPE protection when execute is skipped and mojo delegates to run directly
-            classpaths = new ArrayList<String>();
-        }
-
-        final List<String> strings = generateJVMArgs();
-
-        // init env for RemoteServer
-        System.setProperty("openejb.home", catalinaBase.getAbsolutePath());
-        if (debug) {
-            System.setProperty("openejb.server.debug", "true");
-            System.setProperty("server.debug.port", Integer.toString(debugPort));
-        }
-        System.setProperty("server.shutdown.port", Integer.toString(this.getTomeeShutdownPortChecked()));
-        System.setProperty("server.shutdown.command", tomeeShutdownCommand);
-
-        server = new RemoteServer(getConnectAttempts(), debug);
-        server.setAdditionalClasspath(getAdditionalClasspath());
-
-        addShutdownHooks(server); // some shutdown hooks are always added (see UpdatableTomEEMojo)
-
-        if (TOM_EE.equals(container)) {
-
-            server.setPortStartup(this.getTomeeHttpPortChecked());
-
-            getLog().info("Running '" + getClass().getName().replace("TomEEMojo", "").toLowerCase(Locale.ENGLISH)
-                    + "'. Configured TomEE in plugin is " + tomeeHost + ":" + this.getTomeeHttpPortChecked()
-                    + " (plugin shutdown port is " + this.getTomeeShutdownPortChecked() + " and https port is " + this.getTomeeHttpsPortChecked() + ")");
-        } else {
-            getLog().info("Running '" + getClass().getSimpleName().replace("TomEEMojo", "").toLowerCase(Locale.ENGLISH));
-        }
-
-        final InputStream originalIn = System.in; // piped when starting resmote server so saving it
-
-        serverCmd(server, strings);
-
-        if (getWaitTomEE()) {
-            final CountDownLatch stopCondition = new CountDownLatch(1);
-            Runtime.getRuntime().addShutdownHook(new Thread() {
-                @Override
-                public void run() {
-                    stopServer(stopCondition);
-                }
-            });
-
-            if (useConsole) {
-                final Scanner reader = new Scanner(originalIn);
-
-                System.out.flush();
-                getLog().info("Waiting for command: " + availableCommands());
-
-                String line;
-                while ((line = getNextLine(reader)) != null) {
-
-                    if (isQuit(line)) {
-                        break;
-                    }
-
-                    if ("ignore".equals(line)) {
-                        continue;
-                    }
-
-                    if (!handleLine(line.trim())) {
-                        System.out.flush();
-                        getLog().warn("Command '" + line + "' not understood. Use one of " + availableCommands());
-                    }
-                }
-
-                reader.close();
-                stopServer(stopCondition); // better than using shutdown hook since it doesn't rely on the hook which are not sent by eclipse for instance
-            }
-
-            try {
-                stopCondition.await();
-            } catch (final InterruptedException e) {
-                // no-op
-            }
-        }
-    }
-
-    private synchronized int getTomeeHttpPortChecked() {
-        if (this.tomeeHttpPort <= 0) {
-            this.tomeeHttpPort = NetworkUtil.getNextAvailablePort();
-        }
-        return this.tomeeHttpPort;
-    }
-
-    private synchronized int getTomeeHttpsPortChecked() {
-        if (this.tomeeHttpsPort <= 0) {
-            this.tomeeHttpsPort = NetworkUtil.getNextAvailablePort();
-        }
-        return this.tomeeHttpsPort;
-    }
-
-    private synchronized int getTomeeShutdownPortChecked() {
-        if (this.tomeeShutdownPort <= 0) {
-            this.tomeeShutdownPort = NetworkUtil.getNextAvailablePort();
-        }
-        return this.tomeeShutdownPort;
-    }
-
-    private String getNextLine(final Scanner reader) {
-        try {
-            return reader.nextLine();
-        } catch (final NoSuchElementException e) {
-            return "ignore";
-        }
-    }
-
-    protected List<String> generateJVMArgs() {
-        final String deployOpenEjbAppKey = "openejb.system.apps";
-        final String servletCompliance = "org.apache.catalina.STRICT_SERVLET_COMPLIANCE";
-
-        boolean deactivateStrictServletCompliance = args == null || !args.contains(servletCompliance);
-
-        final List<String> strings = new ArrayList<String>();
-        if (systemVariables != null) {
-            for (final Map.Entry<String, String> entry : systemVariables.entrySet()) {
-                final String key = entry.getKey();
-                if (servletCompliance.equals(key)) {
-                    deactivateStrictServletCompliance = false;
-                }
-
-                final String value = entry.getValue();
-                if (value == null) {
-                    strings.add("-D" + key);
-                } else if (value.contains(" ")) {
-                    strings.add(String.format("'-D%s=%s'", key, value));
-                } else {
-                    strings.add(String.format("-D%s=%s", key, value));
-                }
-
-                if (deployOpenEjbAppKey.equals(key)) {
-                    deployOpenEjbApplication = true;
-                }
-            }
-        }
-
-        if (webappDefaultConfig) {
-            forceDefaultForNiceWebAppDevelopment();
-        }
-
-        if (deactivateStrictServletCompliance) {
-            strings.add("-D" + servletCompliance + "=false");
-        }
-        if (quickSession) {
-            strings.add("-Dopenejb.session.manager=org.apache.tomee.catalina.session.QuickSessionManager");
-        }
-        if (removeTomeeWebapp && ejbRemote) { // if we have tomee webapp no need to activate ejb remote support this way
-            strings.add("-Dtomee.remote.support=true");
-        }
-        if (!deployOpenEjbApplication) { // true is the default so don't need to set the property
-            if (args == null || !args.contains("-D" + deployOpenEjbAppKey)) {
-                strings.add("-D" + deployOpenEjbAppKey + "=false");
-            }
-        }
-        if (args != null) {
-            strings.addAll(Args.parse(args));
-        }
-        if (javaagents != null) {
-            addJavaagents(strings);
-        }
-
-        if (forceReloadable) {
-            strings.add("-Dtomee.force-reloadable=true");
-        }
-
-        if (!getWaitTomEE()) {
-            strings.add("-Dtomee.noshutdownhook=true");
-        }
-
-        String appName = null; // computed lazily
-        if (docBases != null && !docBases.isEmpty()) {
-            if ("war".equals(packaging)) {
-                appName = destinationName().replace(".war", "");
-                if (appName.startsWith("/")) {
-                    appName = appName.substring(1);
-                }
-                strings.add("-Dtomee." + appName + ".docBases=" + filesToString(docBases));
-                strings.add("-Dtomee." + appName + ".docBases.cache=false"); // doesn't work for dev if activated
-            } else {
-                getLog().warn("docBases parameter only valid for a war");
-            }
-        }
-
-        if (externalRepositories != null && !externalRepositories.isEmpty()) {
-            if ("war".equals(packaging)) {
-                appName = appName == null ? destinationName().replace(".war", "") : appName;
-                if (appName.startsWith("/")) {
-                    appName = appName.substring(1);
-                }
-                strings.add("-Dtomee." + appName + ".externalRepositories=" + filesToString(externalRepositories));
-            } else {
-                getLog().warn("externalRepositories parameter only valid for a war");
-            }
-        }
-
-        if (skipWarResources) {
-            strings.add("-Dtomee.skip-war-resources=" + skipWarResources);
-        }
-
-        return strings;
-    }
-
-    private void addJavaagents(final List<String> strings) {
-        final String existingJavaagent = "\\\"-javaagent:$CATALINA_HOME/lib/openejb-javaagent.jar\\\"";
-        final StringBuilder javaagentString = new StringBuilder(existingJavaagent);
-
-        for (final String rawJavaagent : javaagents) {
-            final String javaagent;
-            final String args;
-            int argsIdx = rawJavaagent.indexOf('=');
-            if (argsIdx < 0) {
-                argsIdx = rawJavaagent.indexOf('?');
-            }
-            if (argsIdx > 0) {
-                javaagent = rawJavaagent.substring(0, argsIdx);
-                args = rawJavaagent.substring(argsIdx);
-            } else {
-                javaagent = rawJavaagent;
-                args = "";
-            }
-
-            String path = javaagent;
-            if (!new File(javaagent).isFile()) {
-                try {
-                    final File jar = mvnToFile(javaagent, "jar");
-                    if (persistJavaagents) {
-                        final File javaagentFolder = new File(catalinaBase, "javaagent");
-                        Files.mkdirs(javaagentFolder);
-                        final String name = jar.getName();
-                        path = "$CATALINA_HOME/javaagent/" + name;
-                        IO.copy(jar, new File(javaagentFolder, name));
-                    }
-                    strings.add("-javaagent:" + jar.getAbsolutePath() + args);
-                } catch (final Exception e) {
-                    getLog().warn("Can't find " + javaagent);
-                    strings.add("-javaagent:" + javaagent);
-                }
-            } else {
-                strings.add("-javaagent:" + javaagent);
-            }
-
-            if (persistJavaagents) {
-                javaagentString.append(" -javaagent:").append(path).append(args);
-            }
-        }
-
-        if (persistJavaagents) {
-            try {
-                {
-                    final File catalinaSh = new File(catalinaBase, "bin/catalina.sh");
-                    final String content = IO.slurp(catalinaSh).replace(existingJavaagent, javaagentString.toString());
-                    doWrite(catalinaSh, content);
-                }
-                {
-                    final File catalinaBat = new File(catalinaBase, "bin/catalina.bat");
-                    final String content = IO.slurp(catalinaBat)
-                            .replace(
-                                    "\"-javaagent:%CATALINA_HOME%\\lib\\openejb-javaagent.jar\"",
-                                    javaagentString.toString()
-                                            .replace('\'', '"')
-                                            .replace('/', '\\')
-                                            .replace("$CATALINA_HOME", "%CATALINA_HOME%"));
-
-                    doWrite(catalinaBat, content);
-                }
-            } catch (final IOException ioe) {
-                throw new OpenEJBRuntimeException(ioe);
-            }
-        }
-    }
-
-    private void forceDefaultForNiceWebAppDevelopment() {
-        if (!deployOpenEjbApplication) {
-            getLog().info("Forcing deployOpenEjbApplication=true to be able to type 'reload[ENTER]' when classes are updated");
-            deployOpenEjbApplication = true;
-        }
-        if (!forceReloadable) {
-            getLog().info("Forcing forceReloadable=true to be able to type 'reload[ENTER]' when classes are updated");
-            forceReloadable = true;
-        }
-        if (!skipWarResources) {
-            getLog().info("Forcing skipWarResources=true to be able to refresh resources with F5");
-            skipWarResources = true;
-        }
-        if (docBases == null) {
-            docBases = new ArrayList<File>();
-        }
-        if (docBases.isEmpty() && webappResources.exists()) {
-            getLog().info("adding " + webappResources.toString() + " docBase");
-            docBases.add(webappResources);
-        }
-        if (externalRepositories == null) {
-            externalRepositories = new ArrayList<File>();
-        }
-        if (externalRepositories.isEmpty() && webappClasses.exists()) {
-            getLog().info("adding " + webappClasses.toString() + " externalRepository");
-            externalRepositories.add(webappClasses);
-        }
-    }
-
-    private static String filesToString(final Collection<File> files) {
-        final Collection<String> paths = new ArrayList<String>(files.size());
-        for (final File path : files) { // don't use relative paths (toString())
-            paths.add(path.getAbsolutePath());
-        }
-        return Join.join(",", paths);
-    }
-
-    protected Collection<String> availableCommands() {
-        return Arrays.asList(QUIT_CMD, EXIT_CMD);
-    }
-
-    protected synchronized void stopServer(final CountDownLatch stopCondition) {
-        if (server == null) {
-            return;
-        }
-
-        try {
-            server.stop();
-        } catch (final Exception e) {
-            // no-op
-        }
-        try {
-            server.getServer().waitFor();
-            getLog().info(container + " stopped");
-        } catch (final Exception e) {
-            getLog().error("Can't stop " + container, e);
-        }
-
-        server = null;
-        stopCondition.countDown();
-    }
-
-    private static boolean isQuit(String line) {
-        if (QUIT_CMD.equalsIgnoreCase(line) || EXIT_CMD.equalsIgnoreCase(line)) {
-            return true;
-        }
-
-        //http://youtrack.jetbrains.com/issue/IDEA-94826
-        line = new StringBuilder(line).reverse().toString();
-
-        return QUIT_CMD.equalsIgnoreCase(line) || EXIT_CMD.equalsIgnoreCase(line);
-    }
-
-    protected boolean handleLine(final String line) {
-        return false;
-    }
-
-    protected void serverCmd(final RemoteServer server, final List<String> strings) {
-
-        final Process p = this.server.getServer();
-
-        if (null == p) {
-
-            try {
-                server.start(strings, getCmd(), checkStarted);
-            } catch (final Exception e) {
-                //TODO - Optional server.destroy() call
-                getLog().warn("Failed to check or track server startup on port: " + this.getTomeeHttpPortChecked());
-            }
-        }
-
-    }
-
-    protected void addShutdownHooks(final RemoteServer server) {
-        // no-op
-    }
-
-    protected int getConnectAttempts() {
-        return (tomeeShutdownAttempts == 0 ? 60 : tomeeShutdownAttempts);
-    }
-
-    protected boolean getWaitTomEE() {
-        return true;
-    }
-
-    private File resolve() {
-        if (!settings.isOffline()) {
-            try {
-                if ("snapshots".equals(apacheRepos) || "true".equals(apacheRepos)) {
-                    remoteRepos.add(new DefaultArtifactRepository("apache", "https://repository.apache.org/content/repositories/snapshots/",
-                            new DefaultRepositoryLayout(),
-                            new ArtifactRepositoryPolicy(true, UPDATE_POLICY_DAILY, CHECKSUM_POLICY_WARN),
-                            new ArtifactRepositoryPolicy(false, UPDATE_POLICY_NEVER, CHECKSUM_POLICY_WARN)));
-                } else {
-                    try {
-                        new URI(apacheRepos); // to check it is a uri
-                        remoteRepos.add(new DefaultArtifactRepository("additional-repo-tomee-mvn-plugin", apacheRepos,
-                                new DefaultRepositoryLayout(),
-                                new ArtifactRepositoryPolicy(true, UPDATE_POLICY_DAILY, CHECKSUM_POLICY_WARN),
-                                new ArtifactRepositoryPolicy(true, UPDATE_POLICY_NEVER, CHECKSUM_POLICY_WARN)));
-                    } catch (final URISyntaxException e) {
-                        // ignored, use classical repos
-                    }
-                }
-            } catch (final UnsupportedOperationException uoe) {
-                // can happen if remoterepos is unmodifiable (possible in complex builds)
-                // no-op
-            }
-        } else if (remoteRepos != null && remoteRepos.isEmpty()) {
-            remoteRepos = new ArrayList<ArtifactRepository>();
-        }
-
-        if ((tomeeClassifier != null && (tomeeClassifier.isEmpty() || tomeeClassifier.equals("ignore")))
-                || ("org.apache.openejb".equals(tomeeGroupId) && "openejb-standalone".equals(tomeeArtifactId))) {
-            tomeeClassifier = null;
-        }
-
-        try {
-            final Artifact artifact = factory.createDependencyArtifact(tomeeGroupId, tomeeArtifactId, createFromVersion(tomeeVersion), tomeeType, tomeeClassifier, SCOPE_COMPILE);
-            resolver.resolve(artifact, remoteRepos, local);
-            return artifact.getFile();
-        } catch (final Exception e) {
-            getLog().error(e.getMessage(), e);
-            throw new TomEEException(e.getMessage(), e);
-        }
-    }
-
-    private void unzip(final File mvnTomEE) {
-        ZipFile in = null;
-        try {
-            in = new ZipFile(mvnTomEE);
-
-            final Enumeration<? extends ZipEntry> entries = in.entries();
-            while (entries.hasMoreElements()) {
-                final ZipEntry entry = entries.nextElement();
-                String name = entry.getName();
-                int idx = name.indexOf("/");
-                if (idx < 0) {
-                    idx = name.indexOf(File.separator);
-                }
-                if (idx < 0) {
-                    continue;
-                }
-                name = name.substring(idx + 1);
-                final File dest = new File(catalinaBase.getAbsolutePath(), name);
-                if (!dest.exists()) {
-                    final File parent = dest.getParentFile();
-                    if ((!parent.exists() && !parent.mkdirs())
-                            || (!parent.canWrite() && !parent.setWritable(true))
-                            || (!parent.canRead() && !parent.setReadable(true))) {
-                        throw new RuntimeException("Failed to create or set permissions on: " + parent);
-                    }
-                }
-                if (entry.isDirectory()) {
-                    if (!dest.exists() && !dest.mkdir()) {
-                        throw new RuntimeException("Failed to create: " + dest);
-                    }
-                } else {
-                    final FileOutputStream fos = new FileOutputStream(dest);
-                    try {
-                        copy(in.getInputStream(entry), fos);
-                    } catch (final IOException e) {
-                        // ignored
-                    }
-                    close(fos);
-
-                    if (!dest.canRead() && !dest.setReadable(true)) {
-                        throw new RuntimeException("Failed to set readable on: " + dest);
-                    }
-                    if (dest.getName().endsWith(".sh")) {
-                        if (!dest.canExecute() && !dest.setExecutable(true)) {
-                            throw new RuntimeException("Failed to set executable on: " + dest);
-                        }
-                    }
-                }
-            }
-
-            File file = new File(catalinaBase, "conf/tomee.xml");
-            if (file.exists()) {
-                container = TOM_EE;
-            } else {
-                container = "OpenEJB";
-                file = new File(catalinaBase, "conf/openejb.xml");
-                if (file.exists()) {
-                    webappDir = "apps";
-                }
-            }
-
-            ensureAppsFolderExistAndIsConfiguredByDefault(file);
-
-            getLog().info(container + " was unzipped in '" + catalinaBase.getAbsolutePath() + "'");
-        } catch (final Exception e) {
-            throw new TomEEException(e.getMessage(), e);
-        } finally {
-            if (in != null) {
-                try {
-                    in.close();
-                } catch (final IOException e) {
-                    // no-op
-                }
-            }
-        }
-    }
-
-    private void ensureAppsFolderExistAndIsConfiguredByDefault(final File file) throws IOException {
-        if ("openejb".equals(container.toLowerCase(Locale.ENGLISH))
-                || (file.exists()
-                && (
-                (apps != null && !apps.isEmpty())
-                        || (!"pom".equals(packaging) && !"war".equals(packaging))))) { // webapps doesn't need apps folder in tomee
-            final FileWriter writer = new FileWriter(file);
-            final String rootTag = container.toLowerCase(Locale.ENGLISH);
-            writer.write("<?xml version=\"1.0\"?>\n" +
-                    "<" + rootTag + ">\n" +
-                    "  <Deployments dir=\"apps\" />\n" +
-                    "</" + rootTag + ">\n");
-            writer.close();
-
-            final File appsFolder = new File(catalinaBase, "apps");
-            if (!appsFolder.exists() && !appsFolder.mkdirs()) {
-                throw new RuntimeException("Failed to create: " + appsFolder);
-            }
-        }
-    }
-
-    private static void doWrite(final File file, final String content) throws IOException {
-        final FileWriter writer = new FileWriter(file);
-        try {
-            writer.write(content);
-        } finally {
-            IO.close(writer);
-        }
-    }
-
-    public abstract String getCmd();
-}
+/*
+ * 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.maven.plugin;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.factory.ArtifactFactory;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
+import org.apache.maven.artifact.repository.DefaultArtifactRepository;
+import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
+import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
+import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import org.apache.maven.artifact.resolver.ArtifactResolver;
+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.Parameter;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.settings.Settings;
+import org.apache.openejb.OpenEJBRuntimeException;
+import org.apache.openejb.config.RemoteServer;
+import org.apache.openejb.loader.Files;
+import org.apache.openejb.loader.IO;
+import org.apache.openejb.loader.Zips;
+import org.apache.openejb.maven.plugin.cli.Args;
+import org.apache.openejb.util.Join;
+import org.apache.openejb.util.NetworkUtil;
+import org.apache.openejb.util.OpenEjbVersion;
+import org.apache.tomee.util.QuickServerXmlParser;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.Closeable;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Scanner;
+import java.util.concurrent.CountDownLatch;
+import java.util.logging.SimpleFormatter;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import static org.apache.maven.artifact.Artifact.SCOPE_COMPILE;
+import static org.apache.maven.artifact.repository.ArtifactRepositoryPolicy.CHECKSUM_POLICY_WARN;
+import static org.apache.maven.artifact.repository.ArtifactRepositoryPolicy.UPDATE_POLICY_DAILY;
+import static org.apache.maven.artifact.repository.ArtifactRepositoryPolicy.UPDATE_POLICY_NEVER;
+import static org.apache.maven.artifact.versioning.VersionRange.createFromVersion;
+import static org.apache.openejb.util.JarExtractor.delete;
+import static org.codehaus.plexus.util.FileUtils.deleteDirectory;
+import static org.codehaus.plexus.util.IOUtil.close;
+import static org.codehaus.plexus.util.IOUtil.copy;
+
+public abstract class AbstractTomEEMojo extends AbstractAddressMojo {
+    // if we get let say > 5 patterns like it we should create a LocationAnalyzer
+    // for < 5 patterns it should be fine
+    private static final String NAME_STR = "?name=";
+    private static final String UNZIP_PREFIX = "unzip:";
+    private static final String REMOVE_PREFIX = "remove:";
+    public static final String QUIT_CMD = "quit";
+    public static final String EXIT_CMD = "exit";
+    public static final String TOM_EE = "TomEE";
+
+    @Component
+    protected ArtifactFactory factory;
+
+    @Component
+    protected ArtifactResolver resolver;
+
+    @Parameter(defaultValue = "${localRepository}", readonly = true)
+    protected ArtifactRepository local;
+
+    @Parameter(defaultValue = "${project.remoteArtifactRepositories}", readonly = true)
+    protected List<ArtifactRepository> remoteRepos;
+
+    @Parameter(property = "tomee-plugin.skipCurrentProject", defaultValue = "false")
+    protected boolean skipCurrentProject;
+
+    @Parameter(property = "tomee-plugin.version", defaultValue = "-1")
+    protected String tomeeVersion;
+
+    @Parameter(property = "tomee-plugin.groupId", defaultValue = "org.apache.openejb")
+    protected String tomeeGroupId;
+
+    @Parameter(property = "tomee-plugin.artifactId", defaultValue = "apache-tomee")
+    protected String tomeeArtifactId;
+
+    /**
+     * while tar.gz is not managed it is readonly
+     */
+    @Parameter(property = "tomee-plugin.type", defaultValue = "zip", readonly = true)
+    protected String tomeeType;
+
+    @Parameter(property = "tomee-plugin.apache-repos", defaultValue = "snapshots")
+    protected String apacheRepos;
+
+    @Parameter(property = "tomee-plugin.classifier", defaultValue = "webprofile")
+    protected String tomeeClassifier;
+
+    @Parameter(property = "tomee-plugin.shutdown", defaultValue = "8005")
+    protected int tomeeShutdownPort;
+
+    @Parameter(property = "tomee-plugin.shutdown.attempts", defaultValue = "60")
+    protected int tomeeShutdownAttempts;
+
+    @Parameter(property = "tomee-plugin.shutdown-command", defaultValue = "SHUTDOWN")
+    protected String tomeeShutdownCommand;
+
+    @Parameter(property = "tomee-plugin.ajp", defaultValue = "8009")
+    protected int tomeeAjpPort;
+
+    @Parameter(property = "tomee-plugin.https")
+    protected Integer tomeeHttpsPort;
+
+    @Parameter(property = "tomee-plugin.args")
+    protected String args;
+
+    @Parameter(property = "tomee-plugin.debug", defaultValue = "false")
+    protected boolean debug;
+
+    @Parameter(property = "tomee-plugin.simple-log", defaultValue = "false")
+    protected boolean simpleLog;
+
+    @Parameter(property = "tomee-plugin.debugPort", defaultValue = "5005")
+    protected int debugPort;
+
+    @Parameter(defaultValue = "${project.basedir}/src/main/webapp", property = "tomee-plugin.webappResources")
+    protected File webappResources;
+
+    @Parameter(defaultValue = "${project.build.outputDirectory}", property = "tomee-plugin.webappClasses")
+    protected File webappClasses;
+
+    @Parameter(defaultValue = "${project.build.directory}/apache-tomee", property = "tomee-plugin.catalina-base")
+    protected File catalinaBase;
+
+    /**
+     * rename the current artifact
+     */
+    @Parameter
+    protected String context;
+
+    /**
+     * relative to tomee.base.
+     */
+    @Parameter(defaultValue = "webapps")
+    protected String webappDir;
+
+    /**
+     * relative to tomee.base.
+     */
+    @Parameter(defaultValue = "apps")
+    protected String appDir;
+
+    /**
+     * relative to tomee.base.
+     */
+    @Parameter(defaultValue = "lib")
+    protected String libDir;
+
+    @Parameter(defaultValue = "${project.basedir}/src/main")
+    protected File mainDir;
+
+    @Parameter(defaultValue = "${project.build.directory}")
+    protected File target;
+
+    @Parameter(property = "tomee-plugin.conf", defaultValue = "${project.basedir}/src/main/tomee/conf")
+    protected File config;
+
+    @Parameter(property = "tomee-plugin.bin", defaultValue = "${project.basedir}/src/main/tomee/bin")
+    protected File bin;
+
+    @Parameter(property = "tomee-plugin.lib", defaultValue = "${project.basedir}/src/main/tomee/lib")
+    protected File lib;
+
+    @Parameter
+    protected Map<String, String> systemVariables;
+
+    @Parameter
+    private List<String> classpaths;
+
+    /**
+     * forcing nice default for war development (WEB-INF/classes and web resources)
+     */
+    @Parameter(property = "tomee-plugin.webappDefaultConfig", defaultValue = "false")
+    protected boolean webappDefaultConfig;
+
+    /**
+     * use a real random instead of secure random. saves few ms at startup.
+     */
+    @Parameter(property = "tomee-plugin.quick-session", defaultValue = "true")
+    protected boolean quickSession;
+
+    @Parameter
+    protected List<String> customizers;
+
+    @Parameter(defaultValue = "${project}", readonly = true, required = true)
+    protected MavenProject project;
+
+    /**
+     * force webapp to be reloadable
+     */
+    @Parameter(property = "tomee-plugin.force-reloadable", defaultValue = "false")
+    protected boolean forceReloadable;
+
+    /**
+     * supported formats:
+     * --> groupId:artifactId:version...
+     * --> unzip:groupId:artifactId:version...
+     * --> remove:prefix (often prefix = artifactId)
+     */
+    @Parameter
+    protected List<String> libs;
+
+    @Parameter
+    protected List<String> endorsedLibs;
+
+    @Parameter
+    protected List<String> javaagents;
+
+    @Parameter(property = "tomee-plugin.persist-javaagents", defaultValue = "false")
+    protected boolean persistJavaagents;
+
+    @Parameter
+    protected List<String> webapps;
+
+    @Parameter
+    protected List<String> apps;
+
+    @Parameter(property = "tomee-plugin.classes", defaultValue = "${project.build.outputDirectory}", readonly = true)
+    protected File classes;
+
+    @Parameter(defaultValue = "${project.build.directory}/${project.build.finalName}.${project.packaging}")
+    protected File warFile;
+
+    @Parameter(property = "tomee-plugin.remove-default-webapps", defaultValue = "true")
+    protected boolean removeDefaultWebapps;
+
+    @Parameter(property = "tomee-plugin.deploy-openejb-internal-application", defaultValue = "false")
+    protected boolean deployOpenEjbApplication;
+
+    @Parameter(property = "tomee-plugin.remove-tomee-webapps", defaultValue = "true")
+    protected boolean removeTomeeWebapp;
+
+    @Parameter(property = "tomee-plugin.ejb-remote", defaultValue = "true")
+    protected boolean ejbRemote;
+
+    @Parameter(defaultValue = "${project.packaging}", readonly = true)
+    protected String packaging;
+
+    @Parameter(property = "tomee-plugin.keep-server-xml", defaultValue = "false")
+    protected boolean keepServerXmlAsthis;
+
+    @Parameter(property = "tomee-plugin.check-started", defaultValue = "false")
+    protected boolean checkStarted;
+
+    @Parameter(property = "tomee-plugin.use-console", defaultValue = "true")
+    protected boolean useConsole;
+
+    @Parameter(property = "tomee-plugin.exiting", defaultValue = "false")
+    protected boolean tomeeAlreadyInstalled;
+
+    /**
+     * The current user system settings for use in Maven.
+     */
+    @Parameter(defaultValue = "${settings}", readonly = true)
+    protected Settings settings;
+
+    /**
+     * use openejb-standalone automatically instead of TomEE
+     */
+    @Parameter(property = "tomee-plugin.openejb", defaultValue = "false")
+    protected boolean useOpenEJB;
+
+    /**
+     * for TomEE and wars only, which docBase to use for this war.
+     */
+    @Parameter
+    protected List<File> docBases;
+
+    /**
+     * for TomEE and wars only, add some external repositories to classloader.
+     */
+    @Parameter
+    protected List<File> externalRepositories;
+
+    /**
+     * when you set docBases to src/main/webapp setting it to true will allow hot refresh.
+     */
+    @Parameter(property = "tomee-plugin.skipWarResources", defaultValue = "false")
+    protected boolean skipWarResources = false;
+
+    protected File deployedFile = null;
+    protected RemoteServer server = null;
+    protected String container = TOM_EE;
+
+    @Override
+    public void execute() throws MojoExecutionException, MojoFailureException {
+        fixConfig();
+
+        if ("-1".equals(tomeeVersion)) {
+            final String version = OpenEjbVersion.get().getVersion();
+            tomeeVersion = "1" + version.substring(1, version.length());
+        }
+
+        if (!tomeeAlreadyInstalled) {
+            final Collection<String> existingWebapps; // added before using the plugin with maven dependency plugin or sthg like that
+            if (removeDefaultWebapps) {
+                existingWebapps = webappsAlreadyAdded();
+            } else {
+                existingWebapps = Collections.emptyList();
+            }
+
+            unzip(resolve());
+            if (removeDefaultWebapps) { // do it first to let add other war
+                removeDefaultWebapps(removeTomeeWebapp, existingWebapps);
+            }
+            copyLibs(libs, new File(catalinaBase, libDir), "jar");
+            copyLibs(endorsedLibs, new File(catalinaBase, "endorsed"), "jar");
+            copyLibs(webapps, new File(catalinaBase, webappDir), "war");
+            copyLibs(apps, new File(catalinaBase, appDir), "jar");
+            overrideConf(config, "conf");
+            overrideConf(lib, "lib");
+            final Collection<File> copied = overrideConf(bin, "bin");
+
+            for (final File copy : copied) {
+                if (copy.getName().endsWith(".bat") || copy.getName().endsWith(".sh")) {
+                    if (!copy.setExecutable(true)) {
+                        getLog().warn("can't make " + copy.getPath() + " executable");
+                    }
+                }
+            }
+
+            if (classpaths == null) { // NPE protection for activateSimpleLog() and run()
+                classpaths = new ArrayList<String>();
+            }
+            if (simpleLog) {
+                activateSimpleLog();
+            }
+
+            if (!keepServerXmlAsthis) {
+                overrideAddresses();
+            }
+            if (!skipCurrentProject) {
+                copyWar();
+            }
+
+            if (customizers != null) {
+                final Thread thread = Thread.currentThread();
+                final ClassLoader currentLoader = thread.getContextClassLoader();
+                final ClassLoader tccl = createClassLoader(currentLoader);
+                thread.setContextClassLoader(tccl);
+                try {
+                    // a customizer is a Runnable with or without a constructor taking a File as parameter (catalina base)
+                    // one goal is to avoid coupling as much as possible with this plugin
+                    //
+                    // if really needed we could introduce a Customizer interface but then it has more impacts on your packaging/config
+                    for (final String customizer : customizers) {
+                        try {
+                            final Class<?> clazz = tccl.loadClass(customizer);
+                            try {
+                                final Constructor<?> cons = clazz.getConstructor(File.class);
+                                Runnable.class.cast(cons.newInstance(catalinaBase)).run();
+                            } catch (final NoSuchMethodException e) {
+                                try {
+                                    Runnable.class.cast(clazz.newInstance()).run();
+                                } catch (final Exception e1) {
+                                    throw new MojoExecutionException("can't create customizer: " + currentLoader, e);
+                                }
+                            }
+                        } catch (final ClassNotFoundException e) {
+                            throw new MojoExecutionException("can't find customizer: " + currentLoader, e);
+                        } catch (final InvocationTargetException e) {
+                            throw new MojoExecutionException("can't create customizer: " + currentLoader, e);
+                        } catch (final InstantiationException e) {
+                            throw new MojoExecutionException("can't create customizer: " + currentLoader, e);
+                        } catch (final IllegalAccessException e) {
+                            throw new MojoExecutionException("can't create customizer: " + currentLoader, e);
+                        }
+                    }
+                } finally {
+                    try {
+                        if (tccl != null && Closeable.class.isInstance(tccl)) {
+                            Closeable.class.cast(tccl).close();
+                        }
+                    } catch (final IOException e) {
+                        // no-op
+                    }
+                    thread.setContextClassLoader(currentLoader);
+                }
+            }
+        }
+
+        run();
+    }
+
+    @SuppressWarnings("unchecked")
+    private ClassLoader createClassLoader(final ClassLoader parent) {
+        final List<URL> urls = new ArrayList<URL>();
+        for (final Artifact artifact : (Collection<Artifact>) project.getArtifacts()) {
+            try {
+                urls.add(artifact.getFile().toURI().toURL());
+            } catch (final MalformedURLException e) {
+                getLog().warn("can't use artifact " + artifact.toString());
+            }
+        }
+        if (classes != null && classes.exists()) {
+            try {
+                urls.add(classes.toURI().toURL());
+            } catch (final MalformedURLException e) {
+                getLog().warn("can't use path " + classes.getAbsolutePath());
+            }
+        }
+        return new URLClassLoader(urls.toArray(new URL[urls.size()]), parent);
+    }
+
+    protected void fixConfig() {
+        if (useOpenEJB) {
+            tomeeGroupId = "org.apache.openejb";
+            tomeeArtifactId = "openejb-standalone";
+            tomeeClassifier = null;
+            tomeeShutdownCommand = "Q";
+            if (8005 == tomeeShutdownPort) { // default admin port
+                tomeeShutdownPort = 4200;
+            }
+            if (tomeeVersion.startsWith("1.")) {
+                tomeeVersion = OpenEjbVersion.get().getVersion();
+            }
+
+            if (catalinaBase.getName().equals("apache-tomee") && catalinaBase.getParentFile().equals(target)) {
+                catalinaBase = new File(target, "apache-openejb");
+            }
+            if (config.getParentFile().getName().equals("tomee") && config.getParentFile().getParentFile().equals(mainDir)) {
+                config = new File(mainDir, "openejb/conf");
+            }
+            if (lib.getParentFile().getName().equals("tomee") && lib.getParentFile().getParentFile().equals(mainDir)) {
+                lib = new File(mainDir, "openejb/lib");
+            }
+            if (bin.getParentFile().getName().equals("tomee") && bin.getParentFile().getParentFile().equals(mainDir)) {
+                bin = new File(mainDir, "openejb/bin");
+            }
+        }
+    }
+
+    protected String getAdditionalClasspath() {
+        if (!classpaths.isEmpty()) {
+            final StringBuilder cpBuilder = new StringBuilder();
+            for (final String cp : classpaths) {
+                cpBuilder.append(cp);
+                cpBuilder.append(File.pathSeparatorChar);
+            }
+            return cpBuilder.substring(0, cpBuilder.length() - 1); // Dump the final path separator
+        }
+        return null;
+    }
+
+    private List<String> webappsAlreadyAdded() {
+        final List<String> list = new ArrayList<String>();
+        final File webapps = new File(catalinaBase, webappDir);
+        if (webapps.exists() && webapps.isDirectory()) {
+            final File[] files = webapps.listFiles();
+            if (files != null) {
+                for (final File f : files) {
+                    list.add(f.getName());
+                }
+            }
+        }
+        return list;
+    }
+
+    private void activateSimpleLog() {
+        // replacing java.util.logging.SimpleFormatter by SimpleTomEEFormatter
+        final File loggingProperties = new File(catalinaBase, "conf/logging.properties");
+        if (loggingProperties.exists() && !new File(config, "conf/logging.properties").exists()) {
+            try {
+                String content = IO.slurp(loggingProperties);
+                if (!content.contains("java.util.logging.ConsoleHandler.formatter")) {
+                    content += System.getProperty("line.separator") + "java.util.logging.ConsoleHandler.formatter = org.apache.tomee.jul.formatter.SimpleTomEEFormatter";
+                } else {
+                    content = content.replace(SimpleFormatter.class.getName(), "org.apache.tomee.jul.formatter.SimpleTomEEFormatter");
+                }
+
+                doWrite(loggingProperties, content);
+            } catch (final Exception e) {
+                getLog().error("Can't set SimpleTomEEFormatter", e);
+            }
+        }
+    }
+
+    private void removeDefaultWebapps(final boolean removeTomee, final Collection<String> providedWebapps) {
+        final File webapps = new File(catalinaBase, webappDir);
+        if (webapps.isDirectory()) {
+            final File[] files = webapps.listFiles();
+            if (null != files) {
+                for (final File webapp : files) {
+                    final String name = webapp.getName();
+                    if (webapp.isDirectory() && !providedWebapps.contains(name) && (removeTomee || !name.equals("tomee"))) {
+                        try {
+                            deleteDirectory(webapp);
+                        } catch (final IOException ignored) {
+                            // no-op
+                        }
+                    }
+                }
+            }
+        }
+
+        getLog().info("Removed not mandatory default webapps");
+    }
+
+    private void copyLibs(final List<String> files, final File destParent, final String defaultType) {
+        if (files == null || files.isEmpty()) {
+            return;
+        }
+
+        if (!destParent.exists() && !destParent.mkdirs()) {
+            getLog().warn("can't create '" + destParent.getPath() + "'");
+        }
+
+        for (final String file : files) {
+            updateLib(file, destParent, defaultType);
+        }
+    }
+
+    private void updateLib(final String rawLib, final File destParent, final String defaultType) {
+        InputStream is = null;
+        OutputStream os = null;
+
+        // special hook to get more info
+        String lib = rawLib;
+        String extractedName = null;
+        if (lib.contains(NAME_STR)) {
+            lib = lib.substring(0, rawLib.indexOf(NAME_STR));
+            extractedName = rawLib.substring(rawLib.indexOf(NAME_STR) + NAME_STR.length(), rawLib.length());
+            if (!extractedName.endsWith(".jar") && !extractedName.endsWith(".war")
+                    && !extractedName.endsWith(".ear") && !extractedName.endsWith(".rar")) {
+                extractedName = extractedName + "." + defaultType;
+            }
+        }
+
+        boolean unzip = false;
+        if (lib.startsWith(UNZIP_PREFIX)) {
+            lib = lib.substring(UNZIP_PREFIX.length());
+            unzip = true;
+        }
+
+        if (lib.startsWith(REMOVE_PREFIX)) {
+            final String prefix = lib.substring(REMOVE_PREFIX.length());
+            final File[] files = destParent.listFiles(new FilenameFilter() {
+                @Override
+                public boolean accept(final File dir, final String name) {
+                    return name.startsWith(prefix);
+                }
+            });
+            if (files != null) {
+                for (final File file : files) {
+                    if (!IO.delete(file)) {
+                        file.deleteOnExit();
+                    }
+                    getLog().info("Deleted " + file.getPath());
+                }
+            }
+        } else {
+            try {
+                final File file = mvnToFile(lib, defaultType);
+                if (!unzip) {
+                    final File dest;
+                    if (extractedName == null) {
+                        dest = new File(destParent, file.getName());
+                    } else {
+                        dest = new File(destParent, extractedName);
+                    }
+
+                    is = new BufferedInputStream(new FileInputStream(file));
+                    os = new BufferedOutputStream(new FileOutputStream(dest));
+                    copy(is, os);
+
+                    getLog().info("Copied '" + lib + "' in '" + dest.getAbsolutePath());
+                } else {
+                    Zips.unzip(file, destParent, true);
+
+                    getLog().info("Unzipped '" + lib + "' in '" + destParent.getAbsolutePath());
+                }
+            } catch (final Exception e) {
+                getLog().error(e.getMessage(), e);
+                throw new TomEEException(e.getMessage(), e);
+            } finally {
+                close(is);
+                close(os);
+            }
+        }
+    }
+
+    private File mvnToFile(final String lib, final String defaultType) throws ArtifactResolutionException, ArtifactNotFoundException {
+        final String[] infos = lib.split(":");
+        final String classifier;
+        final String type;
+        if (infos.length < 3) {
+            throw new TomEEException("format for librairies should be <groupId>:<artifactId>:<version>[:<type>[:<classifier>]]");
+        }
+        if (infos.length >= 4) {
+            type = infos[3];
+        } else {
+            type = defaultType;
+        }
+        if (infos.length == 5) {
+            classifier = infos[4];
+        } else {
+            classifier = null;
+        }
+
+        final Artifact artifact = factory.createDependencyArtifact(infos[0], infos[1], createFromVersion(infos[2]), type, classifier, SCOPE_COMPILE);
+        resolver.resolve(artifact, remoteRepos, local);
+        return artifact.getFile();
+    }
+
+    private void copyWar() {
+        if ("pom".equals(packaging)) {
+            return;
+        }
+
+        final boolean war = "war".equals(packaging);
+        final String name = destinationName();
+        final File out;
+        if (war) {
+            out = new File(catalinaBase, webappDir + "/" + name);
+        } else {
+            final File parent = new File(catalinaBase, appDir);
+            if (!parent.exists() && !parent.mkdirs()) {
+                getLog().warn("can't create '" + parent.getPath() + "'");
+            }
+            out = new File(parent, name);
+        }
+        delete(out);
+        if (!warFile.isDirectory() && name.endsWith("." + packaging)) {
+            final String dir = name.substring(0, name.lastIndexOf('.'));
+            final File unpacked;
+            if (war) {
+                unpacked = new File(catalinaBase, webappDir + "/" + dir);
+            } else {
+                unpacked = new File(catalinaBase, appDir + "/" + dir);
+            }
+            delete(unpacked);
+        }
+
+        if (warFile.exists() && warFile.isDirectory()) {
+            try {
+                IO.copyDirectory(warFile, out);
+            } catch (final IOException e) {
+                throw new TomEEException(e.getMessage(), e);
+            }
+        } else if (warFile.exists()) {
+            InputStream is = null;
+            OutputStream os = null;
+            try {
+                is = new FileInputStream(warFile);
+                os = new FileOutputStream(out);
+                copy(is, os);
+
+                getLog().info("Installed '" + warFile.getAbsolutePath() + "' in " + out.getAbsolutePath());
+            } catch (final Exception e) {
+                throw new TomEEException(e.getMessage(), e);
+            } finally {
+                close(is);
+                close(os);
+            }
+        } else {
+            getLog().warn("'" + warFile + "' doesn't exist, ignoring (maybe run mvn package before this plugin)");
+        }
+
+        deployedFile = out;
+    }
+
+    protected String destinationName() {
+        if (context != null) {
+            if (!context.contains(".") && !warFile.isDirectory()) {
+                return context + "." + packaging;
+            }
+            return context;
+        }
+        return warFile.getName();
+    }
+
+    private void overrideAddresses() {
+        final File serverXml = new File(catalinaBase, "conf/server.xml");
+        if (!serverXml.exists()) { // openejb
+            return;
+        }
+
+        final QuickServerXmlParser parser = QuickServerXmlParser.parse(serverXml);
+
+        String value = read(serverXml);
+
+        File keystoreFile = new File(parser.keystore());
+
+        if (!keystoreFile.exists()) {
+            keystoreFile = new File(System.getProperty("user.home"), ".keystore");
+        }
+
+        if (!keystoreFile.exists()) {
+            keystoreFile = new File("target", ".keystore");
+        }
+
+        final String keystoreFilePath = (keystoreFile.exists() ? keystoreFile.getAbsolutePath() : "");
+
+
+        if (tomeeHttpsPort != null && tomeeHttpsPort > 0 && parser.value("HTTPS", null) == null) {
+            // ensure connector is not commented
+            value = value.replace("<Service name=\"Catalina\">", "<Service name=\"Catalina\">\n"
+                    + "    <Connector port=\"" + tomeeHttpsPort + "\" protocol=\"HTTP/1.1\" SSLEnabled=\"true\"\n" +
+                    "                scheme=\"https\" secure=\"true\"\n" +
+                    "                clientAuth=\"false\" sslProtocol=\"TLS\" keystoreFile=\"" + keystoreFilePath + "\" />\n");
+        }
+
+        if (tomeeHttpsPort == null) {
+            // avoid NPE
+            tomeeHttpsPort = 8443;
+        }
+
+        FileWriter writer = null;
+        try {
+            writer = new FileWriter(serverXml);
+            writer.write(value
+                    .replace(parser.http(), Integer.toString(this.getTomeeHttpPortChecked()))
+                    .replace(parser.https(), Integer.toString(this.getTomeeHttpsPortChecked()))
+                    .replace(parser.ajp(), Integer.toString(tomeeAjpPort))
+                    .replace(parser.stop(), Integer.toString(this.getTomeeShutdownPortChecked()))
+                    .replace(parser.host(), tomeeHost)
+                    .replace(parser.appBase(), webappDir));
+        } catch (final IOException e) {
+            throw new TomEEException(e.getMessage(), e);
+        } finally {
+            close(writer);
+        }
+    }
+
+    private static String read(final File file) {
+        FileInputStream in = null;
+        try {
+            in = new FileInputStream(file);
+            final StringBuilder sb = new StringBuilder();
+            int i = in.read();
+            while (i != -1) {
+                sb.append((char) i);
+                i = in.read();
+            }
+            return sb.toString();
+        } catch (final Exception e) {
+            throw new TomEEException(e.getMessage(), e);
+        } finally {
+            close(in);
+        }
+    }
+
+    private Collection<File> overrideConf(final File dir, final String baseDir) {
+        if (!dir.exists()) {
+            return Collections.emptyList();
+        }
+
+        final File[] files = dir.listFiles();
+        if (files != null) {
+            final Collection<File> copied = new ArrayList<File>();
+            for (final File f : files) {
+                if (f.isHidden()) {
+                    continue;
+                }
+
+                final String file = baseDir + "/" + f.getName();
+                final File destination = new File(catalinaBase, file);
+                if (f.isDirectory()) {
+                    Files.mkdirs(destination);
+                    try {
+                        IO.copyDirectory(f, destination);
+                    } catch (final IOException e) {
+                        throw new TomEEException(e.getMessage(), e);
+                    }
+                } else {
+                    InputStream in = null;
+                    OutputStream out = null;
+                    try {
+                        in = new FileInputStream(f);
+                        out = new FileOutputStream(destination);
+                        co

<TRUNCATED>